一.路由基础

1.路由url函数:路由自上而下进行匹配;url(正则路径,视图函数内存地址,默认参数,路由别名)

2.路由正则:

规定开始:^  |  规定结束:$

#url(r'index', view.index) 可以匹配:/index/ | /abcindex/ | /indexabc/ | /aindexb/ 均可以匹配

#url(r'^index', view.index) 可以匹配:/index/ | /indexadc/ 均可以匹配

#r'^index$' 只能匹配index,不能匹配index/

#r'^index/$' 可以匹配index和index/(先拿index匹配,如果失败,会自动添加/再次进行匹配)

默认参数:是关键字参数,在视图函数中可以通过关键字参数进行接收

urls.py

#url(r'^index/$', views.index, {'num': 11})

view.py

# def index(request, num):
# pass

路由匹配是否会默认添加/:我们可以通过设置settings.py文件来进行修改

settings.py

# 先把中间件的 'django.middleware.common.CommonMiddleware' 关闭

# 然后新增:

APPEND_SLASH = False

二.有名无名分组

1.无名分组:r'^delete/(\d+)/(\d+)$'

# 路由:url(r'^delete/(\d+)/(\d+)$', views.delete)
#请求路径:/delete/1/2
#视图函数:def delete(request, n1, n2): # n1=1, n2=2

2.有名分组:r'^delete/(?P<id>\d+)/(?P<num>\d+)$'

# 路由:url(r'^delete/(?P<id>\d+)/(?P<num>\d+)$', views.delete)
#请求路径:/delete/1/2
#视图函数:def delete(request, id, num): # id=1, num=2 只能使用id,num来接收参数

注:路由正则不支持有名无名分组混用

三.多app共存的路由分配

1.创建多个app有三种方式:

#1.django-admin startapp app_name

#2.python3 manage.py startapp app_name

#3.Tools工具下的:run manage.py task...

2.在settings.py文件中配置INSTALLED_APPS,添加新建的应用:'app_name.apps.App_nameConfig'。注:app配置的顺序决定了(共同资源冲突下的)查找顺序

3.处理路由冲突

#在主路由中要配置多个app,要对视图函数调用起别名

from app01 import views as app01_views
from app02 import views as app02_views url(r'^app01/test_page/$', app01_views.test_page)
url(r'^app02/test_page/$', app02_views.test_page) # 如果不进行区分的话,它会自上而下进行匹配,最终匹配最后导入的views

四.多app共存时模板冲突问题

方式1:

在对应应用下建立自己的templates文件夹,再在templates下建立与应用名同名的文件夹,模板文件放在应用名同名的文件夹下。

方式2:

在项目根目录下的templates中建立每一个应用名同名的文件夹,每个应用的模板文件放在自己应用名文件夹下

#使用:render(request, 'app_name/test.html')

五.路由分发

目的:分担总路由的代码压力,将每个app的自身路由配置交给app自己的urls.py文件来管理(分文件管理路由)。

步骤:

1.在每一个应用中建立自身的urls.py文件,语法同主路由

2.在主路由中进行分发:

#主路由:
from django.conf.urls import include urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
] #注:主路由分发一定不能使用$正则语法,因为后面还要跟子路由的路径 #子路由(app01):
urlpatterns = [
url(r'^login/$', views.login) ]

六.路由别名

'''
1.有些路由会被大量访问(直接访问、间接访问)
2.这些路由可能后期还会发生变化
3.可以给路由设置别名,通过别名访问:<a href="{% url '路由别名' '传入有名无名分组所需参数' %}"></a>
''' # url(r'^index1/(?P<id>\d+)$', views.index, name='index') # 通过别名访问:<a href="{% url 'index' 1 %}"></a>

七.名称空间

'''
主路由:
from django.conf.urls import include
urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
] app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^test/', views.test, name='test')
] app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^test/', views.test, name='test')
] 前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')
'''

八.反向解析

