【Django3.2学习】05-路由进阶

路由进阶

​ 在django中所有的路由最终都会保存在一个叫 urlpatterns中,urlpatterns必须声明在主应用下的url.py总路由中,这是由配置文件settings中的 ROOT_URLCONF = '主应用名称.urls'配置的。

​ 这里的配置当然可以进行修改,但是必须确保修改后的路径文件内存在 urlpatterns变量,而且必须是列表类型。

​ 在django运行中,当客户端发送了一个http请求到服务端,服务端的web服务器则会从http协议中提取url地址,从程序内部找到项目中添加到urlpatterns里面的所有路由信息的url进行遍历匹配。如果相等或者匹配成功,则调用当前url对应的视图方法。

​ 在给urlpatterns路由列表添加路由的过程中,django一共提供了两个函数给开发者注册路由

from django.urls import path
from django.urls import re_path

【Django3.2学习】05-路由进阶

一、path路由注册

​ 从绑定路由的执行上效率,使用path比re_path的效率高很多,因为path默认情况下仅仅是通过字符串比较,而re_path是使用正则匹配


path("index.html4", view.index4, name="index4")

二、re_path路由注册

视图函数

def profile(request, pk):
    print(pk)
    return HttpResponse('获取用户信息')

路由映射关系

from django.urls import path, re_path

urlpatterns = [

    re_path('^profile/(?P[0-9]+)/$', views.profile),
]

注:

  • 首先要导入re_path from django.urls import path, re_path
  • ^$分别表示正则的开始于结束
  • (?P<pk>[0-9]+)</pk>一个匹配表达式
  • ()表示一个正则表达式的匹配关系
  • ?P<pk></pk>表示后面的匹配规则对应的参数是pk参数
  • [0-9]表示匹配0-9之间的数字
  • +表示可匹配多个

改造视图函数:

def profile(request, pk, mobile):
    print(pk)
    print(mobile)
    return HttpResponse('获取用户信息')

改造urls

from django.urls import path, re_path

urlpatterns = [

    re_path('^profile/(?P[0-9]+)/mobile/(?P1[3-9]\d{9})/$', views.profile),
]

注:

  • 此时就表示需要两个参数,pk及mobile
  • (?P<mobile>1[3-9]\d{9})</mobile>表示匹配一个手机号
  • ?P<mobile></mobile>表示匹配的对应参数是mobile
  • 1表示匹配1
  • [3-9]表示匹配3-9之间的任意数字一次
  • \d{9}表示匹配任意数字九次
  • 请求示例: host:port/profile/513/mobile/13112312311
  • 那么请求到达视图函数后pk接收到了513,mobile接收到了13112312311
  • 需要注意的是,参数到达视图函数后,参数接收到的类型都是str类型

TODO:更多正则相关可自行了解,也可对re模块进行自我学习

三、Django的url路由加斜杠的问题

在django路由中编写url地址时,为了快速查找,简易最好不在路由的后面加上 /,当用户访问对应视图的路由时,加不加斜杠,Django都能转换到正确的url地址,这个方式虽然好,但是会导致我们客户端的静态文件的url路径如果是相对路径,则会被Django这个做法导致出现路径正确的情况,所以不要加斜杠。当然,如果我们编写的是属于前后端分离的项目的话,加不加斜杠不存在影响。

四、路由转换器

​ 路由转换器也叫路由验证器,有两个作用:

  • 把路由参数进行类型转换
  • 验证路由匹配

4.1 内置转换器

官方文档

下面的路径转换器在默认情况下是有效的:

  • str – 匹配除了 '/' 之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。
  • int – 匹配 0 或任何正整数。返回一个 int
  • slug – 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。比如, building-your-1st-django-site
  • uuid – 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。比如, 075194d3-6885-417e-a8a8-6c931e272f00。返回一个UUID 实例。
  • path – 匹配非空字段,包括路径分隔符 '/' 。它允许你匹配完整的 URL 路径而不是像 str 那样匹配 URL 的一部分。

示例:

视图函数:

def demo1(request, num):
    print(num, type(num))
    return HttpResponse('ok')

urls:

urlpatterns = [

    path('demo1/', views.demo1),
]

注:

  • 此时视图函数接收到的num就不是str类型了,而是int类型
  • <int:mobile></int:mobile>就是路由转换器的写法
  • int表示转换器类型是int类型
  • num对应着视图函数中的形参名称,传递到视图函数时就将值传递给num参数

4.2 注册自定义的路径转换器

对于更复杂的匹配需求,你能定义你自己的路径转换器。

转换器是一个类,包含如下内容:

  • 字符串形式的 regex 类属性。
  • to_python(self, value) 方法,用来处理匹配的字符串转换为传递到函数的类型。如果没有转换为给定的值,它应该会引发 ValueErrorValueError 说明没有匹配成功,因此除非另一个 URL 模式匹配成功,否则会向用户发送404响应。
  • 一个 to_url(self, value) 方法,它将处理 Python 类型转换为字符串以用于 URL 中。如果不能转换给定的值,它应该引发 ValueErrorValueError 被解释为无匹配项,因此reverse() 将引发NoReverseMatch,除非有其他 URL 模式匹配。

