Django 自学笔记兼学习教程第2章第2节——URL详细匹配规则

点击查看教程总目录

本章第一节中我们简单介绍了URL与View关系

简单概括来说,网页请求的url会通过urls.py里面的urlpatterns列表中的urlpattern来匹配对应的view方法,然后view方法会返回一个HttpResponse

过程示意如下:

url - > urlpattern - > view

本节就来详细说下这个匹配关系

本文参考文献:module-django.urls.conf

1- urlpattern

urlpattern可以调用两种函数获得:django.urls.path()django.urls.re_path()

后者是用于正则匹配url的(新手一般用不到)

这两种函数的参数和含义是一样的

path(route, view, kwargs=None, name=None)
re_path(route, view, kwargs=None, name=None)
  • route : 要匹配的url
  • view : 匹配后要调用的view函数名
  • kwargs: 向view函数传递额外的参数(route也可以传递参数给view, 所以对于新手来说,kwargs这个比较少用到)
  • name: urlpattern的名字,主要用于后面在模板中指定urlpattern。(因为url中间可能会修改,模板中写死了的话,改起来麻烦)

2 - 传参

本章第一节中我们举了个最简单的hello例子。 这里我们进行一个简单的拓展思考,如果这个hello后面要跟上访问的人的名字呢

比如浏览器访问http://127.0.0.1:8000/hello/tony, 希望返回结果hello, tony

访问http://127.0.0.1:8000/hello/Bob, 希望返回hello, Bob

这个时候如果像第一节里面那样一个一个写,就麻烦了,一个名字就要写一个view方法,也不现实。

所以我们需要能够把route的一些字段作为参数传递给view函数

比如要将http://127.0.0.1:8000/hello/Bob中的Bob作为参数的话,那么可以这么写

path('hello/<slug:name>', views.hello)

同时views.py中的hello方法也要添加一个参数勇于去接受这个传入的变量

def hello(request, name):
return HttpResponse("Hello, %s" % name)

这里细下这句'hello/<slug:name>'

  1. 若要从URL捕获字符串作为参数传递给view函数,需要使用尖括号,尖括号内写捕获后的变量名。

    比如'hello/<name>'就会将name对应位置的字符串捕获并以name作为变量名传入view函数。
  2. 捕获的值可以选择性地包括转换器类型,设置后会将捕获后的字符串转换为对应类型。例如,使用<int:value>来捕获整型参数, 其中:前为转换器类型,:后为捕获后的变量名。(如果不包含转换器,则匹配除/字符外的任何字符串)

详细官方文档:urls/#example

3 转换器(converters)类型

Django默认的转换器有:

  • str:转换器默认值,匹配除路径分隔符'/'外的任何非空字符串
  • int:匹配零或任何正整数,返回一个int
  • slug:匹配由ASCII字母或数字以及连字符和下划线组成的任何slug字符串。
  • uuid:匹配格式化的UUID,返回一个UUID实例。
  • path:匹配任何非空字符串,包括路径分隔符'/'。

前三个用的比较多,新手应该暂时用不到后两个。

同时对于更复杂的匹配需求,可以定义自己的路径转换器,

具体可查阅官方文档: registering-custom-path-converters

4 使用include收纳不同app的url

对于一个网站系统而言,可能会有很多功能模块app,每个功能模块app又有各自的urlpatterns

如果这些全部都放在项目文件夹project_name下的项目名文件夹project_name/project_name中的urls.py中的话,

会很混乱也不方便管理,所以最好的办法是,每个功能模块app对应的urlpatterns放在app文件夹下的,然后在project_name/project_name中的urls.py使用include方法进行导入。

以我在做的简易教务系统为例,其有两个app: usercourse

要导入 user中的url到主url中的话,

则主urls.py(详细路径为SSCMS/SSCMS/urls.py)代码如下

from django.urls import path, include

urlpatterns = [
path('user/', include("user.urls")),
# ... other urlpatterns
]

SSCMS/user/urls.py

from django.urls import path
from user import views urlpatterns = [
path('login/', views.home, name="login"),
path('login/<slug:kind>', views.login, name="login"),
path('register/<slug:kind>', views.register, name="register"), path('update/<slug:kind>', views.update, name="update"),
path('logout/', views.logout, name="logout"),
]

此事要访问user中的名为login的urlpattern的话,浏览器应该请求的网站为

http://127.0.0.1:8000/user/login/

使用include方法

实际上会将一组url“根植到”其他url之下。

比如上面的例子就将SSCMS/user/urls.py中的urlpatterns“根植”到SSCMS/SSCMS/urls.py中的user/下。

更多细节,可见include的官方文档:including-other-urlconfs

