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. 谷歌AI涉足艺术、太空、外科手术,再强调AI七原则

    谷歌AI涉足艺术.太空.外科手术,再强调AI七原则 https://mp.weixin.qq.com/s/MJG_SvKCEBKRvL3IWpL0bA 9月18日上午,Google在上海的2018世界 ...

  2. C#设置电脑时间帮助类

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  3. mybatis中:selectKey返回最近插入记录的id

    <insert id="insert" parameterType="com.lls.model.Employee"> <!-- select ...

  4. QT解析和组装json

    json这个小朋友熟悉又陌生,今天给同学们好好讲讲QT是如何使用json的,一句话:简单 1.什么是json? A:json就是个<key,value>字符串 ①一个json对象 {&qu ...

  5. 使用docker部署skywalking

    使用docker部署skywalking Intro 之前在本地搭建过一次 skywalking + elasticsearch ,但是想要迁移到别的机器上使用就很麻烦了,于是 docker 就成了很 ...

  6. Nodejs 操作 Sql Server

    Nodejs 操作 Sql Server Intro 最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据. ...

  7. 使用cmd查看电脑连接过的wifi密码(二)

    上次写了一个查看wifi的bat文件(https://www.cnblogs.com/feiquan/p/9823402.html),发现有个问题就没法保存到记事本,而且还要处理不同的系统语言,这次重 ...

  8. vue 用less

    https://blog.csdn.net/u013746071/article/details/79655042

  9. C# 里面swith的或者

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  10. copy 和 deepcopy的区别

    import copy a = [1, 2, 3, 4, ['a', 'b']] b = a # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变 c = copy.copy(a) # 浅复制, ...