Django框架(四)—— 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不一样版本的Django区别

路由控制

1、简单路由配置

url(r'^booklist$', views.booklist)
  • 第一个参数是正则表达式,第二个参数是视图函数
  • 每一个正则表达式前面的'r' 是可选的可是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不该该转义
url(r'booklist', views.booklist) url(r'booklistadd', views.booklistadd)

若是不加^ 和 $ ,因为路由匹配是从上往下匹配的,如果要匹配 booklistadd ,则极可能会匹配到booklist就会中止匹配html

2、无名分组

url(r'^booklist/([0-9]{4})/([0-9]{2})/$', views.booklist) def booklist(request, a, b) 或者 def booklist(request, *args)
  • 按位置传参
  • () 表示分组,分组后,会把分组出来的数据当作位置参数,传递到视图函数
  • 视图函数中必需要有位置参数接收分组出来的数据。因为分组出来的数据可能有不少,因此也能够用 *args 来用一个元组接收全部数据。

3、有名分组

url(r'^booklist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.booklist) def booklist(request, year, month)
  • 按关键字传参
  • 分组后,会把分组出来的数据按关键字传参,传递到视图函数
  • 视图函数须要定义形参来接收,而且视图函数中形参的名字要跟分组的名字同样,与顺序无关

4、反向解析

一、什么是反向解析

在Django中,常常须要获取某条URL,为生成的内容配置URL连接。python

urlpatterns =[ url ( r'^booklist$', views.booklist ) , ]正则表达式

如在a标签中,<a href='/booklist/'>,假若url发生了变化,就必需要去html中手动修改a的href,这样会浪费大量的工做时间。所以,Django提供一种方案,在url中提供一个name参数,至关因而给url取了一个名字。django

url(r'^booklist$', views.booklist,name='book_url')

二、使用反向解析获取url

(1)三种url
# 1.无参 url(r'^booklist$', views.booklist,name='book_url') # 2.有参,无名分组 url(r'^userlist/([0-9]{4})/([0-9]{2})/$',views.userlist,name='user_url') # 3.有参,有名分组 url(r'^manlist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.manlist,name='man_url')
(2)模板层
# 1.无参 <form action="{{% url 'book_url' %}}"> # 2.有参,无名分组, 2008 和 12 表示两个参数,即两个分组 {{% url 'user_url' 2008 12 %}} # 3.有参,有名分组 {{% url 'man_url' 2018 12 %}} 或者 {{% url 'man_url' year=2018 month=12 %}}
(3)视图层
from django.conf.urls import redirect,reverse # 1.无参 url=reverse('book_url') return redirect(url) # 2.有参,无名分组, 2008 和 12 表示两个参数,即两个分组 url=reverse('user_url',args=(2018,12,)) # 3.有参,有名分组 url=reverse('man_url',args=(2018,12,)) 或者 url=reverse('man_url',kwargs={'year':2018,'mounth':12})

5、路由分发

一、在不一样的app中建立子路由urls.pymarkdown

二、在总路由中配置app

from django.conf.urls import include url(r'^app01/',include('app01.urls')) url(r'^blog/',include('blog.urls'))

三、在不一样app的urls中配置路由函数

# 在app01中,urls.py url(r'booklist$',views.booklist) # 在blog中,urls.py url(r'userlist$',views.userlist)

6、名称空间(通常不使用)

一、什么是名称空间

命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不一样命名空间中的含义是互不相干的。post

# 总路由 url(r'^app01/',include('app01.urls',namespace='app01')) url(r'^blog/',include('blog.urls',namespace='blog'))
# 子路由 # app01中 url(r'^publish/$', views.publish,name='test') # blog中 url(r'userlist$',views.userlist,name='test') 

二、使用名称空间

名称空间 : 路由别名学习

视图层:url = reverse('blog:test') 模板层:{% url 'app01:test'%}

7、伪静态

为了更好的被搜索引擎收录而经过必定的规则,把动态页面的地址转换成以htm或html结尾的地址,看起来是静态的,实际是依然是动态页面。网站

例如访问http://127.0.0.1:8000/book/4.html,它看上去是静态网站,可是其实其中的数据是经过后台获取实时更新的。

# 路由,用html结尾 url(r'^book/(?P<id>\d+.html)',views.book),

8、Django 2.x和Django 1.x 路由层区别

一、Django2.x中

  • re_path:跟1.0的url用法相同
  • path:传的路径,是准确路径
urlpatterns = [path('test/',view.test), ]

二、转换器

5个转换器

path('test/<path:year>', views.re_test) # year 表示名字,path表示year是path类型的
str,匹配除了路径分隔符(/)以外的非空字符串,这是默认的形式
int,匹配正整数,包含0。 slug,匹配字母、数字以及横杠、下划线组成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

三、自定义转换器

# 1 定义一个类: class MyCon: # 写一个正则表达式 regex = '[0-9]{4}' # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收 def to_python(self, value): return int(value) # 反向解析用的 def to_url(self, value): return '%04d' % value # 2.注册转换器 from django.urls import register_converter register_converter(MyCon,'yyy') # 3.使用自定义转换器 path('test/<yyy:year>', views.re_test,name='test'),

9、APPEND_SLASH

# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项 APPEND_SLASH=True
  • Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其做用就是自动在网址结尾加'/'

  • 默认APPEND_SLASH = True,即会自动在网址末尾加上 ‘/’

如访问 https://www.cnblogs.com 时,默认会加上 ‘/’,至关于方位了 https://www.cnblogs.com/

若是设置了APPEND_SLASH = False,访问 https://www.cnblogs.com 就不会加’/‘,就找不到页面

博客内容仅供参考,部分参考他人优秀博文,仅供学习使用
相关文章
相关标签/搜索