본문 바로가기

Study

🔫 Django reverse()와 resolve()

반응형

📣 본문은 2019년 10월 11일 작성한 글입니다.

reverse()

python 코드 안에서 URL 템플릿 태그와 비슷하게 동작하는 기능이다.

from news import views

path('archive/', views.archive, name='news-archive')

urls.py에서 설정한 URL의 name이나, viewname을 통해서 다시 URL로 되돌릴 수 있다.

# name 사용 시
reverse('news-archive')

# viewname 사용 시
from news import views
reverse(views.archive)

인수가 있는 URL이라면 다음과 같이 args를 포함할 수 있다.

from django.urls import reverse

def myview(request):
    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

kwargs로 전달하는 것 또한 가능하다. 하지만 args와 kwargs를 동시에 전달할 수는 없다.

>>> reverse('admin:app_list', kwargs={'app_label': 'auth'})
'/admin/auth/'

일치하는 URL이 없으면 NoReverseMatch가 발생한다.

resolve()

reverse()와는 반대되는 기능을 한다. ResolverMatch 객체의 url_name을 통해 해당 URL path와 일치하는 이름을 받을 수 있다.

match = resolve('/some/path/')
print(match.url_name)

ResolverMatch 클래스에는 url_name 이외에도 많은 메소드가 있다. (하위 링크 참고)

이러한 메소드를 이용해 resolve() 함수를 이용해서 view에서 오류가 발생하는지 테스트해볼 수 있다.

from urllib.parse import urlparse
from django.urls import resolve
from django.http import Http404, HttpResponseRedirect

def myview(request):
    next = request.META.get('HTTP_REFERER', None) or '/'
    response = HttpResponseRedirect(next)

    view, args, kwargs = resolve(urlparse(next)[2])
    kwargs['request'] = request
    try:
        view(*args, **kwargs)
    except Http404:
        return HttpResponseRedirect('/')
    return response

위 코드는 URL 패턴과 일치하는 view를 실행해서 오류가 나면 Http404 에러를 발생시키는 코드이다.

반응형

'Study' 카테고리의 다른 글

🔫 클래스 기반 뷰의 모범적인 이용  (0) 2022.07.05
🐍 Python Walrus Operator  (0) 2022.07.05
🔍 Django에서 단위 테스트 실행하기  (0) 2022.07.05
🔫 django-crontab 사용하기  (0) 2022.07.05
🔫 Django choices field  (0) 2022.07.05