如何查看是否存在基于URL的视图函数

时间:2018-10-29 17:36:50

标签: python django

我正在尝试给django一个url并将其解析为一个视图。例如:

>>> reverse('login')
'/login/'
>>> reverse('/login/')
  

回溯(最近通话最近):     文件“”,第1行,位于     文件“ /Users/david/Desktop/V/lib/python3.6/site-packages/django/urls/base.py”,第90行,反过来       返回iri_to_uri(resolver._reverse_with_prefix(视图,前缀,* args,** kwargs))     _reverse_with_prefix中的文件“ /Users/david/Desktop/V/lib/python3.6/site-packages/django/urls/resolvers.py”,第622行       提高NoReverseMatch(msg)

还有另一种方法吗?还是我可以为其传递URL的django方法(这些将是“肮脏的” URL,例如“ https://example.com/login/?next=/myaccount/”),并将其解析为正确的视图?

1 个答案:

答案 0 :(得分:3)

redirect模块中,django.urls的相反是resolve [Django-doc]

  

resolve()函数可用于解析指向   相应的视图功能。它具有以下签名:

     

resolve(path, urlconf=None)

     

path是您要解析的URL路径。与reverse()一样,您   无需担心urlconf参数。功能   返回ResolverMatch对象,该对象允许您访问各种   有关解析的URL的元数据。

例如:

>>> from django.urls import resolve
>>> resolve('/admin/')
ResolverMatch(func=django.contrib.admin.sites.index, args=(), kwargs={}, url_name=index, app_names=['admin'], namespaces=['admin'])

因此,它返回一个ResolverMatch,其中包含将与位置和命名参数一起调用的“ view”函数,以及有关名称空间,应用程序名称等的信息。

对于无法解析的URL,将引发django.urls.exceptions.Resolver404错误。

请注意,查询字符串不是path的一部分。您可以使用以下方法提取路径:

>>> from urllib.parse import urlparse
>>> urlparse('/login/?next=a')
ParseResult(scheme='', netloc='', path='/login/', params='', query='next=a', fragment='')

因此只有path='...'部分(可以通过获取.path属性来获取)将确定视图函数,查询字符串作为带有{{1}的类似字典的对象传递给视图}。