可以参考内置转换器的写法,内置转换器所在位置: \&#x5E94;&#x7528;&#x540D;&#x79F0;\Lib\site-packages\django\urls\converters.py

示例:

在user子应用下新建 converters.py文件

from django.urls.converters import StringConverter, register_converter

class MobileConverter(StringConverter):
    regex = r'^\+?1?\d{9,15}$'

register_converter(MobileConverter, 'mobile')

视图函数

def demo2(request, mobile):
    print(mobile)
    return HttpResponse('ok')

urls

from django.urls import path
from user import views

from user.converters import MobileConverter

urlpatterns = [

    path('demo2/', views.demo2),
]

注意:

  • 自定义路由转换器,实际上就是django在对路由进行数据转换和简写正则路由的实现,这种实现方式是基于不同的转换器类来完成,开发者要实现自定义转换器,需要编写的类必须符合官方要求的3个基本要求:
  • 必须声明属性:regex
  • 必须声明的方法:
    • to_python
    • to_url
  • 必须以类格式编写
  • 必须通过register_converter()进行注册才能被调用
  • 这种实现方式,实际就是对编程领域的设计模式的一种应用,设计模式,前任总结下来的基于固定业务场景的解决方案就是设计模式,编程中,设计模式有23种不同设计模式,其中,我们上面这种就是叫策略模式/接口模式
  • 一般在工作中,往往可以使用策略模式来进行营销活动(优惠券、打折)的实现

Original: https://blog.csdn.net/qq_41224289/article/details/124086161
Author: Abo_
Title: 【Django3.2学习】05-路由进阶

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/733340/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • manjaro(arch系)Linux使用(一)

    配置源 先切换国内的镜像源仓库 sudo pacman-mirrors -i -c China -m rank 在弹出的窗口中选择延迟最小的源 ArchLinuxCN是Arch中文…

    Python 2023年6月3日
    0102
  • 当线下门店遇上AI:华为云ModelBox携手佳华科技客流分析实践

    摘要:在赋能传统门店客流经营数字化转型方面,华为云ModelBox与伙伴佳华科技合作推出的”华为云客流统计项目”,算是一次成功的探索。 现如今,AI技术蓬勃…

    Python 2023年10月28日
    055
  • 【WY】数据分析 — Matplotlib 阶段一 :基础语法 四 —— 参数设置

    版权声明:本文为博主原创文章,未经博主允许不得转载。 文章目录 一、图表参数 * 1.1 基本参数 – 1.1.1 窗口大小 1.1.2 图表标题 1.1.3 轴标签 …

    Python 2023年9月4日
    038
  • 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架——MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 在之前的文章中我们学习了MYSQL和JDBC…

    Python 2023年10月22日
    039
  • Django异步任务

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、celery是什么? 二、使用步骤 * 1.环境安装 1.配置 2.建立任务 3.触发任务 4…

    Python 2023年8月5日
    076
  • Python 测试框架之 pytest框架详解

    前言Python测试框架之前一直用的是unittest+HTMLTestRunner,听到有人说pytest很好用,所以这段时间就看了看pytest文档,在这里做个记录。 官方文档…

    Python 2023年9月11日
    073
  • CE Loss与BCE Loss的区别

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年10月10日
    032
  • 《深度学习的数学》chap1 神经网络的思想

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年9月15日
    050
  • flask+gunicorn部署

    flask实际上就是用来作为python部署服务的框架,方便别人调用你写的服务。本文主要记载下自己的使用过程 pip install flask from flask import…

    Python 2023年8月15日
    049
  • python结合Django实现在线考试系统

    文章目录 * – 1.Django简介 – + Django请求生命周期流程: – 2.项目的设计思路 – + * 2.1.在线考试…

    Python 2023年8月4日
    057
  • python代码统计核酸检测结果截图

    #QQ:502440275@qq.com#本截图适合安康码截图,如需其他地区截图统计,可与我QQ或QQ邮箱联系#1、在当前文件夹下创建imgs文件夹用于存放图片,图片格式.jpg#…

    Python 2023年11月3日
    036
  • 前端周刊第三十八期

    前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。如果外链不能访问,关注公众号 「 前端每周看」,里面有解决办法…

    Python 2023年10月19日
    033
  • Flask项目(二)Restful风格、图片、短信验证码、注册登录

    Flask项目 Restful风格 如何设计符合RESTful风格的API * 一、域名: 二、版本: 三、路径: * 四、使用标准的HTTP方法: 五、过滤信息: 六、状态码: …

    Python 2023年8月11日
    052
  • 中断线程化

    中断线程化 中断处理程序包括上半部硬件中断处理程序,下半部处理机制,包括软中断、tasklet、workqueue、 中断线程化。 当一个外设中断发生后,内核会执行一个函数来响应该…

    Python 2023年9月17日
    034
  • pygame.display.set_mode()

    screen = pg.display.set_mode( size=(0, 0), flags=0, depth=0, display=0, vsync=0 ) 功能:创建Sur…

    Python 2023年9月19日
    038
  • 送你一个Python 数据排序的好方法

    摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法。最常见的数据分析是使用电子表格、SQL或pandas 完成的。使用 Pandas 的一大优点…

    Python 2023年8月17日
    037
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球