Django框架之路由用法

news/2024/10/18 5:54:47/

简介

路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。

Django 路由在 urls.py 配置,urls.py 中的每一条配置对应相应的处理方法。

Django 不同版本 urls.py 配置有点不一样:

1、Django1.1.x 版本

url() 方法:普通路径和正则路径均可使用,需要自己手动添加正则首位限制符号。

?

1

2

3

4

5

6

from django.conf.urls import url # 用 url 需要引入

urlpatterns = [

    url(r'^admin/$', admin.site.urls),

    url(r'^index/$', views.index), # 普通路径

    url(r'^articles/([0-9]{4})/$', views.articles), # 正则路径

]

2、Django 2.2.x 之后的版本

  • path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
  • re_path:用于正则路径,需要自己手动添加正则首位限制符号。

?

1

2

3

4

5

6

from django.urls import re_path # 用re_path 需要引入

urlpatterns = [

    path('admin/', admin.site.urls),

    path('index/', views.index), # 普通路径

    re_path(r'^articles/([0-9]{4})/$', views.articles), # 正则路径

]

总结:Django1.1.x 版本中的 url 和 Django 2.2.x 版本中的 re_path 用法相同。

二、正则路径中的分组

1、正则路径中的无名分组

无名分组按位置传参,一一对应。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致。

urls.py

?

1

2

3

4

urlpatterns = [

    path('admin/', admin.site.urls),

    re_path("^index/([0-9]{4})/$", views.index),

]

views.py

?

1

2

3

4

from django.shortcuts import HttpResponse

def index(request,year):

print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配

return HttpResponse('菜鸟教程')

2、正则路径中的有名分组

语法:

?

1

(?P<组名>正则表达式)

有名分组按关键字传参,与位置顺序无关。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致, 并且 views 中的形参名称要与 urls 中的组名对应。

urls.py

?

1

2

3

4

urlpatterns = [

    path('admin/', admin.site.urls),

    re_path("^index/(?P[0-9]{4})/(?P[0-9]{2})/$", views.index),

]

views.py

?

1

2

3

4

from django.shortcuts import HttpResponse

def index(request, year, month):

print(year,month) # 一个形参代表路径中一个分组的内容,按关键字对应匹配

return HttpResponse('菜鸟教程')

3、路由分发(include)

存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。

解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。

步骤:

  • 1、在每个 app 目录里都创建一个 urls.py 文件。
  • 2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。

?

1

2

3

4

5

6

7

from django.contrib import admin

from django.urls import path,include # 从 django.urls 引入 include

urlpatterns = [

    path('admin/', admin.site.urls),

    path("app01/", include("app01.urls")),

    path("app02/", include("app02.urls")),

]

在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转。

app01 目录:

?

1

2

3

4

5

from django.urls import path,re_path

from app01 import views # 从自己的 app 目录引入 views

urlpatterns = [

    re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),

]

app02 目录:

?

1

2

3

4

5

from django.urls import path,re_path

from app02 import views # 从自己的 app 目录引入views

urlpatterns = [

    re_path("^xxx/(?P[0-9]{4})/$", views.xxx),

]

在各自 app 目录下的 views.py 文件中写各自的视图函数。

三、反向解析

随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。

这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。

反向解析一般用在模板中的超链接及视图中的重定向。

1、普通路径

在 urls.py 中给路由起别名,name="路由别名"

?

1

path("login1/", views.login, name="login")

在 views.py 中,从 django.urls 中引入 reverse,利用 reverse("路由别名") 反向解析:

?

1

return redirect(reverse("login"))

在模板 templates 中的 HTML 文件中,利用 {% url "路由别名" %} 反向解析。

?

1

<form action="{% url 'login' %}" method="post">

2、正则路径(无名分组)

在 urls.py 中给路由起别名,name="路由别名"

?

1

re_path(r"^login/([0-9]{2})/$", views.login, name="login")

在 views.py 中,从 django.urls 中引入 reverse,利用 reverse("路由别名",args=(符合正则匹配的参数,)) 反向解析。

?

1

return redirect(reverse("login",args=(10,)))