'''
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径 # 1.不带分组:url(r'可能会变的真实路由', 视图函数, name='路由别名')
url = reverse('路由别名') # 2.无名分组:url(r'可能会变的真实路由(带无名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', args=(给无名分组赋值)) # 3.有名分组:url(r'可能会变的真实路由(带有名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})

九.2.x新特性

'''
from django.urls import path, re_path # 2.x版本
from django.conf.urls import url # 1.x版本,向下兼容,但不建议使用
urlpatterns = [
path('admin/', admin.site.urls),
] # 1. 2.x版本re_path的使用方式同1.x版本url
# 2. path写的是绝对字符串,请求地址必须与路由地址完全匹配
# 3. path拥有五个转换器:
-- str:匹配除路径分隔符(/)外的字符串,默认
-- int:匹配自然数
-- slug:匹配字母、数字、横杠及下划线组成的字符串
-- uuid:匹配uuid形式的数据
-- path:匹配任何字符串,包括路径分隔符(/) (不能用?)
'''

十.自定义转换器

'''
# 原因:自定义正则匹配目标路径 语法:
1.自定义类
# 匹配11位的185电话
class CVT185phone:
# 匹配过程
regex = '185\d{8}'
def to_python(self, value):
return int(value)
# 反解过程
def to_url(self, value):
return '%11d' % value # 在主路由中
from django.urls import register_converter
from 所在路径 import CVT185phone
register_converter(CVT185phone, 'phone185') path('page/<phone185:msg>/', views.page, name="pages")
'''

Django路由详解的更多相关文章

  1. Ocelot简易教程(三)之主要特性及路由详解

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...

  2. Django -- settings 详解

    Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运 ...

  3. Vue 路由详解

    Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...

  4. Django -- settings 详解(转)

    Django -- settings 详解   Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目 ...

  5. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...

  6. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  7. Express的路由详解

    Express的路由详解 http://www.jb51.net/article/76203.htm

  8. [转载]Ocelot简易教程(三)之主要特性及路由详解

    上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...

  9. Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 最近一段时间生病了,整天往医院跑,也没状态学东西了,现在是好了不少了,也该继续学习啦!!! ...

随机推荐

  1. Python实操

    有两个列表,分别存放报名学习linux和python课程的学生名字 linux=['钢弹','小壁虎','小虎比','alex','wupeiqi','yuanhao'] python=['drago ...

  2. 使用react 在页面上引用静态图片,图片不显示

    const url='../assets/logo.png'; <img src={url} alt=''/> 1.使用require <img src={require('../a ...

  3. bzoj 1856

    做这题之前先看道高考真题(好像是真题,我记不清了) 例:已知一个由n个0和n个1排列而成的数列,要求对于任意k∈N*且k∈[1,2n],在前k个数中1的个数不少于0的个数,求当n=4时这样的数列的数量 ...

  4. vue中引入css文件

    两种方式引入css文件,一种是直接在main.js中引入(也可以在其他的.vue文件中的<script></script>标签中),即下面这种写法: import 'eleme ...

  5. ajax请求数据时什么时候用GET,什么时候用POST

    GET的目的就如同其名字一样是用于获取信息的.它旨在显示出页面上你要阅读的信息.浏览器会缓冲GET请求的执行结果,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求.重新请求 ...

  6. Ubuntu 更改屏幕分辨率

    安装完Ubuntu后发现分辨率不合适,平时习惯了看小一点的文字,所以搜了一下修改屏幕分辨率的命令,具体操作如下: 1.先用 xrandr 命令查看一下当前系统支持的分辨率 wayde@wayde-Al ...

  7. 关于Mybaits10种通用的写法

    用来循环容器的标签forEach,查看例子 foreach元素的属性主要有item,index,collection,open,separator,close. item:集合中元素迭代时的别名, i ...

  8. js 图片转换base64 base64转换为file对象

    function getImgToBase64(url,callback){//将图片转换为Base64 var canvas = document.createElement('canvas'), ...

  9. DDD实践:领域事件

    要求:修改good表,添加 organization 基础定义 用于引发和调度事件的延迟方法 AddDomainEvent Domain\SeedWork\Entity.cs public abstr ...

  10. MyBatis - 1.入门

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis可以使用简单的XML或注解 ...