Django框架之路由用法

简介

路由简单的来说就是根据用户请求的 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">

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java 数组的使用

数组 基本介绍 数组可以存放多个同一类型的数据&#xff0c;数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数组就是一组数据。 数组的使用 1、数组的定义 方法一 -> 单独声明 数据类型[] 数组名 new 数据类型[大小] 说明&#xff1a;int[] a new int…

轻量级目标检测模型NanoDet-Plus微调、部署(保姆级教学)

前言 NanoDet-Plus是超快速、高精度的轻量级无锚物体检测模型&#xff0c;github项目文件。可以在移动设备上实时检测。其主要特点是 超轻量&#xff1a;模型文件仅980KB(INT8)、1.8MB(FP16)超快&#xff1a;移动ARM CPU上97fps&#xff08;10.23ms&#xff09;高精度&#xf…

预测狗狗币价格 -- 机器学习项目基础篇(5)

Dogecoin(狗狗币)是一种加密货币&#xff0c;就像以太坊或比特币一样-尽管它与这两种着名的硬币完全不同。Dogecoin最初在某种程度上是作为加密爱好者的一个笑话&#xff0c;并从一个以前众所周知的模因中取了它的名字。 在本文中&#xff0c;我们将实现一个机器学习模型&#…

Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

高校陆续拥抱chatgpt,人工智能会给学术带来什么变化会有什么影响

在当今信息爆炸的时代&#xff0c;人工智能在各行各业都发挥着越来越重要的作用&#xff0c;高校教育领域也不例外。最近&#xff0c;越来越多的高校开始陆续拥抱chatgpt&#xff08;Chatbot GPT&#xff09;这一人工智能技术&#xff0c;在学术领域会带来了怎样的变化与影响&a…

SQL-进阶

mysql --local-infile -u root -pset global local_infile 1;load data local infile 目录 into able 表名 fields terminated by , lines terminated by \n;

【数据结构(C++版)】哈希表(散列表)

目录 1. 散列表的概念 2. 散列函数的构造方法 2.1 直接定址法 2.2 除留余数法 2.3 数字分析法 2.4 平方取中法 3. 处理冲突的方法 3.1 开放定址法 3.1.1 线性探测法 3.1.2 平方探测法 3.1.3 双散列法 3.1.4 伪随机序列法 3.2 拉链法&#xff08;链接法&#xff0…

网络知识介绍

一、TCP 传输控制协议&#xff0c;Transmission Control Protocol。 面向广域网的通信协议&#xff0c;跨域多个网络通信时&#xff0c;为两个通信端点之间提供一条具有如下特点的通信方式&#xff1a; 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…

车载开发智能座舱技术——【Surface渲染流程】

SurfaceFlinger智能座舱技术是一种车载开发中的创新技术&#xff0c;它能够实现高效的图形渲染和多媒体处理&#xff0c;为驾驶员和乘客提供更好的车内体验。本文将介绍SurfaceFlinger智能座舱技术的概念和原理&#xff0c;并详细解析Surface的渲染流程和相关代码示例。 一、S…

无头单链表,有完整测试程序

&#x1f35f;无头单链表 &#x1f47b;无头单链表的所有结点都存储有效信息 &#x1f47b;无头单链表相对带头单链表&#xff0c;在有些涉及更改头节点的函数上需要传二级指针 &#x1f35f;头文件list.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #includ…

企业内网终端安全无客户端准入控制技术实践

终端无代理/无客户端准入控制技术因其良好的用户体验而倍受创新企业的青睐。无代理/无客户端准入控制技术&#xff0c;顾名思义&#xff0c;是一种在网络中对终端实施访问控制的方法&#xff0c;无需依赖特定的客户端软件。 不同于银行、医院等传统行业的终端准入控制需求&…

识别万物扫一扫,遇到不认识的物品扫就完事

随着科技的不断发展&#xff0c;移动设备已经成为人们日常生活中必不可少的工具。移动设备上的扫一扫功能&#xff0c;可以通过摄像头扫描物品&#xff0c;识别并获取相关信息&#xff0c;为人们的生活带来了很大的便利。本文将探讨识别万物扫一扫的使用及原理。 识别万物的使用…

概念辨析 | SAR运动补偿和自聚焦技术:深入探索雷达图像

注1:本文系“概念辨析”系列之一,致力于简洁清晰地解释、对比复杂而专业的概念。本次辨析的概念是:合成孔径雷达(SAR)的运动补偿和自聚焦技术。 SAR运动补偿和自聚焦技术:深入探索雷达图像 Synthetic Aperture Radar (SAR) 1 背景介绍 合成孔径雷达(Synthetic Aperture R…

iPhone 8透明屏的透明度高吗?

iPhone 8是苹果公司于2017年推出的一款智能手机&#xff0c;它采用了全新的设计和技术&#xff0c;其中一个亮点就是透明屏。 透明屏是指屏幕具有透明度&#xff0c;可以透过屏幕看到背后的物体。 iPhone 8的透明屏采用了最新的OLED技术&#xff0c;这种技术可以实现更高的对比…

RunnerGo五种压测模式你会配置吗

我们在做性能测试时需要根据性能需求配置不同的压测模式如&#xff1a;阶梯模式。使用jmeter时我们需要安装插件来配置测试模式&#xff0c;为了方便用户使用&#xff0c;RunnerGo内嵌了压测模式这一选项&#xff0c;今天给大家介绍一下RunnerGo的几种压测模式和怎么根据性能需…

shell脚本练习

#include <myhead.h> //递归实现输入一个数,输出这个数的每一位 void fun1(int data) {if(data 0) return;fun1(data/10);printf("%d\t",data%10);}//递归实现输入一个数,输出这个数的二进制 void fun2(int data) {if(data 0) return;fun2(data/2);printf(&q…

Redis7学习笔记01

一、redis7实战教程简洁 1、大纲&#xff1a; ①、适合对象&#xff0c;从小白到熟手&#xff0c;一套全包圆 ②、Redis专题-大厂面试题&#xff0c;含100道 ③、Redis专题-真实需求生产真实案例 ④、Redis7新特性 2、小白篇高阶篇&#xff1a; 3、大厂面试题&#xff1a…

软件供应链的基础:SBOM

软件作为一种强大的工具&#xff0c;可以简化复杂的技术概念&#xff0c;但随着软件不可思议的力量而来的是一个相互关联的软件依赖迷宫&#xff0c;这些依赖常常构成软件开发的基础。这些依赖关系并非没有缺陷&#xff0c;正如我们从 Log4Shell 这样的事件中所了解到的那样。当…

git 常用命令有哪些

Git 是我们开发工作中使用频率极高的工具&#xff0c;下面总结下他的基本指令有哪些&#xff0c;顺便温习一下。 前言 一般项目中长存2个分支&#xff1a; 主分支&#xff08;master&#xff09; 和开发分支&#xff08;develp&#xff09; 项目存在三种短期分支 &#xff1a…

【SQL】-【计算两个varchar类型的timestamp的毫秒差】

背景 TRANSTAMP3、TRANSTAMP2在Oracle数据库中的类型为varchar&#xff0c;但实际保存的值是时间戳timestamp类型&#xff0c;现在要计算二者的毫秒差 Oracle或MySQL extract(second from (to_timestamp(TRANSTAMP3,yyyy-mm-dd hh24:mi:ss.ff) - to_timestamp(TRANSTAMP2,yyy…