找到你的路。python web框架 Django URLconf路由控制系统如何配置。Django处理浏览器web请求流程

Django URLconf路由配置
Django如何处理http请求
聊URLCONF路由配置之前,先科普下Django是如何http请求的,印证下URL路由有多么重要。
用户请求一个页面时,Django根据下面的逻辑执行操作:
1、加载根URLconf模块,支持自定义。通常情况下,根据settings.py文件中ROOT_URLCONF 参数对应的值决定要使用的根URLconf模块。但是如果传入的HttpRequest对象具有urlconf属性(由中间件设置),则其值将被用于代替ROOT_URLCONF设置。
2、加载该模块并寻找可用的urlpatterns,它是django.urls.path()或者django.urls.re_path()实例的一个列表。
3、依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。
4、导入并调用匹配行中给定的视图,该视图可以是一个简单的Python函数(被称为视图函数),或基于类的视图。 视图将获得如下参数:
一个HttpRequest 实例。
如果匹配的表达式返回了未命名的组,那么匹配的内容将作为位置参数提供给视图。
关键字参数由表达式匹配的命名组组成,但是可以被django.urls.path()的可选参数kwargs覆盖。
如果没有匹配到任何表达式,或者过程中抛出异常,将调用一个适当的错误处理视图,如403、无任何反应等。
URLconf路由配置
URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。
URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下。新建Django项目,默认会在project_name/目录下创建一个urls.py文件,这就是项目的根URL。创建应用程序时默认不会创建,需要的时候自主创建,文件名和内容格式同项目url一致。最简单有效的方法就是直接把项目urls.py文件拷贝至当前应用目录下。
划重点:Django项目的urls.py中针对每个应用分别配置不同的url路径,不同应用的url路径在各自的配置文件中分别配置。
举个栗子
啰啰嗦嗦这么多,现在我们举个栗子验证说明下。分别在pools应用目录下的urls.py和views.py文件增加如下内容。
urls.py
from django.urls import path from . import views urlpatterns=[ path('', views.index, name='index'), # ex: /pools/5/ path('<int:question_id>/', views.detail, name='detail'), # ex: /pools/5/results/ path('<int:question_id>/results/', views.results, name='results'), # ex: /pools/5/vote/ path('<int:question_id>/vote/', views.vote, name='vote'), ]
views.py
from django.shortcuts import render from django.http import HttpResponse from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] output = ', '.join([q.question_text for q in latest_question_list]) return HttpResponse(output) def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
在浏览器中查看“/pools/1/”。Django 将加载mysite.urlsPython 模块,因为它是由设置指向的 ROOT_URLCONF。它找到命名的变量urlpatterns 并按顺序遍历模式。在 找到匹配项后'pools/',它会删除匹配文本 ( "pools/") 并将剩余文本 - "1/"- 发送到“pools.urls”URLconf 以进行进一步处理。在那里它匹配'<int:question_id>/',导致对detail()视图的调用如下:
detail(request=<HttpRequest object>, question_id=1)
该question_id=1部分来自<int:question_id>. 使用尖括号“捕获”部分 URL 并将其作为关键字参数发送到视图函数。字符串的question_id一部分定义了将用于识别匹配模式的名称,该int部分是一个转换器,用于确定哪些模式应该与这部分 URL 路径匹配。冒号 ( :) 分隔转换器和模式名称。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论