반응형
📣 본문은 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 |