引发 404 并继续 URL 链

Posted

技术标签:

【中文标题】引发 404 并继续 URL 链【英文标题】:Raise 404 and continue the URL chain 【发布时间】:2010-11-20 22:41:23 【问题描述】:

我有一个这样的 URL 模式:

urlpatterns = (
    url(r'^$', list_titles, name='list'),
    url(r'^(?P<tag>[a-z\-0-9]+?)/$', list_titles, name='filtered-list'),
    url(r'^(?P<title>\S+?)/$', show_title, name='title'),
)

filtered-listtitle 匹配相同的东西。

如果在filtered-list 中有与tag 匹配的可用列表,我希望list_titles 启动。但是,如果没有匹配的 tag,我想将其冒泡回 URL 处理器,以便 show_title 触发。

如果没有匹配的标题,我会在那里提出适当的 404。

我知道我可以从视图内部执行此操作...但是必须将过程硬连接到视图中有点臭。我希望 URL 顺序来决定首先选择什么以及它交给什么。

【问题讨论】:

【参考方案1】:

这当然是视图逻辑;所有 urls.py 用于匹配 URL 模式,不执行验证。您可以使用Http404 异常来处理此问题。

from django.http import Http404

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_response('polls/detail.html', 'poll': p)

或者,您可能会发现 get_object_or_404get_list_or_404 方法,它们会缩短一点。


承诺的编辑如下。不完全是您要找的东西,但是...

urlpatterns = (
    url(r'^$', list_titles, name='list'),
)

if 1=1: # Your logic here
    urlpatterns += ( url(r'^$', list_titles, name='list'), )

urlpatterns += (
    url(r'^(?P<title>\S+?)/$', show_title, name='title'),
    url(r'^spam/$', spam_bar),
    url(r'^foo/$', foo_bar),

【讨论】:

感谢 get_list_or_404 但这不是我问题的答案。我的意思是,如果我无法根据 URL 获得标题列表,我希望通过其余 URL 重新评估 URL。 嗯...我明白了。你原来的问题不是很清楚。请记住,urls.py 只是 Python 代码,因此您可以在那里进行某种验证。给我一分钟,我会修改我的答案。 raise Http404 应该是raise Http404(): docs.djangoproject.com/en/2.0/topics/http/views/… 我知道这个答案已经很老了,但是if 1=1 只是用力地抚摸我。在很多层面上都是错误的。 这不是一个有效的答案。引发 Http404 后,URL 查找不会继续

以上是关于引发 404 并继续 URL 链的主要内容,如果未能解决你的问题,请参考以下文章

Azure Bot服务Facebook Messenger回调URL提供404

解析 404 url​​ 并使用 nginx 重定向

使用 mechanize 绕过 404

Bing 地图 url 不下载图块并引发安全异常

删除 404 重定向上的所有 url 参数

为什么更改控制器参数会引发http Post 404错误?