Django的路由系统

Django的路由系统

一、前言

URLconf是什么?

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。

你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

 

Django的大致工作流程

 

1、客户端发送请求(get/post)经过web服务器、Django中间件、 到达路由分配系统 
2、路由分配系统根据提取 request中携带的的url路径(path)与视图函数映射关系列表中,匹配到1个视图函数,foo(request)执行;

 

3、视图函数 使用原生SQL或者ORM去数据库拿到数据,在服务端进行渲染(模板+数据渲染)

 

4、视图函数return一个 response对象 返回客户端

Django路由分配系统简介

Django project目录中的urls.py文件中, 以Python [ (   )  ]的数据类型记录了可以访问到该站点的url 和 视图函数一一对应关系表,当request请求到达路由系统,Django通过request中携带的path 遍历这个关系表,匹配到对应的视图函数,break;(所以1个 url 只能从路由关系表中自上而下匹配到1个视图函数)

二、URLconf配置

基本格式:

 

from django.urls import path,re_path


urlpatterns = [
  path('login/',views.login,name="login"),
  re_path('blog/(\d{4})/{\d{1,2}}/',views.blog_list),                                 #按照顺序传参           
  re_path('blog/(?P<year>\d{4})/(?P<month>\d{1,2})/',views.blog_list,{"name":"yanlin"},name="blog_list"),  #按照关键字传参
] 

参数说明:

  • 正则表达式:一个正则表达式字符串(route)
  • views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串(view)
  • 参数:可选的要传递给视图函数的默认参数(字典形式)(kwargs)
  • 别名:一个可选的name参数(反向解析   防止写死)(name)

函数 path() 具有四个参数,两个必须参数:route 和 view,两个可选参数:kwargs 和 name。即路由和视图是必填参数。

 

1、path()参数:route
    route 是一个匹配URL的准则(类似正则表达式)。当Django响应一个请求时,它会从urlpatterns的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。
    这些准则不会匹配GET和POST参数或域名。例如,URLconf在处理请求https://www.example.com/myapp/时,它会尝试匹配myapp/。处理请求https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。
2、path()参数:view
    当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个HttpRequest对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。
3、path()参数:kwargs
    任意个关键字参数可以作为一个字典传递给目标视图函数。
4、path()参数:name
    为你的URL取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个URL模式。

 

  参考文档:https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial01/

 三、path和re_path

path():

path中,第一个参数route使用的是非正则表达式可以表示的普通路由路径。

注意:

  • 要从URL捕获值,请使用尖括号。
  • 捕获的值可以选择包括转换器类型。例如,用于 <int:name>捕获整数参数。如果未包含转换器/,则匹配除字符之外的任何字符串。
  • 没有必要添加前导斜杠,因为每个URL都有。例如,它articles不是/articles

默认情况下,以下路径转换器可用:

  • str- 匹配除路径分隔符之外的任何非空字符串'/'。如果转换器未包含在表达式中,则这是默认值。
  • int - 匹配零或任何正整数。返回一个int
  • slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site
  • uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
  • path- 匹配任何非空字符串,包括路径分隔符 '/'。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str

 

比如要匹配一个视图中的函数路由,该函数有两个形参:

def peopleList(request,book_id)

第一个request是默认的,那么路径自动匹配该函数的第二个形参,匹配格式:<int:book_id>,并返回一个正整数或零值。

urlpatterns = [


    path(<int:book_id>/',views.peopleList,name="peopleList"),

]

  

re_path():

而如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。

from django.urls import re_path     # include总路由设置

  

在Python正则表达式中,命名正则表达式组的语法是:(?P<name>...)

                    (?P<name>...):命名组,通过组的名字(name)即可访问到子组匹配的字符串

from django.urls import re_path


urlpatterns = [
  re_path('blog/(\d{4})/{\d{1,2}}/',views.blog_list),   #按照顺序传参  \d 表示数字, {4}表示4位数  {1,2}表示一位数或两位数           
  re_path('blog/(?P<year>\d{4})/(?P<month>\d{1,2})/',views.blog_list,{"name":"LeBron james"},name="blog_list"),  #按照关键字传参
] 

这样也是可以匹配到views视图中的blog_list函数的形参的。

所以这两种使用方式在使用上根据实际情况自行使用。

 

 include总路由设置(命名空间模式):

    即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL

    在总的项目文件夹下,urls.py一般这样设置:(因为每个app里面都会有很多的路由,这样分类比较方便)

 

from django.contrib import admin
from django.urls import path,re_path,include
from app01 import urls as app01_urls
from app02 import urls as app02_urls

urlpatterns = [
    path('app01/', include(app01_urls,namespace='app01')),
    path('app02/', include(app02_urls,namespace='app02')),
]

 

  然后再app01中urls.py中设置: 

from django.urls import path, re_path
from app01 import views as app01_views
app_name = "app01"
urlpatterns = [
    re_path('blog/(?P<year>\d{4})/(?P<month>\d{1,2})/', app01_views.blog_list,name="blog_list"),
]

 然后再app02中urls.py中设置:

from django.urls import path, re_path
from app02 import views as app02_views
app_name = "app02"
urlpatterns = [
    re_path('blog/(?P<year>\d{4})/(?P<month>\d{1,2})/', app02_views.blog_list,name="blog_list"),
]

  

templates里的写法:

{% url 'app01:login' %}

views里的写法:

return redirect(reverse('app01:student_list'))

网址/URL规则命名(反向解析) URL的正则表达式起别名

所有URL/网址写死的地方都要用反向解析

templates里面的写法

​ {% url '别名写这里' %}

Views里的写法:

​ from django.urls import reverse

​ reverse("别名", args=(1,2))

namespace (命名空间)

 https://www.cnblogs.com/pywjh/p/10143250.html

posted @ 2019-06-20 13:19  HelloBaby!  阅读(197)  评论(0编辑  收藏  举报