django之路由
Posted quzq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django之路由相关的知识,希望对你有一定的参考价值。
路由是指当请求来后,一种请求对应一种函数的那个urls.py配置文件中的映射关系
1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
2.当浏览器访问请求的url不是以/结尾时,jango会自动给该请求加/结尾,并让浏览器重新访问.可设置
为不主动加结尾处的/,方法:在settings.py文件中加入APPEND_SLASH=False即可,配置文件中虽然没
有这个参数,但默认结果是True;当配置完成后url请求后不加/时是访问不到页面的.(了解即可)
3. URLconf匹配的位置: URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串,会取
网址之后?号之前的字符串来做正则匹配. 且匹配出来的所有东西都是字符串形式.
一. 分组命名匹配:
1. url(r‘^articles/([0-9]{4})/$‘, views.func) 普通分组形式
以上路由中,通过对正则加分组,可以把分组内捕获的内容以参数形式传给func函数,通过这
个原理我们可以不用再使用?id=’xx’的形式来传数据了,可用正则分组来实现,只需在href处拼
接好结构即可. 是以位置参数的形式直接传给视图函数的.
2. url(r‘^articles/(?P<name>[0-9]{4})/$‘, views.func) 分组命名形式
在更高级的用法中,可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键
字参数形式传递给视图。在Python的正则表达式中,分组命名正则表达式组的语法是
(?P<name>pattern),其中name是组的名称, pattern代表匹配的正则表达式; 这个是以
关键字参数的形式直接传值给视图函数的,所以要求视图函数的形参名字不能随便起.
补充: 上面1和2是两种给视图函数传参的方式,还有第3中方式,了解即可:
url(r‘^articles/(?P<name>[0-9]{4})/$‘, views.func, {‘name’:’20’})
如上:在后面再加入个字典,当字典的key和分组命名的名字重复时,系统优先使用字典key
对应的value值, 当两个不冲突时,都会使用. 视图函数形参处为*args和**kwargs
3. 视图函数中指定默认值,代码如下:
urlpatterns = [
url(r‘^blog/$‘, views.page),
url(r‘^blog/page(?P<num>[0-9]+)/$‘, views.page),
]
# views.py中,可以为num指定默认值
def page(request, num="1"):
pass
当url访问请求不含数字时,默认返回第一页内容,当请求包含数字时,会动态的替换调num
的值,从而达到返回指定页面的目的.
二. 路由的分发:
1. 思路: 把本该在项目目录下的urls.py中进行路由匹配的功能给分发到每个包内,在包内新建
urls.py文件来进行路由匹配;在项目目录下的urls.py中建立分发指引路径即可.
2. 现有app名为app01,做法如下:
首先在项目目录的urls.py中导入 from django.conf.urls import include
然后配置 urlpatterns = [
url(r‘^app01/‘, include(‘app01.urls‘)), ] # 路由分发至app01中
注意分发完成后再访问时url前面就多了app01了,所有页面内引用到url地方都要改
三. 命名URL和URL反向解析
1.在urls.py路由中指定别名
2.在views.py视图文件中导入from django.shortcuts import render, redirect, reverse
3.也可从这里导入:from django.urls import reverse
命名URL:
普通命名 url(r‘^class/$‘, views.class, name=’cla’ )
分组命名 url(r‘^class/([0-9]{4})/([0-9]{2})/$‘, views.class, name=’cla’ )
命名分组 url(r‘^class/(?P<x>[0-9]{4})/(?P<y>[0-9]{2})/$‘, views.class, name=’cla’ )
URL反向解析:
在视图函数中的语法: views.py中导入from django.urls import reverse
普通: redirect( reverse(‘cla’) ) # 会动态的感知cla对应的url中正则的变化,并体现出来
分组: redirect( reverse(‘cla’ , args=(‘6666’, ’88’) ) ) # 有参正则给的参数要符合正则规则
命名: redirect( reverse(‘cla’ , kwargs={ ‘x’:‘6666’, ’y’: ’88’} ) ) # 同上
在html模板中的语法:
普通: {% url ‘cla’ %} # url 后跟别名即可,会动态感知并替换
分组: {% url ‘cla’ ‘6666’ ‘88’ %} # 原理同上视图中
命名: {% url ‘cla’ x=‘6666’ y=‘88’ %}
四. 项目中存在多个包,且包内别名有重复时:
以下是项目目录下的主路由语法, 其中namespace是固定写法,不可变
url(r‘app02/‘, include(‘app02.urls‘,namespace=‘app02‘)),
url(r‘app01/‘,include(‘app01.urls‘,namespace=‘app01‘)),
以下是views.py中函数视图内的语法:
reverse(‘app01:home‘,kwargs={‘year‘:‘2018‘,‘month‘:‘10‘})
reverse(‘app02:home‘,kwargs={‘year‘:‘2018‘,‘month‘:‘10‘})
以下是html页面中的语法:
{% url ‘app02:home‘ ‘2018‘ ‘10‘ %}
以上是关于django之路由的主要内容,如果未能解决你的问题,请参考以下文章