自学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。

当混杂命名正则和未命名正则两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。

  • 不是特别推荐未命名的正则,因为它会更容易在匹配的预期含义和视图参数之间引发错误。
  • 在任何情况下,推荐在给定的正则表达式里只使用一个样式。当混杂命名正则和未命名正则两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。

......

 

posted on 2023-02-22 11:29  CARLOS_KONG  阅读(70)  评论(0编辑  收藏  举报

导航