Django笔记&教程 2-2 URL详细匹配规则的更多相关文章

  1. Django笔记&教程 总目录

    本篇博客只有目录,正文内容在目录章节链接的博客里 除目录本身外,没有链接的章节,说明内容还没开始编辑 本项目笔记仍在不断创作中,还有些内容会根据自身所学不断更新完善 本项目主要为markdwon文档, ...

  2. Django笔记 —— 高级视图和URL配置

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  3. Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

    Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...

  4. djanjo中url路由匹配规则是啥意思

    一,django路由匹配规则的本质是通过正则表达式对用户的url进行匹配. 1,r 是正则表达式中防止转义的符号,例如在python/n代表换行,加上r就不换行了. 2,$ 正则表达式中表示以什么什么 ...

  5. Django笔记&教程 2-1 URL与View关系

    Django 自学笔记兼学习教程第2章第1节--URL与View关系 点击查看教程总目录 参考:how-django-processes-a-request 1- Django处理请求(request ...

  6. Django笔记&教程 3-3 模板常用语法

    Django 自学笔记兼学习教程第3章第3节--模板常用语法 点击查看教程总目录 本文主要参考:https://docs.djangoproject.com/en/2.2/ref/templates/ ...

  7. Django笔记&教程 1-1 一 新建项目

    Django 自学笔记兼学习教程第1章第1节--一 新建项目 点击查看教程总目录 1- 命令行新建Django项目 新建项目命令(project_name处为项目名) django-admin sta ...

  8. Django笔记&教程 5-2 进阶查询——Queryset

    Django 自学笔记兼学习教程第5章第2节--进阶查询--Queryset 点击查看教程总目录 Queryset相关内容其实蛮多的,本文只介绍一些常用的,详细的推荐查询官方文档:queryset-a ...

  9. Django笔记&教程 6-2 表单(Form)基础操作

    Django 自学笔记兼学习教程第6章第2节--表单(Form)基础操作 点击查看教程总目录 1 - 编写表单类 创建新的表单类的代码,一般写到一个专门的forms.py文件中(一般放在对应的app文 ...

随机推荐

  1. SQL Server 命令备忘录(持续更新...)

    1.删除表内容并重置ID truncate table 表名 2.开启SqlDependency监控数据库 在数据中执行以下查询: SELECT is_broker_enabled FROM sys. ...

  2. Go语言之循环与条件判断

    一.for循环 Go 语言中没有 while 循环,只有一个 for 循环 for 变量初始化;条件;变量自增/自减 { 循环体内容 } 1.基本使用 for i := 0; i < 10; i ...

  3. 由于坏块导致DG的mrp0进程中断

    由于坏块导致DG的mrp0进程中断1.Environment11.2.0.4 ADG 2.SymptomsDG的mrp0进程中断,重启后,还是卡住.查看alert,在1.47存在报错,进一步查看trc ...

  4. C# 类拓展方法

    C#类拓展方法 要求: 扩展方法类必须为静态类: 拓展方法必须为静态方法,参数为this+需拓展类对象: 多个类拓展方法可以写在一个拓展类中: public class TestExtension { ...

  5. 洛谷4051 JSOI2007 字符加密(SA)

    真是一道良好的SA模板题 首先,由于涉及到从左边移动到右边这个过程,我们不妨直接把字符串复制一遍,接在后面. 然后直接构造后缀数组,按排名从小到大,枚举所有的位置,如果这个后缀的起始点是在原串中的,那 ...

  6. SpringBoot之日志注解和缓存优化

    SpringBoot之日志注解和缓存优化 日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+Aop的方式来实现日志的输出: 首先需要定义一个注解类: @ ...

  7. UE4蓝图AI角色制作(六)之行为树

    13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...

  8. Java:LinkedList类小记

    Java:LinkedList类小记 对 Java 中的 LinkedList类,做一个微不足道的小小小小记 概述 java.util.LinkedList 集合数据存储的结构是循环双向链表结构.方便 ...

  9. Noip模拟43 2021.8.18

    T1 地一体 可以树形$dp$,但考场没写出来,只打了没正确性的贪心水了$30$ 然后讲题的时候B哥讲了如何正确的贪心,喜出望外的学习了一下 不难发现 每次士兵都会直接冲到叶子节点 从深的点再返回到另 ...

  10. [火星补锅] siano 神奇的线段树

    前言: 本来以为很难打的,没想到主干一次就打对了,然而把输入的b和d弄混了,这sb错误调了两个小时... 解析: 神奇的线段树.注意到有一个性质,无论怎么割草,生长速度快的一定不会比生长速度慢的矮.因 ...