博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django路由层
阅读量:5939 次
发布时间:2019-06-19

本文共 6795 字,大约阅读时间需要 22 分钟。

 

一.路由匹配

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。

你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

基本格式:

from django.conf.urls import urlurlpatterns = [     url(正则表达式, views视图函数,参数,别名),]

注意:

Django 2.0版本中的路由系统已经替换成下面的写法():

from django.urls import pathurlpatterns = [    path('articles/2003/', views.special_case_2003),    path('articles/
/', views.year_archive), path('articles/
/
/', views.month_archive), path('articles/
/
/
/', views.article_detail),]

参数说明:

  • 正则表达式:一个正则表达式字符串
  • views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数

第一个参数是正则,访问testadd时匹配到了testadd中test,所以不会继续向下匹配,直接走test的路由,加个斜杠/可以解决这个问题,但是/后边继续添加字符也同样可以匹配到,所以在/后加$来确定结尾完成绝对匹配。

正则表达式的详解 

基本配置

from django.conf.urls import urlfrom . import viewsurlpatterns = [    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),]

注意事项

  1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
  2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
  3. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
  4. 每个正则表达式前面的'r' 是可选的但是建议加上。

补充说明

# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项APPEND_SLASH=True

Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。

其效果就是:

我们定义了urls.py:

 
from django.conf.urls import urlfrom app01 import viewsurlpatterns = [        url(r'^blog/$', views.blog),]
 

访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。

自动加上‘/’是一个重定向的操作,在路由没有找到http://www.example.com/blog 时候,会重新在路由后面加上‘/’来进行一个重定向的操作

如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

首页设置:

直接匹配空进入首页。

匹配404页面,未设置的路由:

加了url(r'',view.error)路由后,当请求没有最后的斜杠时,浏览器不会重定向到二次加/的请求,而是直接被最后的空路由直接处理。

二.分组

无名分组

将正则匹配分组得到的数据当做位置参数传参给路由函数

简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图。

有名分组

在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。

将其作为关键字传参

有名分组和无名分组不能直接混着用

因为路由中如果你匹配了关键字参数分组,那么路由不会再传任何位置参数,可以用*args,**kwargs去验证

但是支持用一类型多个形式匹配

无名分组多个    url(r'^test/(\d+)/(\d+)/',views.test),有名分组多个    url(r'^test/(?P
\d+)/(?P
\d+)/',views.test),

URLconf匹配的位置

URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。

例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/。

在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/

URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POSTGETHEAD等等 —— 都将路由到相同的函数。

捕获的参数永远都是字符串

每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf 中:

url(r'^articles/(?P
[0-9]{4})/$', views.year_archive),

传递到视图函数views.year_archive() 中的year 参数永远是一个字符串类型。

 

三.反向解析

 

from django.shortcuts import reverseurl(r'^index6668888/$',views.index,name='index')# 可以给每一个路由与视图函数对应关系起一个名字# 这个名字能够唯一标识出对应的路径# 注意这个名字不能重复是唯一的

  前端使用

{% url 'index' %}{
% url '你给路由与视图函数对应关系起的别名' %}

  后端使用

reverse('index')reverse('你给路由与视图函数对应关系起的别名')

无名分组反向解析

url(r'^test/(\d+)/',views.test,name='list')

  后端使用

print(reverse('list',args=(10,)))

前端使用

{% url 'list' 10 %}

 

 

 

user_list = models.User.objects.all()

url(r'^edit/(\d+)/',views.edit,name='edit')

  前端模板语法

{%for user_obj in user_list%}{
% endfor %}

视图函数

from django.shortcuts import reversedef edit(request,edit_id):url = reverse('edit',args=(edit_id,))

模板

{% url 'edit' edit_id %}

有名分组反向解析

后端使用

# 后端有名分组和无名分组都可以用这种形式print(reverse('list',args=(10,)))# 下面这个了解即可print(reverse('list',kwargs={
'year':10}))

前端使用

# 前端有名分组和无名分组都可以用这种形式{% url 'list' 10 %}# 下面这个了解即可{% url 'list' year=10 %}

总结:针对有名分组与无名分组的反向解析统一采用一种格式即可

后端
reverse('list',args=(10,)) # 这里的数字通常都是数据的主键值
前端
{% url 'list' 10 %}
反向解析的本质:就是获取到一个能够访问名字所对应的视图函数

 

 

