Django 路由系统

基本格式

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

参数说明

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

路由匹配方式  

正则表达式的模糊匹配
分组匹配 () --> 相当于给视图函数传递位置参数
分组命名匹配 (?P<name>正则表达式) --> 相当于给视图函数传递关键字参

注意:
  1. 分组匹配和分组命名匹配不能混合使用

  2. URLconf 匹配的位置 : 无视域名和参数

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

  3. URLconf 不检查请求的方法

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

  5. 视图函数中可指定默认值

# urls.py中
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# views.py中,可以为num指定默认值
def page(request, num=""):
pass

正则表达式详解

基本示例

from django.urls import re_path
from app01 import views
urlpatterns = [
re_path(r'articles/2003/$', views.special_case_2003), # 静态路由
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 动态路由
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # 动态路由
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail), # 动态路由
] 

注意事项

  • urlpatterns中元素按照从上往下逐一匹配正则表达式,匹配成功则不再继续
  • 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)
  • 最前面不需要加一个反斜线
  • 每个正则表达式前面的'r' 是可选的但是建议加上

补充说明

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

Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数

系统默认为True, 其作用就是自动在网址结尾加 '/'

# urls.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
]
# 访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。
# 如果在settings.py中设置了 APPEND_SLASH=False,
# 此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

  

分组命名匹配

基本语法

(?P<name>pattern)

实现功能

捕获的值作为关键字参数而不是位置参数传递给视图函数

示例

# urls中:
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # views中:
views.month_archive(request, year="", month="")

  

include 路由分流

引入其他 urls.py 文件

  当多个app的时候可以再 各app内部创建自己 urls.py

  在总的urls 中需要 导入分流的各app内部的urls.py

引入方式

from django.cinf.url import url,include

工作原理

当请求来了由主urls进行匹配,匹配到子urls后由子urls进行下一步匹配

示例

from django.conf.urls import include, url
from app01 import url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls')), # 可以包含其他的URLconfs文件 ]
# 当一个 app01/xxxx 的路径请求来了之后 会首先匹配到 ^app01/ 而后转向 app01.url 继续下一步匹配

反向解析 URL

本质上就是给url匹配模式起别名,然后用过别名拿到具体的URL路径

起别名     

在url匹配模式中,定义name="别名"

url(r'^home', views.home, name='home'),         # 给url匹配模式起名为 home
url(r'^index/(\d*)', views.index, name='index'),   # 给url匹配模式起名为index

 

通过别名拿到具体路径

1. 模板语言中:

// 直接取到路径
{% url "别名" %}    // 通过别名拿到具体路径
// 如果urls中有位置参数或者关键字参数
{% url "别名" 2018 "nb" %}

2. 视图函数中

# 首先要导入
django.utils import reverse # 直接取到路径:
reverse("别名") # 通过别名拿到具体路径 # 如果urls中有位置参数或者关键字参数,依然可以传值
# 传位置参数:
reverse("别名", args=(2018, "nb"))
# 传关键字参数:
reverse("别名" kwargs={"year": 2018, "title": "nb"})

  

命名空间

即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL

示例

#  project中的urls.py
from django.conf.urls import url, include
urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
] # app01中的urls.py
from django.conf.urls import url
from app01 import views
app_name = 'app01'
urlpatterns = [
url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
] # app02中的urls.py
from django.conf.urls import url
from app02 import views
app_name = 'app02'
urlpatterns = [
url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

场景分析

app01 和 app02 中都有相同的 别名 "detail"

boss 打滚ing : 我就是想要一样的

在用别名回调url的时候会冲突, 此时需要另一种方式进行区分

工作原理

为了区分,在总的 urls 上做命名空间,

在原有的别名基础上需要加上命名空间的预定值才可以正确取到路径

 

// 模板中使用:
{% url 'app01:detail' pk=12 pp=99 %} # views中的函数中使用
v = reverse('app01:detail', kwargs={'pk':11})

 

Django 路由系统的更多相关文章

  1. Django路由系统

    django路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从 ...

  2. Python学习---Django路由系统【all】

    Django URL (路由系统) Django URL (路由系统): URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映 ...

  3. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  4. Django路由系统-分组命名匹配

    Django路由系统 分组命名匹配 ​ 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/( ...

  5. Django路由系统-URLconf配置、正则表达式简述

    Django路由系统 1.11版本官方文档 ​ URL配置就像是Django项目的目录,它的本质是URL与URL调用的函数之间的映射表,Django会根据URL配置,在遇到一个URL时,就去执行相应的 ...

  6. django 路由系统,数据库操作

    一.修改配置 数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': ...

  7. python的Web框架:Django路由系统以及模板导入

    Django的路由系统 当一个请求来到时 当一个请求来到时 1.首先到项目目录下的urls.py(根URLconf模块)中,查找路由规则: 2.根URELcof模块,里面定义了 urlpatterns ...

  8. Django 路由系统URL 视图views

    一.Django URL (路由系统) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Djan ...

  9. python 终极篇 --- django 路由系统

                          URL配置                        基本格式: from django.conf.urls import url urlpattern ...

随机推荐

  1. 下载Dynamics 365 Customer Engagement 工具

    微软动态CRM专家罗勇 ,回复312或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 从Dynamics ...

  2. ABP大型项目实战(1) - 目录

    前面我写了<如何用ABP框架快速完成项目>系列文章,讲述了如何用ABP快速完成项目.   然后我收到很多反馈,其中一个被经常问到的问题就是,“看了你的课程,发现ABP的优势是快速开发,那么 ...

  3. AS使用自带虚拟机报错解决

    Android studio自带的Google虚拟机越来越好用了,所以可以打开这个功能,想用的时候打开使用即可 使用的过程中经常会遇到这样的问题: 19:26 Emulator: emulator: ...

  4. 设计模式系列之策略模式(Strategy Pattern)

    意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它 ...

  5. ffmpeg相关函数整理

    1.av_read_frame() 该函数用于读取具体的音/视频帧数据,从流中读取数据帧到 AVPacket,AVPacket保存仍然是未解码的数据 int av_read_frame(AVForma ...

  6. https协议详解

    HTTPS协议建立过程 1) 客户端首次发送请求时,由于客户端(浏览器等)对一些加解密算法的支持程度不一样,但是在TLS传输中必须使用相同的加解密算法,所以在TLS握手的阶段,客户端告诉服务器端自己支 ...

  7. 【Python 22】52周存钱挑战2.0(列表list和math函数)

    1.案例描述 按照52周存钱法,存钱人必须在一年52周内,每周递存10元.例如,第一周存10元,第二周存20元,第三周存30元,直到第52周存520元. 记录52周后能存多少钱?即10+20+30+. ...

  8. 【Python 06】汇率兑换1.0-1(IPO与字符串转数字)

    1.案例描述 设计一个汇率换算器程序,功能是将外币换算成人民币. 2.案例分析 将问题划分为输入.处理及输出三部分(IPO) 3.上机实验 rmb_str_value = input('请输入人民币( ...

  9. web框架开发-Django的Forms组件

    校验字段功能 针对一个实例:用户注册. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) ...

  10. 【jq】prop和attr的区别

    prop()函数的结果: 1.如果有相应的属性,返回指定属性值. 2.如果没有相应的属性,返回值是空字符串. attr()函数的结果: 1.如果有相应的属性,返回指定属性值. 2.如果没有相应的属性, ...