2 - django-urls路由系统基本使用
1 路由系统(urls控制)
url控制其实就是把不同的url对应到不同的views函数中去
格式:
# 项目目录下的urls.py文件中
urlpatterns = [
url(regex, view, kwargs=None, name=None)
... ...
]
url可以有多个,每个url都是一个独立的规则。
参数如下:
regex
(url正则表达式):与之匹配的 URL 会执行对应的第二个参数 view。view
(views视图函数): 用于执行与正则表达式匹配的 URL 请求。kwargs
(参数列表): 视图使用的字典类型的参数。 --> 很少使用name
(别名): 用来反向获取 URL。
1.1 正则字符串参数
url的第一个参数为正则表达式,所以常用的正则表达式符号都可以进行匹配
from user import views # 导入我们的app的views,才可以调用
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/[0-9]{4}/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # 传递两个位置参数
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), # 传递三个位置参数
]
这里对url表达式使用括号,表示取出匹配到的路径字符串(分组)
注意:
- 一旦
匹配成功则不再继续匹配
不需要添加一个前导的反斜杠
,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。- 每个正则表达式前面的'r',是可选的但是建议加上。
1.2 url的分组
在url正则表达式上加上括号,就表示对括号内的元素进行取出,然后传给后面的views函数,根据传递参数的方式不同,分为无名分组
和有名分组
:
若要从URL中捕获一个值,只需要在它周围放置一对圆括号。
1.2.1 无名分组
只需要把要分组的正则字符串用括号括起来即可。这样,括号内的匹配的内容会当作位置参数传递给后面指定的views函数。
urlpatterns = [
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.year_month),
]
# ([0-9]{4}) 第一个位置参数
# ([0-9]{2}) 第二个位置参数
views函数需要定义位置参数来一一对应,否则将会抛出TypeError异常
1.2.2 有名分组
即捕获url中的一个值时,并赋予其名称,使用关键字参数来进行传递。在Python 正则表达式中,命名正则表达式组的语法是(?Ppattern),其中 name 是组的名称,pattern 是要匹配的模式。
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/(?P<year>201[0-9])', user.views.index)
]
# 会把 {'year':201[0-9]} 当作关键字参数
这种方式可以在views中的处理函数内,直接定义关键字变量来接受,而不用在意参数的位置。
def index(request,year):
... ...
如果year没有捕获到数据,那么views函数index将会报错,所以我们一般可以在index中为year,配置默认值来避免这种错误。当然也可以在urls内,指定默认参数
url(r'^index/year(?P<year>[0-9]?)', user.views.index, {'year': 2019})
但是这样就把前面匹配到的year的值给覆盖了。请慎重选用
1.3 URLconf 在什么上查找
请求的URL被看做是一个普通的Python 字符串, URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。
- GET:把用户发送的参数放在URL中进行传递,在URL中一般用?隔开。
- POST:把用户发送的参数放在请求头中传递。
例如:
- https://www.example.com/myapp/ 请求中,URLconf 将查找 myapp/
- https://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 myapp/ 。
URLconf 不检查使用了哪种请求方法。换句话讲,所有的请求方法,即对同一个URL的无论是 POST请求、GET请求、或是HEAD请求方法等等,都将路由到相同的函数。
1.4 include(路由分发)
当项目中的应用变得越来越多的时候,如果所有的应用的URL都通过项目的urls统一进行分配,那么耦合度会很高,另外也不利于管理,所以这里通过include来交给应用的urls来处理。
# 项目的urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^user/', include('user.urls')),
]
# 通过include 来指定交给那个应用的urls来处理
# include 包涵在 django.conf.urls中
在应用user下创建urls.py文件,写入
from django.conf.urls import url
from user import views
urlpatterns = [
url('^login', views.login)
]
注意:路由分发后,子路径的起始位置就从分发的URL开始了。上面匹配到的路径为:user/login
1.5 别名(name参数)
当我们在做路径匹配然后配合form表单等需要提交的数据的元素的时候会遇到以下问题
#urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login), # 匹配路径
]
返回的页面文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="/login/" method="post"> <!-- 根据路径进行提交 -->
<p><h2>姓名</h2></p>
<p><input type="text" name="username"></p>
<p><h2>密码</h2></p>
<p><input type="text" name="password"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
如果我们某一天改了url匹配的路径,那么,就绪要修改页面中所有的提交路径,否则将会提交失败.而url的name就是解决这个问题的。
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.login,name='LOGIN'), # 添加name关键字
]
返回的html文件如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="{% url 'LOGIN' %}" method="post"> <!-- 这里使用name关键字来动态的传递url -->
<p><h2>姓名</h2></p>
<p><input type="text" name="username"></p>
<p><h2>密码</h2></p>
<p><input type="text" name="password"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
这样就算URL后期更改,也会动态指向最新的URL。
- 个人觉得说白了就是一个变量的替换,只不过是用的是django特有的语法格式。
name='LOGIN' 就是把前面匹配的url保存到LOGIN中,然后Django 在返回html文件的时候再进行替换。
补充: - 当url存在正则表达式的时候,只使用name参数是不行的。因为正则部分无法进行渲染。目前的解决方法是在url部分进行拼接
# --------------------------- url ---------------------------
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^abc/(\d+)/', views.login,name="LOGIN"),
]
# -------------------------- Teamplates ---------------------------
<form action="{% url "LOGIN" 4 %}"> # 这里正则匹配了几个部分,那么就需要传递几个参数
<p>Username:</p>
<input type="text" name="username">
<p>Password:</p>
<input type="text" name="password">
<input type="submit" value="提交">
</form>
1.6 反推URL
什么叫反推url?在views函数中,如果想要获取当前函数对应的url,该怎么办呢?还记得前面的name属性吗,反推url就是在views中根据name属性的值,获得对应的url
from django.urls import reverse
url = reverse('name')
当然reverse还有两个参数(args,kwargs)
args = ()
kwargs = {}
# 参数是配合urls中的正则表达式的
url('^detail/(\d+)' ,name='i1',views.detail) -- > reverse('i1',args=(10,))
# 反推的URL为: detail/10
# kwargs则表示在命名关键字的情况下
url('^detail/(?P<nid>\d+)' ,name='i2',views.detail) -- > reverse('i1',kwargs={'nid':10})
# 反推的url为: detail/10
还有一个方法是利用request对象的path_info,因为其中存放的是用户提交的url。
1.7 命名空间
当在url(路由系统)中使用了include时,在views函数中,我们就无法单独的利用name参数来反推url了,因为在include时,是无法使用name关键字的,不过django提供了其他关键字提供类似功能:namespace,称作命名空间。
# urls.py
url = [
url(r'crm/',include('crm.urls'),namespace='crm'),
url(r'cmdb/',include('cmdb.urls'),namespace='cmdb'),
]
# crm 中的 urls.py
app_name = crm
url = [
url(r'index/',views.index,name='index'),
]
# crm 中的views.py
def test(request):
url = reverse('crm:index') # 这里通过namespace:name 来反向获取url
print(url)
return HttpResponse(200)
PS:在html中,通过{% url 'crm:index' %} 也是通过namespace:name来获取url的。
2 - django-urls路由系统基本使用的更多相关文章
- Python学习(三十一)—— Django之路由系统
转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...
- Django之路由系统 Dj
Django之路由系统 Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...
- Django框架----路由系统(详细)
Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...
- Django之 路由系统
Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...
- Django 基础 路由系统
Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...
- Django 的 路由系统
Django 的路由系统 URL 配置(URLconf)就像Django 锁支撑网站的目录. 它的本质就是URL 与要为该URL 调用的视图函数之间的映射表. 你就是以这种方式告诉Django, 对于 ...
- Django 的路由系统
Django 的路由系统 Django 的路由系统 路由层 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.ho ...
- python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)
12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...
- 6月19日 python学习总结 Django之路由系统
Django之路由系统 Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...
- django urls路由匹配分发
django urls路由匹配分发 一.urls配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对 ...
随机推荐
- 微信小程序与java后台交互
java后台使用的ssm框架,小程序连接的本地接口.跟正常的web访问没什么区别,也是后台获取url,返回json数据:只是小程序前台请求的url要带上http://localhost:80801. ...
- python使用selenium、PhantomJS获得网站cookie信息#windows
首先python安装selenium,命令行中输入 pip install selenium 在执行代码如下代码时出现错误 driver=webdriver.PhantomJS() 错误如下 sele ...
- jingchi.ai 2017.11.25-26 Onsite面试
时间:2017.11.25 - 11.26 地点:安徽安庆 来回路费报销,住宿报销. day1: 大哥哥问了我一个实际中他们遇到的问题.有n个点,将点进行分块输出,输出各个块的均值点.具体就是100* ...
- 学习Spring Boot:(五)使用 devtools热部署
前言 spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原理是在发现代码有更改之后,重新启动应用,但是比速度比手动停止后 ...
- AtCoder Grand Contest 003
AtCoder Grand Contest 003 A - Wanna go back home 翻译 告诉你一个人每天向哪个方向走,你可以自定义他每天走的距离,问它能否在最后一天结束之后回到起点. ...
- 模板:插头dp
前言: 严格来讲有关dp的都不应该叫做模板,因为dp太活了,但是一是为了整理插头dp的知识,二是插头dp有良好的套路性,所以姑且还叫做模板吧. 这里先推荐一波CDQ的论文和这篇博客http://www ...
- AFO NOI2018退役——菜鸡一直是菜鸡
游记DAY -INF连续几天的模拟让我确信我就是菜鸡.以及相信yxd,sjq,cyl神犇一定能够稳了. DAY 0报道,天很热热热热热热热热热. DAY 1开幕式,杜子德很热热热热热热热热热. DAY ...
- 【Cf #299 C】Tavas and Pashmaks(单调栈,凸性)
一个经典的二维数点模型,如果某个人 $ x $ 两个速度都比另一个人 $ y $ 大,显然 $y$ 是不可能成为winner的. 但这里只考虑两个人$x$,$y$在两个属性各有千秋的时候,一定存在正整 ...
- 【codeforces 553E】 Kyoya and Train
http://codeforces.com/problemset/problem/553/E (题目链接) 艹尼玛,CF还卡劳资常数w(゚Д゚)w!!系统complex被卡TLE了T_T,劳资写了一天 ...
- 主动分布式WEB资产扫描
一. Redis的服务安装 系统环境:centos7x64 ip地址:192.168.1.11 1.设置静态IP地址 [root@localhost backlion]#vi /etc/sys ...