@


Django 1.1版本 URLConf官方文档

URL配置(URLconf)就像Django所支撑网站的目录,它的本质是URL与要为调用的视图函数之间的映射表.

我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数.


URLconf配置

基本格式:

from django.conf.urls import url

urlpatterns = [
url(正则表达式, views视图, 参数, 别名),
]

参数说明:

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

注意:

Django 2.0版本中的路由系统是下面的写法(官方文档):

from django.urls import path, re_path

urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

2.0版本中的re_path和1.11版本的url是一样的用法.


正则表达式详解

基本配置:

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^test/[0-9]{4}/[0-9]{2}/$', views.test),
url(r'^test/([0-9]{4})/$', views.test),
url(r'^test/([0-9]{4})/([0-9]{2})/$', views.test),
url(r'^test/([0-9]{4})/([0-9]{2})/([0-9]{2})/$', views.test),
]

注意事项:

  1. urlpatterns列表中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续.
  2. 若要从URL中获取一个值,只需要在它周围放置一对圆括号(分组匹配).
  3. 不需要在匹配规则前面加斜杠(/),因为每个URL都有,例如应该这样写:" ^articles",而不是" ^/articles".
  4. 每个正则表达式前面的"r",是可选的,但建议加上.

补充说明:

是否开启URL访问地址后面不为"/"时跳转至带有"/"的路径的配置项:

APPEND_SLASH = True

Django的settings.py文件中默认没有APPEND_SLASH这个参数,但此参数默认为开启状态,其作用是自动在网址结尾加"/".


分组命名匹配

像上面的示例,使用的是正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图.

在更高级的用法中,可以使用分组命名匹配的正则表达式组来捕获URL中的值,并以关键字参数形式传递给视图.

在Python的正则表达式中,分组命名正则表达式组的语法是 (?P<name>pattern),其中 name 是组的名称,pattern 是要匹配的模式.

下面是以上(基本配置)URLconf使用命名组的重写:

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^test/(?P<year>[0-9]{4})/$', views.test),
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.test),
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.test),
]

这种实现方式与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键值参数而不是位置参数传递给视图函数.

例如,针对 URL /articles/2019/10/ 相当于按以下方式调用视图函数:

views.test(request, year='2019', month='10')

在实际应用中,使用分组命名匹配的方式可以让你的URLconf更加明晰且不容易产生参数顺序问题的错误,但是有些开发人员则认为分组命名语法太丑陋、繁琐。

至于究竟应该使用哪一种,你可以根据自己的喜好来决定。

URLconf匹配的位置:

URLconf在请求的URL上查找,将它当作一个普通的Python字符串,不包括GET和POST参数以及域名.

例如:

URL地址为 https:/ /blog.csdn.net/test/ 的请求中,URLconf将查找/test/

URL地址为 https:/ /blog.csdn.net/test/?name=zyk 的请求中,URLconf仍将查找/test/

URLconf不检查请求的方法。换句话讲,所有的请求方法——同一个URL的POST、GET、HEAD等等,都将路由到相同的函数.

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

每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配的方式。例如,下面这行URLconf中:

url(r'^test/(?P<year>[0-9]{4})/$', views.test),

传递给视图函数 views.test() 中的 year 参数永远是一个字符串类型.

视图函数中指定默认值
from django.conf.urls import url
from . import views urlpatterns = [
url(r'^test/$', views.test),
url(r'^test/(?P<num>[0-9]+)/$', views.test),
]

在上面的例子中,两个URL模式指向相同的view(view.test),但是第一个模式并没有从URL中捕获任何东西.

如果第一个模式匹配上了,test()函数将使用其默认参数num='1';如果第二个模式匹配上了,test()将使用正则表达式捕获到的num值.

include其它的URLconfs

指定到别的URLconf文件进行,例如在默认的urls.py文件写如下匹配规则:

from django.conf.urls import url, include
from blog01 import views urlpatterns = [
url(r'blog01/', include('blog01.urls')),
]

将所有路径为 blog01 开头的URL指向blog01下urls.py文件中去匹配.

传递额外参数给视图函数

URLconfs具有一个钩子,可以让我们传递一个Python字典作为额外的参数传递给视图函数.

django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数,如下:

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^test/$', views.test),
url(r'^test/(?P<year>[0-9]{4})/$', views.test, {'month': '10'}),
]

在这个例子中,对于URL地址为 /test/2019/ 的请求,Django将调用views.year_archive(request, year='2019', {'month': '10'})

当传递额外参数的字典中的参数与URL中捕获值的命名关键字参数同名时,函数调用将使用字典的参数,而不是URL中捕获的参数.


命名URL 与 URL反向解析

在使用Django 项目时,一个常见的需求是获得URL的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。

