Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间

一丶URLconf配置

      URL配置是支撑网站的目录,本质是URL与该URL调用的视图函数之间的映射表

urlconf的格式

from django.conf.urls import url

urlpatterns = [
# url() 是包含 请求的url和视图的对应关系的函数
# def url(regex, view, kwargs=None, name=None):
url(正则表达式, views视图,参数,别名),
] ### 参数解释:
# 正则表达式 : 一个正则表达式字符串
# views视图: 一个可以调用的对象(最终执行的还是view函数), 或者是一个函数
# kwargs参数: 需要传给视图的参数.以字典形式传递
# name 别名 : 给当前的函数起一个名字, 用于做反向解析 ### 示例如 Django的版本1.X
from django.conf.urls import url
from . import views
# urlpatterns 是存放这些对应关系表
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
] ### 注意 在Django2.X版本
# re_path 和 url 具有相同的用法,正则路径
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),
]

   Django的urlpatterns说明

二丶正则表达式

# 示例:
from django.conf.urls import url from . import views urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
] # 正则符号简单说明:
^XX 以XX开头
$XX 以XX结尾
() 分组
+ 匹配1个或多个
\ 下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。
\d+ 匹配一个或多个数字
\w+ 匹配数字字母下划线
[0-9] 0-9数字任意一个
[0-9a-zA-z] #大小写字母数字,任意一个.
{3} # 3个
{0,4} # 范围 0-4个

说明

# 1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。

# 2.若是从url捕获一个值,只需要在其周围放置一个() ,表示分组. 如:'(\w+)/(\d+)',分了两个组,意味着在视图函数中需要接受两个参数

# 3.不需要在url前添加前导的反斜杠,每个url都有,有Django自动添加.例:是'^XXX'这样,而不是'^/xxx'这样

# 4.每个正则表达式前面的'r' 是可选的但是建议加上。  r表示不转义

# ps:
分组之后,参数传递是按照位置参数去传递
def xxx(request,x1,x2): # x1和x2的位置不能变,接收参数的顺序位置不能乱
#### 补充:
# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
APPEND_SLASH=True
# Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。 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)
# name是组的名称,
# pattern是要匹配的模式。

分组命名

from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
] # 说明: 命名分组的捕获的参数是关键字参数.
def XXX(request,year,month,day) # 作为关键字参数传递 ,year=XXXX,month=YY,顺序位置任意

URLconf匹配的位置

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

例如,http://www.example.com/myapp/ 请求中,URLconf 将查找 /myapp/ 。

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

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

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

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

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),  # year 参数 始终是一个字符串

视图函数中指定默认值

# 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指定默认值. 接收num不存在时,使用默认值
def page(request, num="1"):
pass

include其他的URLconfs

#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones. #For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs: from django.conf.urls import include, url urlpatterns = [ # 路由分发 include 包含 app01下的url.py的所有的 请求和函数对应关系
# namspace 表示: app01的名称空间 使用时'app01:XXX'
# url函数:url(regex, view, kwargs=None, name=None):
url(r'^app01/', include('app01.urls',namespace='app01')), # 可以包含其他的URLconfs文件
]

四丶传递额外的参数给视图函数

      即:从url给视图函数传递关键字参数

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
] #对于请求:/blog/2019/
Django 将调用views.year_archive(request, year='2019', foo='bar')。
当传递额外参数的字典中的参数和URL中捕获值的命名关键字参数同名时,函数调用时将使用的是字典中的参数,而不是URL中捕获的参数。 # 即是 后面的更新替换 前面的值.

五丶命名url和url的反向解析

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

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

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

​         1.根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。

​         2.根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。

# 在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.在模板中:使用url模板标签。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.在Python 代码中:使用django.core.urlresolvers.reverse() 函数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法。 # PS: 解析url时,或者反向解析url时.都得到一个完整的路径

举'栗'子:

