Django框架(四)—— 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别
路由控制
一、简单路由配置
url(r'^booklist$', views.booklist)
- 第一个参数是正则表达式,第二个参数是视图函数
- 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
url(r'booklist', views.booklist)
url(r'booklistadd', views.booklistadd)
如果不加^ 和 $ ,由于路由匹配是从上往下匹配的,若是要匹配 booklistadd ,则很可能会匹配到booklist就会停止匹配
二、无名分组
url(r'^booklist/([0-9]{4})/([0-9]{2})/$', views.booklist)
def booklist(request, a, b) 或者 def booklist(request, *args)
- 按位置传参
- () 表示分组,分组后,会把分组出来的数据当做位置参数,传递到视图函数
- 视图函数中必须要有位置参数接收分组出来的数据。由于分组出来的数据可能有很多,所以也可以用 *args 来用一个元组接收所有数据。
三、有名分组
url(r'^booklist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.booklist)
def booklist(request, year, month)
- 按关键字传参
- 分组后,会把分组出来的数据按关键字传参,传递到视图函数
- 视图函数需要定义形参来接收,并且视图函数中形参的名字要跟分组的名字一样,与顺序无关
四、反向解析
1、什么是反向解析
在Django中,经常需要获取某条URL,为生成的内容配置URL链接。
urlpatterns =[ url ( r'^booklist$', views.booklist ) , ]
如在a标签中,<a href='/booklist/'>,倘若url发生了变化,就必须要去html中手动修改a的href,这样会浪费大量的工作时间。因此,Django提供一种方案,在url中提供一个name参数,相当于是给url取了一个名字。
url(r'^booklist$', views.booklist,name='book_url')
2、使用反向解析获取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})
五、路由分发
1、在不同的app中创建子路由urls.py
2、在总路由中配置
from django.conf.urls import include
url(r'^app01/',include('app01.urls'))
url(r'^blog/',include('blog.urls'))
3、在不同app的urls中配置路由
# 在app01中,urls.py
url(r'booklist$',views.booklist)
# 在blog中,urls.py
url(r'userlist$',views.userlist)
六、名称空间(一般不使用)
1、什么是名称空间
命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。
# 总路由
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')
2、使用名称空间
名称空间 : 路由别名
视图层:url = reverse('blog:test')
模板层:{% url 'app01:test'%}
七、伪静态
为了更好的被搜索引擎收录而通过一定的规则,把动态页面的地址转换成以htm或html结尾的地址,看起来是静态的,实际是依然是动态页面。
例如访问http://127.0.0.1:8000/book/4.html,它看上去是静态网站,但是其实其中的数据是通过后台获取实时更新的。
# 路由,用html结尾
url(r'^book/(?P<id>\d+.html)',views.book),
八、Django 2.x和Django 1.x 路由层区别
1、Django2.x中
- re_path:跟1.0的url用法相同
- path:传的路径,是准确路径
urlpatterns = [path('test/',view.test), ]
2、转换器
5个转换器
path('test/<path:year>', views.re_test)
# year 表示名字,path表示year是path类型的
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
3、自定义转换器
# 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'),
九、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 就不会加’/‘,就找不到页面
Django框架(四)—— 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别的更多相关文章
- [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]
[Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...
- Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态
一.Django请求生命周期 二.路由层 urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- django之路由分组,反向解析,有名,无名分组
路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态的概念 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',vi ...
- Django学习——路由层之路由匹配、无名分组、有名分组、反向解析
路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
- 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- Django url反向解析与路由分发名称空间
url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...
- Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建
路由控制 一.简单路由配置 url(r'^booklist$', views.booklist) 第一个参数是正则表达式,第二个参数是视图函数 每个正则表达式前面的'r' 是可选的但是建议加上.它告诉 ...
随机推荐
- nginx logformat说明
记录一下nginx logformat的相关说明 log_format格式变量:$remote_addr #记录访问网站的客户端地址$remote_user #远程客户端用户名$time_loca ...
- 【扩展lucas定理】
洛谷模板题面:https://www.luogu.org/problemnew/show/P4720 扩展卢卡斯被用于解决模数为合数情形下的组合数问题. 首先我们把模数mod质因数分解,解决模每个素数 ...
- JS检查断网
window.addEventListener('load', function() { function updateOnlineStatus(event) { var condition = na ...
- Gitlab CI持续集成 - GitLab Runner 安装与注册
GitLab Runner安装 需要添加gitlab官方库: # For Debian/Ubuntu/Mint curl -L https://packages.gitlab.com/install/ ...
- axios interceptors 拦截 , 页面跳转, token 验证 Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示)
Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示) :https://blog.csdn.net/H1069495874/article/details/80057107 ...
- Myeclipse中dtd代码提示
1.Myeclipse -->窗口 --> 首选项 2.输入xml c,然后添加 3.输入键 例如:http://struts.apache.org/dtds/struts-2.3.dtd ...
- Redis Sentinel 高可用方案
redis 主从复制的问题 Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用: 1,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来. 2,扩展主节点的读能力,分担主节点读压 ...
- Electron 常见问题
导读: 以下记录了作者在实践中遇到的问题和最后的解决方法,如果有错误或者更新更完美的解决方案,欢迎留言指正.交流. 1.jQuery/RequireJS/Meteor/AngularJS 的问题 jQ ...
- 使用Nuget重新安装packages.config中的组件的方法
Update-Package -ProjectName 'Ko.app.web' -Reinstall 该语句作用:按照packages.config中给出的程序组件,重新下载安装一遍.
- javafx实现读者文摘上的文章预览及下载
功能设计: 1.实现读者文章的预览及下载 (实现了单击预览,双击下载) 2.实现文章查找 (实现了通过文章名查找(关键字)或者文章期数或年份(或者年份加期数)) 实现步骤: 首先是数据库设计: 数据库 ...