根据名字动态获取到对应路径

给路由起一个别名:用name参数

模板中可以用{% url 'index' %}动态加载

reverse('index',args=(10,)),可以向路由拼接数字

有名分组时二者都可以使用

注意元组的逗号

四.路由分发

在每个app下都有自己的urls.py文件,项目总url只负责分发给各个app即可,app需要注册在setting文件中。

django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹

项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发

from django.conf.urls import include# 路由分发 注意路由分发总路由千万不要$结尾url(r'^app01/',include(app01_urls)),url(r'^app02/',include(app02_urls))# 在应用下新建urls.py文件,在该文件内写路由与视图函数的对应关系即可from django.conf.urls import urlfrom app01 import viewsurlpatterns = [url(r'^index/',views.index)]

导入多个app时注意起别名,不然都是urls

如果是在app的url文件中定义的name,那么反向解析时,需要格式app_name:url_name,总路由也要加入命名空间

导包模式

原理:

五.名称空间

名称空间(了解)

url(r'^app01/',include(app01_urls,namespace='app01')),url(r'^app02/',include(app02_urls,namespace='app02'))

app01.urls.py

from django.conf.urls import urlfrom app01 import viewsurlpatterns = [url(r'^index/',views.index,name='index')]

app02.urls.py

from django.conf.urls import urlfrom app02 import viewsurlpatterns = [url(r'^index/',views.index,name='index')]

app01.views.py

reverse('app01:index')

app02.views.py

reverse('app02:index')

六.伪静态网页

把路由匹配加个.html就可以了

  搜索优化seo

url(r'^index.html',views.index,name='app01_index')

七.虚拟环境

每个项目对应一个环境,只有自己需要的包

是一个venv文件夹,相当于重新创建了一个python解释器

八.Django1.0和2.0的区别

django2.0的re_path和1.0的url一样

django2.0里面的path第一个参数不支持正则,你写什么就匹配,100%精准匹配

基本示例

这是一个简单的例子:

from django.urls import path  from . import views  urlpatterns = [      path('articles/2003/', views.special_case_2003),      path('articles/
/', views.year_archive), path('articles/
/
/', views.month_archive), path('articles/
/
/
/', views.article_detail),
  # path才支持,re_path不支持   path('order/
',views.order),]

基本规则:

  • 使用尖括号(<>)从url中捕获值。
  • 捕获值中可以包含一个转化器类型(converter type),比如使用 <int:name> 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
  • 无需添加前导斜杠。

以下是根据  而整理的示例分析表:(跟上面url的匹配关系)

path转化器

文档原文是Path converters,暂且翻译为转化器。

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?) 

注册自定义转化器

1.正则表达式

2.类
3.注册

对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  • regex 类属性,字符串类型
  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

例子:

class FourDigitYearConverter:      regex = '[0-9]{4}'      def to_python(self, value):          return int(value)      def to_url(self, value):          return '%04d' % value

使用register_converter 将其注册到URL配置中:

from django.urls import register_converter, path  from . import converters, views  register_converter(converters.FourDigitYearConverter, 'yyyy')  urlpatterns = [      path('articles/2003/', views.special_case_2003),      path('articles/
/', views.year_archive), ... ]

转载于:https://www.cnblogs.com/wangtenghui/p/10998838.html

你可能感兴趣的文章
通讯录(容量不可变)
查看>>
我的友情链接
查看>>
oracle mysql客户端——SqlDeveloper
查看>>
架设nagios+rrdtool+pnp4nagios监控windows主机
查看>>
UIView 使用NSLayoutConstraint 代码
查看>>
百度搜索结果图文标识规则分析
查看>>
PXE实现Linux的自动安装
查看>>
3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令
查看>>
nginx同域名代理tomcat不同目录下的文件
查看>>
mac环境下的linux光标快捷键
查看>>
[转载]交换机背板带宽计算方法
查看>>
Nginx容器日志收集方案fluentd+elasticsearch+kilbana
查看>>
python:LEGB标识符解析顺序
查看>>
其他linux
查看>>
存储过程中使用事务
查看>>
我的友情链接
查看>>
Spring MVC 单元调试和访问
查看>>
(gnome-ssh-askpass:609): Gtk-WARNING **: cannot open display:
查看>>
【转】×××精确校验JS
查看>>
Yii学习笔记:利用setFlash和runController打造个性化的提示信息页面
查看>>