url(r'^home', views.home, name='home'),  # 给我的url匹配模式起名为 home
url(r'^index/(\d*)', views.index, name='index'), # 给我的url匹配模式起名为index # 模板页面
语法:{% url '别名' %} ,如{% url 'home' 参数1 参数2 %} # view视图函数
语法:
from django.urls import reverse
reverse('别名', args=("2018", ))# args 是接收一个元组参数,反向生成url时传递的位置参数.
### urls.py
urlpatterns = [
# 一个位置参数
url(r'^publish_edit/(\d+)',views.PublishEdit.as_view(),name='publish_edit'), # 一个位置参数,一个关键字参数
url(r'^(\w+)_del/(?P<pk>\d+)/$', views.delete, name='delete'), ] ### views.py 视图函数
# cbv 接收参数
class PublishEdit(View): def get(self, request,pk):
ret = models.Publisher.objects.filter(pk=pk).first()
....
return render(request, 'publish_edit.html', res) def post(self, request,pk):
ret = models.Publisher.objects.filter(pk=pk).first()
.....
return redirect(reverse('app01:publisher')) # 反向解析 'app01/publisher/' 得到一个完整的路径 #fbv 接收参数 table, pk
def delete(request,table,pk):
tab=getattr(models,table.capitalize()) # 通过反射去获取models的类名
obj = tab.objects.filter(pk=pk).first()
if not obj:
return HttpResponse('醒醒,删啥呢~~')
obj.delete() # 由于使用了 namespace 所以要 拼接反向解析的url : reverse('app01:'+table+'') ,
return redirect(reverse('app01:'+table+'')) #反向解析 ### 页面模板
# 使用模板标签语法: url 别名(注意名称空间) 参数1 参数 2
<a href="{% url 'app01:publish_edit' publish.pk %}">编辑</a> # 使用模板标签语法: url 别名(注意名称空间) 参数1
<a href="{% url 'app01:delete' 'publisher' publish.pk %}">删除</a>

​      注意:

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

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

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

六丶命名空间

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

​   要求 ps:

​         1.在最开始编写项目时,把名称空间写好.

​         2.编写名称空间是方便多人开发. 有可能出现相同的函数名.为了区别,故才使用名称空间

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')
] ### PS:现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL。

名称空间语法:

# 模版中使用
{% url 'app01:detail' pk=12 pp=99 %}
{% url 'app02:detail' pk=11 p2=99 %} # views函数中使用
v1 = reverse('app01:detail', kwargs={'pk':11})
v2 = reverse('app02:detail', kwargs={'pk':11}) #

Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间的更多相关文章

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

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

  2. 解析Django路由层URLconf

    目录: 一  Django中路由的作用 二  路由的分组 三  路由分发 四  反向解析 五  名称空间 六  Django2.0版的path 一.Django中路由的作用 URL配置(URLconf ...

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

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

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

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

  5. Django 路由系统(URL)

    介绍 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告 ...

  6. python django 路由系统

    URL配置                        基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views ...

  7. Django路由系统的简介与使用

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL 与 为该URL调用的视图函数之间的映射表. ...

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

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

  9. Django 路由层(urlconf)

    Django 的路由层(URLconf) URL配置(conf)就像是Django所支撑的网站的目录; 本质就是:URL与调用该URL执行的视图函数的映射表; 通俗的讲:就是用户使用哪个url,URL ...

随机推荐

  1. 使用Supervisor管理Django应用进程

    官方文档 1.安装 pip install supervisor 2.使用说明 2.1  查看默认配置 echo_supervisord_conf 一般情况下,不需要去修改默认配置,而是将默认配置重定 ...

  2. destoon搜索伪静态失败解决办法

    今天给一个朋友调试DT6.0内核的站点,搜索中文出现http 403 forbidden,找了半天,很纳闷,最后一个一个查看源代码总算找到,在此分享给大家! 解决的方法: 1.找到include/sa ...

  3. JMeter【第五篇】关联:5种方法

    前几天在Q群里看到群友发的最近10年性能测试工具使用率的统计,最近的2018年,jmeter+loadrunner占了93%的使用率,说明这两个是主流,其中,jmeter的使用率逐年提升,现在已经超过 ...

  4. TensorFlow Lite for Android示例

    一.TensorFlow  Lite TensorFlow Lite 是用于移动设备和嵌入式设备的轻量级解决方案.TensorFlow Lite 支持 Android.iOS 甚至树莓派等多种平台. ...

  5. VMware遇到的一连串问题

    之前正常运行的VMware,再次打开提示“VMware Workstation pro 无法在 windows 上运行”, 百度一波,原来是微软的更新程序引起的问题,只要将最近的一次更新程序卸载然后重 ...

  6. LeetCode 622. Design Circular Queue

    原题链接在这里:https://leetcode.com/problems/design-circular-queue/ 题目: Design your implementation of the c ...

  7. wireshark-wincap安装问题

    winpcap关键模块 32位系统: C:\Windows\system32\wpcap.dll C:\Windows\system32\Packet.dll C:\Windows\system32\ ...

  8. ESP8266 LUA脚本语言开发: 准备工作-官网获取LUA固件

    前言 这节咱去官网上获取lua开发的固件. 官网下载 下面是我以前写的,咱不使用官网下载的固件,咱使用自己编译的固件.. 填写好自己的的邮箱地址,然后选择好自己需要的功能,一会编译好的固件就会发到您的 ...

  9. Flask 中的 request 之 先知道有这么个东西

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  10. DDD(Domain Driven Design) 架构设计

    一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XXUI.dll.X ...