繁体   English   中英

Django URL 逻辑或被误解

[英]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),
]

我应该同时渲染

http://127.0.0.1:8000/自述文件

http://127.0.0.1:8000/帮助

到相同的观点。 但是在我的浏览器中输入 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).

您正在使用捕获组并将其作为第一项传递,因此它将传递一个字符串readmehelp ,因此您可以使用:

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,但您已经声明了一个。 另一个参数将是您的readmehelp

所以为了解决它,你可以使用*args

def readme(request, *args, **kwargs):
    return HttpResponse('My test', content_type='text/plain')

或者,如果您想要readmehelp ,您可以将其作为参数:

def readme(request, selected_url):
    return HttpResponse('My test', content_type='text/plain')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM