Django笔记&教程 2-2 URL详细匹配规则
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
: 要匹配的urlview
: 匹配后要调用的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>'
- 若要从URL捕获字符串作为参数传递给view函数,需要使用尖括号,尖括号内写捕获后的变量名。
比如'hello/<name>'
就会将name
对应位置的字符串捕获并以name
作为变量名传入view函数。 - 捕获的值可以选择性地包括转换器类型,设置后会将捕获后的字符串转换为对应类型。例如,使用
<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
: user
、course
要导入 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详细匹配规则的更多相关文章
- Django笔记&教程 总目录
本篇博客只有目录,正文内容在目录章节链接的博客里 除目录本身外,没有链接的章节,说明内容还没开始编辑 本项目笔记仍在不断创作中,还有些内容会根据自身所学不断更新完善 本项目主要为markdwon文档, ...
- Django笔记 —— 高级视图和URL配置
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- Caliburn.Micro学习笔记(一)----引导类和命名匹配规则
Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...
- djanjo中url路由匹配规则是啥意思
一,django路由匹配规则的本质是通过正则表达式对用户的url进行匹配. 1,r 是正则表达式中防止转义的符号,例如在python/n代表换行,加上r就不换行了. 2,$ 正则表达式中表示以什么什么 ...
- Django笔记&教程 2-1 URL与View关系
Django 自学笔记兼学习教程第2章第1节--URL与View关系 点击查看教程总目录 参考:how-django-processes-a-request 1- Django处理请求(request ...
- Django笔记&教程 3-3 模板常用语法
Django 自学笔记兼学习教程第3章第3节--模板常用语法 点击查看教程总目录 本文主要参考:https://docs.djangoproject.com/en/2.2/ref/templates/ ...
- Django笔记&教程 1-1 一 新建项目
Django 自学笔记兼学习教程第1章第1节--一 新建项目 点击查看教程总目录 1- 命令行新建Django项目 新建项目命令(project_name处为项目名) django-admin sta ...
- Django笔记&教程 5-2 进阶查询——Queryset
Django 自学笔记兼学习教程第5章第2节--进阶查询--Queryset 点击查看教程总目录 Queryset相关内容其实蛮多的,本文只介绍一些常用的,详细的推荐查询官方文档:queryset-a ...
- Django笔记&教程 6-2 表单(Form)基础操作
Django 自学笔记兼学习教程第6章第2节--表单(Form)基础操作 点击查看教程总目录 1 - 编写表单类 创建新的表单类的代码,一般写到一个专门的forms.py文件中(一般放在对应的app文 ...
随机推荐
- Python技法-序列拆分
Python中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组.列表.字符串.文件.迭代器.生成器等. 元组拆分 元组拆分是最为常见的一种拆分,示例如下: p = (4, 5) ...
- List接口常用实现类对比
相同点 都实现了List接口 储存了有序 可重复的数据 不同点 ArrayList 线程不安全 但是效率高 底层使用 Object[] elementData 实现 LinkedList 底层使用双向 ...
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- Windows下node-gyp查找VS安装路径简单解析
node-gyp的作用我已经不想赘述了,这里给一个我之前文章的链接:cnblogs看这里,知乎看这里.本文主要从源码入手,介绍node-gyp查找VisualStudio的过程 为了方便我们研究nod ...
- 第29篇-调用Java主类的main()方法
在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...
- NOIP模拟77
前言 感觉最近太飘了,这次考试是挺好的一次打击(好像也不算是). 犯了一个智障错误(双向边一倍数组 100pts->30pts)别的就.. T1 最大或 解题思路 一开始我以为是一个找规律,然而 ...
- CF536D Tavas in Kansas(博弈论+dp)
貌似洛谷的题面是没有翻译的 QWQ 大致题面是这个样子,但是可能根据题目本身有不同的地方 完全懵逼的一个题(果然博弈论就是不一样) 首先,我们考虑把题目转化成一个可做的模型. 我们分别从\(s\)和\ ...
- Java(13)详解构造方法
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201600.html 博客主页:https://www.cnblogs.com/testero ...
- 5个步骤,教你瞬间明白线程和线程安全.md
记得刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆. 他又接着问:那你再来说说什么是线程安全?--然后我就GG了 ...
- 学习笔记-React的简单介绍&工作原理
一.React简单介绍 1.React起源于Facebook内部项目,与2013年5月 2.是一个用于构建用户界面的JavaScript库 二.React特点 1.声明式设计-React采用声明范式, ...