[英]Django URL logical OR misunderstood
我需要我的 django 应用程序将两个不同的 URL 连接到同一个视图。 当我使用正则表达式时,结果与我预期的不同:
from django.http import HttpResponse
from django.urls import re_path
def readme(request):
return HttpResponse('My test', content_type='text/plain')
urlpatterns = [
re_path(r'^(readme|help)$', readme),
]
我应该同时渲染
到相同的观点。 但是在我的浏览器中输入 URL 时收到以下错误:
Exception Value: readme() takes 1 positional argument but 2 were given
Exception Location: /home/ar/.local/lib/python3.8/site-packages/django/core/handlers/base.py, line 197, in _get_response
191 if response is None:
192 wrapped_callback = self.make_view_atomic(callback)
193 # If it is an asynchronous view, run it in a subthread.
194 if asyncio.iscoroutinefunction(wrapped_callback):
195 wrapped_callback = async_to_sync(wrapped_callback)
196 try:
197 response = wrapped_callback(request, *callback_args, **callback_kwargs)
198 except Exception as e:
199 response = self.process_exception_by_middleware(e, request)
200 if response is None:
201 raise
202
203 # Complain if the view returned None (a common error).
您正在使用捕获组并将其作为第一项传递,因此它将传递一个字符串readme
或help
,因此您可以使用:
def readme(request, item):
# item will be 'readme' or 'help'
return HttpResponse('My test', content_type='text/plain')
urlpatterns = [
re_path(r'^(readme|help)/$', readme),
]
然而,只定义两条路径更优雅:
def readme(request): # 🖘 no item
return HttpResponse('My test', content_type='text/plain')
urlpatterns = [
path('readme/', readme),
path('help/', readme),
]
虽然不是无效的,但通常使用两条路径指向同一个“资源”并不是好的设计。 通常您希望两条不同的路径指向不同的信息。
或者,如果您想将它与可选参数一起使用:
def readme(request, lang):
# …
pass
inner_urls = [path('readme/', readme), path('help/', readme)]
urlpatterns = [
path('/', include(inner_urls), kwargs={'lang': None}),
re_path(r'^(?P<lang>en)/$', include(inner_urls)),
]
这会将en
传递给lang
,如果没有被“选中”,则传递给None
。
然而,如果你想选择一种语言,你可能想使用i18n_patterns(…)
[Django-doc] ,这是 Django 的多语言站点国际化解决方案。
正如错误消息所说,视图需要 2 arguments,但您已经声明了一个。 另一个参数将是您的readme
或help
。
所以为了解决它,你可以使用*args
:
def readme(request, *args, **kwargs):
return HttpResponse('My test', content_type='text/plain')
或者,如果您想要readme
或help
,您可以将其作为参数:
def readme(request, selected_url):
return HttpResponse('My test', content_type='text/plain')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.