在模板 templates 中的 HTML 文件中利用 {% url "路由别名" 符合正则匹配的参数 %} 反向解析。

?

1

<form action="{% url 'login' 10 %}" method="post">

3、正则路径(有名分组)

在 urls.py 中给路由起别名,name="路由别名"

?

1

re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")

在 views.py 中,从 django.urls 中引入 reverse,利用 reverse("路由别名",kwargs={"分组名":符合正则匹配的参数}) 反向解析。

?

1

return redirect(reverse("login",kwargs={"year":3333}))

在模板 templates 中的 HTML 文件中,利用 {% url "路由别名" 分组名=符合正则匹配的参数 %} 反向解析。

?

1

<form action="{% url 'login' year=3333 %}" method="post">

四、命名空间

命名空间(英语:Namespace)是表示标识符的可见范围。

一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。

一个新的命名空间中可定义任何标识符,它们不会与任何重复的标识符发生冲突,因为重复的定义都处于其它命名空间中。

存在问题:路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误。

解决:使用命名空间。

普通路径

定义命名空间(include 里面是一个元组)格式如下:

?

1

include(("app名称:urls""app名称"))

实例:

?

1

2

path("app01/", include(("app01.urls","app01")))

path("app01/", include(("app02.urls","app02")))

在 app01/urls.py 中起相同的路由别名。

?

1

path("login/", views.login, name="login")

在 views.py 中使用名称空间,语法格式如下:

?

1

reverse("app名称:路由别名")

实例:

?

1

return redirect(reverse("app01:login")

在 templates 模板的 HTML 文件中使用名称空间,语法格式如下:

?

1

{% url "app名称:路由别名" %}

实例:

?

1

<form action="{% url 'app01:login' %}" method="post">


http://www.ppmy.cn/news/1003135.html

相关文章

中介者模式——协调多个对象之间的交互

1、简介 1.1、概述 如果在一个系统中对象之间的联系呈现为网状结构&#xff0c;如下图所示&#xff1a; 对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂&#xff0c;这些对象既会影响别的对象&#xff0c;也会被别的对象所影响&#xff0c;这些对象称为同事对…

Qt+联想电脑管家

1.自定义按钮类 效果&#xff1a; (1)仅当未选中&#xff0c;未悬浮时 (2)其他三种情况&#xff0c;均如图 #ifndef BTN_H #define BTN_H#include <QPushButton> class btn : public QPushButton {Q_OBJECT public:btn(QWidget * parent nullptr);void set_normal_icon(…

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V&#xff1f;怎么计算的&#xff1f;5.输出的误差和输出电流&#x1f446;&#xff08;右下角图像&#xff09;6.LDO一般会有个引脚是做补偿之用&#xff0c;datasheet会说明一个器件的…

List与Set的区别

List与Set的区别 大家好&#xff0c;在我们平时的代码编写过程中&#xff0c;经常会碰到需要使用到集合类型: List与Set。很多时候&#xff0c;我们可能会将它们视为同一种类型进行使用&#xff0c;但是在实际的编程逻辑中&#xff0c;它们之间是存在很大差别的。接下来我们就…

AutoSAR系列讲解(实践篇)11.4-NvBlockSwComponents(上)

目录 一、NvBlockSwComponents简介 1、AutoSAR 3.x的情况 2、AutoSAR 4.x的优化 3、架构 4、控制流 二、Nv Port

robots.txt 如何禁止蜘蛛(百度,360,搜狗,谷歌)搜索引擎获取页面内容

什么是蜘蛛抓取 搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时&#xff0c;会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt&#xff0c;在文件中声明该网站中不想…

Python爬虫—破解JS加密的Cookie

前言 在进行网站数据爬取时&#xff0c;很多网站会使用JS加密来保护Cookie的安全性&#xff0c;而为了防止被网站反爬虫机制识别出来&#xff0c;我们通常需要使用代理IP来隐藏我们的真实IP地址。 本篇文章将介绍如何结合代理IP破解JS加密的Cookie&#xff0c;主要包括以下几个…

vscode如何退出/切换 github 账号

退出/切换 github 账号 左下角点击头像按钮&#xff0c;选择注销&#xff0c;然后再重新登录