django请求处理中的顺序含义是什么?

时间:2017-12-14 16:03:04

标签: python django python-3.x

概览

考虑以下urls.py:

from django.contrib import admin
from django.urls import re_path, include
from django.conf.urls.static import static
from django.conf import settings

from django.contrib import admin
from django.urls import path

a)
urlpatterns = [
    path('admin/', admin.site.urls),
]

# b)
# urlpatterns = [
#     path('admin/', admin.site.urls),
# ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

print(urlpatterns)

如您所见,我们有2个网址列表,其__str__代表是:

a) [<URLResolver <URLPattern list> (admin:admin) 'admin/'>]
b) [<URLResolver <URLPattern list> (admin:admin) 'admin/'>, <URLPattern '^media\/(?P<path>.*)$'>] 

问题

如果我向localhost:8000提出同样的请求,它会为上述网址列表产生两种不同的结果:

  • 使用a),我会收到200回复​​:

enter image description here

  • 使用b),我会收到404回复:

enter image description here

问题

在阅读"How django processes a request"部分后,我在第3点观察到了这一点:

  

Django按顺序遍历每个URL模式,并在第一个时停止   一个与请求的URL匹配的。

“秩序”的概念在这种情况下意味着什么?

例如,如果我声明了几个列表(b从a扩展),a=[0,1,2,3]; b=a+[4,5,6]然后我做a.index(2)=2, b.index(2)=2,让我给你一个我理解的“订单处理”的类比。 },那种类型的订单处理(线性搜索)就是我在django中所期望的。

所以我很难理解在暴露的情况下如何处理请求。例如,我希望b)中的匹配比a)中的相同(即:b中的响应200相同),而不是a))

那么,有没有人可以解释我在两种情况下如何处理这一特定请求以及为什么a)匹配而b)不是?此外,知道如何以某种方式打印网址尝试的顺序是有帮助的,即使响应是200,这样可以更好地了解这个重要主题。

是的,阅读https://docs.djangoproject.com/en/2.0/ref/urls/#static并没有过多地澄清这个疑问。

1 个答案:

答案 0 :(得分:3)

您正在尝试访问http://localhost:8000/,但目前还没有任何匹配的网址格式。您有一个URL模式适用于Django管理员,您可以在http://localhost:8000/admin/访问它。

当Django找不到匹配的网址格式且您的设置中有DEBUG = True时,您会看到黄色的“未找到的网页”。页。

有几个hardcoded exceptions。如果URL配置为空,或者尚未修改,那么您将获得&#34;祝贺它工作&#34;页面(您的示例A)。

在您的示例B中,您已通过向urlpatterns添加static()来修改http://localhost:8000/。因此,您会看到常规的黄色“未找到页面”。页。

为了使from django.http import HttpResponse def home_view(request): return HttpResponse('home') urlpatterns = [ path('admin/', admin.site.urls), path('', home_view), ] 起作用,您需要添加匹配的网址格式,例如:

urls.py

请注意,在data.frame中添加视图并非如此。我已经完成了这种情况,因此您可以快速添加匹配模式进行测试。