본문 바로가기
카테고리 없음

장고 닌자 {% url '사용법' %} url 템플릿 (추가로 버전 명시)

by redeyes 2022. 3. 17.

 

https://django-ninja.rest-framework.com/tutorial/operation_params/#url_name

 

Operations parameters - Django Ninja

Operations parameters You can group your API operations using the tags argument (list[str]). @api.get("/hello/") def hello(request, name: str): return {"hello": name} @api.post("/orders/", tags=["orders"]) def create_order(request, order: Order): return {"

django-ninja.rest-framework.com

(https://django-ninja.rest-framework.com/tutorial/versioning/   추가로 버전 명시하는 방법)

 

urlpatterns = [
    path('', views.main, name='main'),
   ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

장고템플릿에서 <a href = "{% url 'main' %}">main으로</a>이런식으로  접근 했다면 

(urlpatterns >> name = 'main'>> reverse() ) 

 

장고 닌자에서 api = NinjaAPI() 를 받아서

api.add_router('/', < import xxx as main_router>)  이런식으로 추가하는데

# version 1.0.0 >> 중요한 변경 / 중간 변경 / 최소 변경
api = NinjaAPI(version="1.0.0", urls_namespace="test_1")

api.add_router("", main_router)

urlpatterns = [
                  path("admin/", admin.site.urls),
                  path("", api.urls),                  
              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns에 추가할 자리가 없다.

 

장고닌자에서는 <a href = "{% url 'main' %}">main으로</a>이런식으로 접근 할 방법이 없나???

 

하고 찾다가

 

맨위의 공식 문서에 방법을 찾았다.

 

 

 

version 속성을 추가할 수 있다.

 

url name 을 여기서 지정 할 수 있다.

 

url_name하고 reverse('xxxx')이부분이 포인트

이미지를 보면 NinjaAPI(version=1.0.0, urls_namespace="test_1") 이렇게 위의 코드처럼 작성할 수 있다.

 

만약에 urls_namespace를 적용하지 않는다면 api 버전을 가리킨다 이때 닌자에 스웨거는 기본적으로 version = 1.0.0

을 가리키고있다 (스웨거 버전이 아니고 내가 만든 api의 버전)

그래서 어떻게 하는가?

 

내가 사용 하려는 (xxxrouter.py) router

 

  • url_name="login"옵션을 추가하고

 

urls.py에 있는 NinjaAPI() 안에

 

  • NinjaAPI(urls_namespace="test")

 

해당 url이 필요한

  • HTML 에 <a href = "{% url 'test:login' %}">로그인 페이지로</a> 이렇게 적용하면

작동한다.

 

from ...xx import account as login_router

# version 1.0.0 >> 중요한 변경 / 중간 변경 / 최소 변경
api = NinjaAPI(version="1.0.0", urls_namespace="test_1")

api.add_router("login/", login_router)

urlpatterns = [
                  path("admin/", admin.site.urls),
                  path("", api.urls),                  
              ]
              
##############################################################              
# xxx.py 라우터 파일

from django.http import HttpRequest
from django.shortcuts import HttpResponse
from ninja import Router
#schema 사용
from ...xxx import LoginResponse

account = Router()

# login page render router
@account.get("/", url_name='login', response=LoginResponse)
def get_login_page(request: HttpRequest) -> HttpResponse:
	pass
로그인 페이지로

 

 

추가 옵션이고 뭐고 그냥 당장 적용하고 싶다.

 

NinjaAPI() 여기에 아무 옵션도 없는 상태일때

 

바로 적용 하고 싶다면

 

해당 라우터에만 

@test.get('/',  url_name='main',xxx....)

 

url_name를 추가하고

 

해당 html 페이지에서 

<a href="{% url 'api-1.0.0:main' %}">main</a>

이렇게 사용하면 된다.

 

 

추가 사용법

NinjaAPI(version = '1.0.2' )

속성을 추가하면 {% url 'api-1.0.2:main' %}

 

NinjaAPI(urls_namespace='a')

속성을 추가하면 {% url 'a:main' %}(두가지 속성을 다 추가해도 이렇게 작성)

 

만약에 NinjaAPI(version = '1.0.2', urls_namespace='a')

{% url 'api-1.0.2:main' %} 이렇게 접근하면 만나 볼수 있는 에러.