一.路由基础

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. LeetCode(85):最大矩形

    Hard! 题目描述: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0",&quo ...

  2. tomcat 报错处理

    一.tomcat报错找不到资源集市 原因:tomcat的配置文件sever.xml 里的 docbase配置被Eclispe修改了 解决方法:修改回来 <Context docBase=&quo ...

  3. 浏览器URL中 encodeURIComponent()加密和decodeURIComponent()解码

    encodeURIComponent()加密 定义和用法 encodeURIComponent() 函数可把字符串作为 URI 组件进行编码. 语法 encodeURIComponent(URIstr ...

  4. jmeter 获取数据库表数据作为参数

    jmeter - 获取数据库表数据作为参数 在jmeter中使用数据库表数据首先需要设置数据库连接,然后在创建JDBC取样器 1.创建配置元件 JDBC Connection Configuratio ...

  5. linux基础练习题(1)

    Linux命令作业(关卡一) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 简述什么是OS 简述应用程序.硬件.OS的关系 列举出3种常见的操作系统 简述Ubuntu和Linux的关系 ...

  6. How does exercise keep your brain young?

    Exercise may protect the brain from disease and dementia as we age, but the mechanisms behind its be ...

  7. Linux进程管理工具

    Linux进程管理工具 Htop yum install htop 参考帮助: http://blog.csdn.net/skh2015java/article/details/53173896 Li ...

  8. Ubuntu16.04安装配置和使用ctags

    Ubuntu16.04安装配置和使用ctags by ChrisZZ ctags可以用于在vim中的函数定义跳转.在ubuntu16.04下默认提供的ctags是很老很旧的ctags,快要发霉的版本( ...

  9. python no module named builtins

    使用python2时出现此错误. 解决办法: pip install future

  10. PaperNotes Instance-Level Salient Object Segmentation

    title: PaperNotes Instance-Level Salient Object Segmentation comments: true date: 2017-12-20 13:53:1 ...