自学Python之路-django路由
1 Django 如何处理一个请求?
当一个用户请求 Django 站点的一个页面,Django 系统决定执行哪个 Python 代码使用的算法:
1. Django加载URLconf模块。如果没有传入HttpRequest 对象,Django使用根URLconf模块,即默认显示一个小火箭。否则进入以下第2步。
2. Django加载Python代码,URLconf寻找可用的urlpatterns 。urlpatterns是django.urls.path() 和(或) django.urls.re_path() 实例的序列(sequence)。
3. Django按顺序遍历每个urlpatterns,然后在所请求的URL匹配到第一个模式后停止,并与path_info 匹配。
4. 一旦有URL匹配成功,Djagno导入并调用相关的视图。视图会获得如下参数:
- 4.1 一个 HttpRequest 实例。
- 4.2 如果匹配的URL包含未命名组,则使用正则表达式的匹配项作为位置参数。
- 4.3 关键字参数由路径表达式匹配的任何命名部分组成,并由django.urls.path() 或django.urls.re_path() 的可选 kwargs参数中指定的任何参数覆盖。
5. 如果没有URL被匹配,或者匹配过程中出现了异常,Django调用一个适当的错误处理视图。
2 URLconf在查找什么?
请求的URL被看做是一个普通的Python 字符串, URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。
例如, https://www.example.com/myapp/ 请求中,URLconf 将查找 myapp/ https://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 myapp/ 。
**URLconf 不检查使用了哪种请求方法。**换句话讲,所有的请求方法 —— 即,对同一个URL的无论是 POST请求 、 GET请求 、或 HEAD 请求方法等等 —— 都将路由到相同的函数。
一个完整的路由包含:路由地址、视图函数(或者视图类)、可选变量和路由命名。
3 初始路由
- 路由称为URL,是对可以从互联网上得到的资源位置和访问方法的一种简洁的表示,是互联网标准资源的地址。互联网上的每个文件都有一个唯一的路由,用于指出网络文件的路径位置。简单说,路由可视为我们常说的网址,每个网址代表不同的网页。
- URL是网站Web服务的入口。用户在浏览器中输入URL发出请求之后,后端的Django应用会在路由系统中根据URL查找并运行对应的视图函数,然后返回信息到浏览器中。Django的路由系统也被称为URL conf,这反映了URL和视图函数的映射关系:遇到某个URL就执行对应的视图函数。
Django2.X路由设计模式,工作原理如下:
- 运行MyDjango项目时,Django从MyDjango文件夹的urls.py找到各个App所定义的路由信息,生成完整的路由列表。
- 当用户在浏览器上访问某个路由地址时,Django就会收到该用户的请求信息。
- Django从当前请求信息获取路由地址,并在urls.py路由列表里匹配相应的路由信息,再执行路由信息所指向的视图函数(或视图类),然后返回HTML响应或404未找到的错误(如果找不到),从而完成整个请求响应过程。
4 路由基本配置urls.py
MyDjango文件夹的urls.py代码如下:
from django.contrib import admin from django.urls import path,include from app import views urlpatterns = [ path('index/',views.index), # 访问路由,制定视图函数 path('index/',views.index,name='index'), # 第二种写法,推荐这种 path('admin/',admin.site.urls), # admin模块下的路由配置
以上MyDjango文件夹的urls.py定义两条路由信息:
- Admin站点管理,Admin站点管理在创建项目时已自动生成,一般情况下无需修改;
- 首页地址(index),是指index文件夹的urls.py。
urls.py的代码解释
- from django.contrib import admin:导入内置Admin功能模块。
- from django.urls import path,include:导入Django的路由函数模块。
- urlpatterns:代表整个项目的路由集合,以列表格式表示,每个元素代表一条路由信息。
- path(‘admin/’,admin.site.urls):设定Admin的路由信息。'admin/'代表127.0.0.1:8000/admin的路由地址,admin后面的斜杠是路径分隔符,其作用等同于计算机中文件目录的斜杆符号;admin.site.urls指向内置Admin功能所自定义的路由信息。
- path('index/',views.index) :访问路由,指定视图函数。一个path()函数对应一条路由规则。path函数定义的,该函数第一个参数是路由地址,第二个参数是路由所对应的处理函数。当用户请求"index/"这个URL的时候,通过配置项找到app应用下面view.py中对应的视图函数index()执行并返回结果。
path('index/',views.index)的views.index是指视图函数index处理网站首页的用户请求和响应过程。因此,在index的views.py中编写index函数的处理过程,代码如下:
from django.shortcuts import render def index(request):
return render(request,"index.html",context={'title':'django','name':'china'})
index函数必须设置一个参数,参数命名不固定,但常以request进行命名,代表当前用户的请求对象,该对象包含当前请求的用户名、请求内容和请求方式等。
视图函数执行完成后必须使用return将处理结果返回,否则程序会抛出异常信息。启动MyDjango项目,在浏览器里访问即可。
5 子路由导入
导入其他url/子路由配置:在应用中创建urls.py文件,编写匹配规则,在工程MyDjango的的urls.py中进行导入包含include即可
from django.urls import include urlpatterns = [
path(‘xxx/’,include(‘App.urls’))
]
Django检查url模式之前会移除模式前的/,所有url模式前面的/可以不写,但如果在地址栏里请求的时候不带/,则会引起重定向,重定向会到/的地址,所以请求的时候要带/ 。

但,如果在根目录里面没有 / ,运行将报错:
6 path()方法函数
path 函数在 Django中的的定义如下所示:
path(route,view,kwargs,name)
它可以接收 4 个参数,其中前两个是必填参数后两个为可选参数。参数解析如下:
- 模式串route:是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项,然后执行该项映射的视图函数或者 include 函数分发的下级路由,因此,url 路由的编写在 Django中十分的重要!
- 视图函数view:指的是处理当前 url 请求的视图函数。当 Django 匹配到某个路由条目时,自动将封装的 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式,传递给该条目指定的视图函数。
- kwargs :指使用字典关键字传参的形式给关联的目标视图函数传递参数。
- 名称name: 给 URL 起个别名,常用于 url 的反向解析,避免在模板中适应硬编码的方式使用嵌入 url。
path的模式串
path中的模式串是一个普通字符串,用于匹配用户的请求路径。
如果path中模式串如果不能满足你路由规则,还可以使用re_path对象,re_path对象中模式串是正则表达式,其他三个参数和path对象一致。
re_path对象包含了一个 ^ 和一个 $ ,这些都是正则符号。 ^ 表示从字符串开始匹配 ,$ 表示匹配字符串的结尾,这两个符号和到一起就表示模式必须完全匹配路径,而不是包含一部分。
模式匹配的时候要注意:
- Django从上往下进行匹配,一旦匹配成功就不会往下继续匹配了
- 一个视图函数可以有多个模式匹配
- 模式前面不需要加/
- 如果匹配不上,则会引起异常,Django会调用错误处理视图处理 (关闭调试模式)
7 路径转换器Path converters(带参数的路由)
路径转换器可以是以下类型:
- str - 匹配除 ‘/’ 之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。
- int - 匹配 0 或任何正整数。返回一个 int 。
- slug - 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签字符串。
- path - 匹配非空字符串,包括路径分隔符 ‘/’ 。
- uuid - 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。
urlpatterns = [ # 首页(无路径转换器) path('',views.index,name='index'), # int path('show/<int:age>/',views.show,name='show') , # slug path('list/<slug:name>/',views.list_user,name='list') , # path, 如果有多个参数,path路径转换器必须在最后一个 path('access/<path:path>/',views.access,name='access')
测试,运行结果如下:
8 re_path() 正则表达式regular expressions
如果path()路径和转换器语法不能很好的定义你的 URL 模式,你可以可以使用正则表达式 re_path() 。
8.1 在 Python 正则表达式中,命名的正则表达式组的语法是 (?P<name>pattern) ,匹配pattern并捕获结果,设置name为组名,其中 **name 是组名,pattern 是要匹配的模式**。
1、第一步要导入from django.urls import re_path
2、命名的正则表达式组的写法(?P<name>pattern),P要大写,否则报错
3、urls.py和views.py的参数name组名要保持一致,否则报错
参数嵌套之后,形成内部参数、外部参数之分
- '^comments/(?:page-(?P<page_number>\d+)/)?$',则外面的(?:page-内部参数/)为外部参数,里面的(?P<page_number>\d+)为内部参数
- 参数,有捕获参数、非捕获参数之分
- (?:pattern)或(pattern),匹配pattern但不捕获匹配结果。
- (?P<name> pattern) ,匹配pattern并捕获匹配结果,设置name为组名
8.2 在 Python 正则表达式中,未命名的正则表达式组
例如(?P<year>[0-9]{4}) ,或使用更短的未命名组,例如([0-9]{4})。
与命名的正则表达式组的区别是没有name。
当混杂命名正则和未命名正则两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。
- 不是特别推荐未命名的正则,因为它会更容易在匹配的预期含义和视图参数之间引发错误。
- 在任何情况下,推荐在给定的正则表达式里只使用一个样式。当混杂命名正则和未命名正则两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。
......
作者:CARLOS_CHIANG
出处:http://www.cnblogs.com/yaoyaojcy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
posted on 2023-02-22 11:29 CARLOS_KONG 阅读(132) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!