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. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  2. iOS----------禁止输入汉字

    说明: ^.*[\u4e00-\u9fa5].*$ 是否包含中文^[\u4E00-\u9FA5]+$ 是否全中文 - (BOOL)textField:(UITextField *)textField ...

  3. 浅谈SPA

    最近一直在学习关于Vue的一些知识,由于遇到了问题,去网上查找资料,收获颇丰,在此分享. 1. 什么是SPA? 单页Web应用(single page web application, SPA),就是 ...

  4. shell判断USB接口是否有设备插入

    #/bin/sh usb_num=$(cat /proc/scsi/scsi | grep "Vendor" | wc -l)if [ $usb_num = 2 ];then    ...

  5. Linux 中磁盘阵列RAID10配置

    首先,了解一下RAID是什么?(百度所得) 独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地 ...

  6. sql取指定时间段内的所有月份

    declare @begin datetime,@end datetime set @begin='2017-01-01' set @end='2019-03-04' declare @months ...

  7. Python高级应用(3)—— 为你的项目添加验证码

    验证码简介 验证码的作用: 验证码在现在来说,是很常见的东西,可以一定程度的保护网站,比如防止网络爬虫恶意爬取网站数据啊,减少低级的攻击啊什么的.但是高级点的骚操作还是不太好防范,所以现在的验证码平台 ...

  8. js动态创建元素之一--document.write

    以我曾经写过的例子举例 如上图,乡镇街道的名字和数目是根据数据库的数据获取的,有几个乡镇,就会显示出来几个,这就要求动态获取乡镇名称和数目,以下代码中用到了document.write创建动态页面,在 ...

  9. RabbitMQ广播:topic模式

    topic模式跟direct差不多,只是把type改一下就行. direct是把固定的routing_key跟queue绑定,topic是把模糊的routing_key跟queue绑定 原理图: 发布 ...

  10. shell中的EOF用法

    重定位运算符 >> 是追加内容> 是覆盖原有内容 1.EOF Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止 ...