.

人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

换句话讲,需要的是一个DRY 机制。除了其它有点,它还允许设计的URL 可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。

.

获取一个URL 最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL 的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。

.

.Django 提供一个办法是让URL 映射是URL 设计唯一的地方。你填充你的URLconf,然后可以双向使用它:

.

  • 根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。
  • 根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。

.

第一种方式是我们在前面的章节中一直讨论的用法。第二种方式叫做反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查。

.

在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

.

. - 在模版中:使用url模版标签.

  • 在Python代码中:使用django.core.urlresolvers.reverse()函数.
  • 在更高层的与处理Django模型实例相关的代码中:使用ge t_absolute_url()方法.

上面说了一大堆,你可能并没有看懂。(那是官方文档的生硬翻译)。

简单来说:

就是可以给我们的URL匹配规则起个名字(一个URL匹配模式起一个名字).

这样我们以后就不需要写死URL代码了,只需要通过 调用起的名字 来调用当前的URL.

例如:

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

在模版中这样引用:

{% url 'home' %}
{% url 'index' 2019 %}
{% url 'index' key=2019 %}

在视图中这样引用:

from django.urls import reverse
reverse('index', args=('2019',))
reverse('index', kwargs={key: '2019'})

图文示例(在模版中引用):





拿上面的例子来说,如果出于某种原因决定按年归档文章发布的URL应该调整一下,那么你将只需要修改URLconf 中的内容。

在某些场景中,一个视图是通用的,所以在URL 和视图之间存在多对一的关系。对于这些情况,当反查URL 时,只有视图的名字还不够。

注意:

为了完成上面例子中的URL反查,你将需要使用命名的URL模式。URL的名称使用的字符串可以包含任何你喜欢的字符,不限制在合法的Python名称.

当命名URL模式时,确保使用的名称不会与其它应用中的名称冲突。如果你的URL模式叫做 comment, 而另外一个应用中也有一个同样的名称,那么当你在模版中使用这个名称时,不能保证将插入哪个URL.

因此,在URL名称中加上一个前缀,比如应用的名称,将减少冲突的可能。我们建议使用myapp-comment,而不是comment.

命名空间模式

即使不同的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')
]

现在,我的两个app中url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL.

语法: "命名空间名称:URL名称"

模版中使用:

{% url 'app01:detail' pk=12 pp=99 %}

views中的函数中使用:

v = reverse('app01:detail', kwargs={'pk': 11})

这样即使app中URL的命名相同,我们也可以反转得到正确的URL.



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

  1. Django路由系统

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

  2. Django 路由系统

    Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. Django 路由系统URL 视图views

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

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

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

随机推荐

  1. [MST] Create an Entry Form to Add Models to the State Tree

    It is time to add new entries to the wishlist. We will achieve this by reusing forms and models we'v ...

  2. 递归神经网络——就是解决AST这样的问题

    原文:https://zybuluo.com/hanbingtao/note/626300 有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』: 上图显示了这句话的两个不同的语法 ...

  3. 构造函数的理解(构造函数与 init 方法)

    0. 构造函数与 init 方法 构造方法内部禁止添加任何业务逻辑,如果有业务逻辑,请放在 init 方法中: 1. 构造函数的参数 以下为一个堆实现优先队列(堆的实现借助完全二叉树,而完全二叉树又可 ...

  4. Ajax的几种形式 和使用情况

    Ajax的几种形式: 1       $.get( "Login.ashx", {Name:name,Pwd:pwd,action:x}, function(data){这里用da ...

  5. 《剑指offer》数值的整数次方

    一.题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.输入 double base, int exponent 三.输出 b ...

  6. CMake入门之创建一个基于PCL的最小工程

    最近在学习PCL,借助Cmake可省去繁琐的添加包含目录和依赖库操作. 一个典型的CMakeLists.txt内容通常为: cmake_minimum_required(VERSION 2.6 FAT ...

  7. hive parquet table 配置使用压缩

    创建parquet table : create table mytable(a int,b int) STORED AS PARQUET; 创建带压缩的parquet table: create t ...

  8. windows gitbub使用

    1.安装git bush (windows没什么好说的 下一步,下一步,,) 2. 通过gitbush命令行生成密钥: (拷贝密钥) 3.密钥添加到github上面: 4.克隆项目: 5.提交: 查看 ...

  9. Division Game UVA - 11859 Nim

    Code: #include<cstdio> #include<algorithm> using namespace std; #define maxn 10005 int n ...

  10. 俩层判断,判断button是否可以点击

    描述如下: 当被保人数超过三个人并且input是必填项的时候button是disable为false的 代码如下: //起保日期 $('.pickerfour').on('tap', function ...