1、工作原理

django通过urlconf来映射视图函数,只区分路径,不区分http方法

  • Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值。
  • Django加载该URLconf模块并查找变量 urlpatterns,它是一个列表django.urls.path() 和 / 或django.urls.re_path()实例。根据列表的实例查找相关的路劲。
  • Django按顺序遍历每个URL模式,并停在与请求的URL匹配的第一个URL模式,后面相同的模式不会再进行匹配。
  • 如果某个URL模式匹配成功,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图方法)。

2、简单示例:

from django.urls import path

from . import views

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

在上述路由中,有几点需要注意:

(1)从URL中捕获,使用尖括号。

(2)捕获的值可以包含转换器,如/<int:year>/,前面的int表示只能是整数参数,year是参数的名称,用于视图函数的参数传递

(3)path的路径前不需要再添加“/”,

(4)示例说明

blog/2003/匹配的是path('blog/2003/', views.special_2003),而blog/2005/匹配的是path('blog/<int:year>/', views.year_archive),

3、格式转换器

在上面的示例中,我们已经看到了int这个格式转换器的用法,格式转换器还有:

str:匹配任何非空字符串,不包括路径分隔符'/'。表达式中不包含转换器,则默认为str。

int:匹配零或任何正整数。返回一个int。

slug:匹配由ASCII字母或数字组成的字符串,以及横线和下划线字符。例如, building-your-1st-django_url。

uuid:匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号,并且字母必须是小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。

path:匹配任何非空字符串,包括路径分隔符 '/',可以匹配完整的URL路径,而不仅仅是URL路径的一部分str,使用时要谨慎,因为可能造成后续的所有url匹配都失效。

------------恢复内容开始------------

1、工作原理

django通过urlconf来映射视图函数,只区分路径,不区分http方法

  • Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值。
  • Django加载该URLconf模块并查找变量 urlpatterns,它是一个列表django.urls.path() 和 / 或django.urls.re_path()实例。根据列表的实例查找相关的路劲。
  • Django按顺序遍历每个URL模式,并停在与请求的URL匹配的第一个URL模式,后面相同的模式不会再进行匹配。
  • 如果某个URL模式匹配成功,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图方法)。

2、简单示例:

from django.urls import path

from . import views

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

在上述路由中,有几点需要注意:

(1)从URL中捕获,使用尖括号。

(2)捕获的值可以包含转换器,如/<int:year>/,前面的int表示只能是整数参数,year是参数的名称,用于视图函数的参数传递

(3)path的路径前不需要再添加“/”,

(4)示例说明

blog/2003/匹配的是path('blog/2003/', views.special_2003),而blog/2005/匹配的是path('blog/<int:year>/', views.year_archive),

3、格式转换器

在上面的示例中,我们已经看到了int这个格式转换器的用法,格式转换器还有:

str:匹配任何非空字符串,不包括路径分隔符'/'。表达式中不包含转换器,则默认为str。

int:匹配零或任何正整数。返回一个int。

slug:匹配由ASCII字母或数字组成的字符串,以及横线和下划线字符。例如, building-your-1st-django_url。

uuid:匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号,并且字母必须是小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。

path:匹配任何非空字符串,包括路径分隔符 '/',可以匹配完整的URL路径,而不仅仅是URL路径的一部分str,使用时要谨慎,因为可能造成后续的所有url匹配都失效。

4、自定义格式转换器

转换器包含以下类:

一个regex类属性,作为一个re匹配字符串。

to_python(self, value)方法,它处理匹配的字符串转换成要传递到视图函数的类型。

o_url(self, value)方法,用于处理将Python类型转换为URL中使用的字符串。

转换器的定义方式如下:

(1)新建一个converters.py文件,在文件中定义一个类,使用to_python()和to_url()方法处理

class YearConverter(object):
regex = '[0-9]{4}' def to_python(self, value):
return int(value) def to_url(self, value):
return '%04d' % value

(2)使用register_converter()方法在URLconf中注册自定义转换器类 :

在需要注册的url.py文件中注册,先从django.urls中导入register_converter,同时导入自定义的类注册

   from django.urls import register_converter, path

   from . import converters, views

  # 注册自定义的转换器
register_converter(converters.YearConverter, 'yyyy') urlpatterns = [
path('blog/2003/', views.special_2003),
path('blog/<yyyy:year>/', views.year_archive)
]

5、正则表达式的使用

使用正则表达式匹配路径时,使用re_path()。

在python正则表达式中,命名正则表达式的语法是(?P\<year>pattern),year是组的名称,pattern是需要匹配的模式。

from django.urls import path, re_path

from . import views

# url() 是 re_path 的别名,不推荐使用
urlpatterns = [
path('blog/2003/', views.special_2003),
path('blog/<int:year>/', views.year_archive),
re_path(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',
views.month_archive),
re_path(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]

在上述正则表达式中:

^表示匹配开头,$表示匹配结束。

[0-9]{4}表示匹配4位0到9的数。

6、错误处理

- handler400- 状态码400
- handler403- 状态码403
- handler404- 状态码404
- handler500- 状态码500

(1)setting中修改设置

   DEBUG = False

   ALLOWED_HOSTS = ['*', ]

(2)在主应用urls中配置

# blog表示子应用名
handler404 = "blog.views.page_not_found"

(3)在视图函数中定义以下函数

   def page_not_found(request, exception):
return HttpResponse('这是一个自定义的404错误页面')

我们看一下页面显示结果:当url找不到时,便会展示我们定义的404错误信息。

7、应用其他url调度器

在同一个url中,为了避免重复的路由输入,可以采用多个patterns的方法,示例如下:

   from django.urls import include, path

    """原生代码:
urlpatterns = [
path('blog/reports/', credit_views.report),
path('blog/reports/<int:id>/', credit_views.report),
path('blog/charge/', credit_views.charge),
]
"""
# 修改后的代码
blog_patterns = [
path('reports/', credit_views.report),
path('reports/<int:id>/', credit_views.report),
path('charge/', credit_views.charge),
] urlpatterns = [
path('blog/', include(blog_patterns)),
]

采用include()的方法

   from django.urls import path
from . import views urlpatterns = [
path('<page_slug>-<page_id>/history/', views.history),
path('<page_slug>-<page_id>/edit/', views.edit),
path('<page_slug>-<page_id>/discuss/', views.discuss),
path('<page_slug>-<page_id>/permissions/', views.permissions),
] # 修改为:
from django.urls import include, path
from . import views urlpatterns = [
path('<page_slug>-<page_id>/', include([
path('history/', views.history),
path('edit/', views.edit),
path('discuss/', views.discuss),
path('permissions/', views.permissions),
])),
]

7、URL反向解析

(1)url调度器除了从用户发起请求,到匹配对应的view,还能在python程序中调用进行匹配,通过 path或re_path 中 的name属性进行解析。

在模板中,使用url模板标签,在url中,使用了name属性

from django.urls import path
from . import views urlpatterns = [
#...
path('blog/<int:id>/', views.id_archive, name='id-archive'),
#...
]

在HTML模板中,我们可以使用url标签进行解析,方法示例如下:

<a href="{% url 'id-archive' 20 %}">20 Archive</a>
<ul>
{% for idvar in id_list %}
<li><a href="{% url 'id-archive' idvar %}">{{ idvar }} Archive</a></li>
{% endfor %}
</ul>
href="{% url 'id-archive' 20 %}中"id-archive"就是name的属性。
(2)在Python代码中(主要是views视图中),使用 reverse() 函数。
from django.urls import reverse
from django.http import HttpResponseRedirect def redirect_to_id(request):
# ...
num = 20
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(num,)))

使用reverse进行重定向,完成url的一个跳转链接。

(3)在模型实例中,使用 get_absolute_url() 方法.

在模型中的实现方法如下:

def get_absolute_url(self):
from django.urls import reverse
return reverse('new-id-archive', args=[str(self.id)])

在模板中的实现方法如下:

<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>

在上述实现方法中,"new-id-archive"是name属性的值,args是传入的参数值

8、命名空间

主要用于配合url反向解析使用,多个不同的urls文件中可能配置同名的name,那么为了进行区分,给不同的urls进行不同的命名,同一个项目下命名空间一定不能重复。

在url调度器的模块中,使用app_name = "名字"来命名。

from django.urls import path

from . import views
# 定义,一般命名空间和子应用名相同,便于记忆
app_name = 'blog'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
...
]

当使用了命名空间之后,调用时必须有命名空间的前缀,其方法如下所示:

def test_app_name(request):
return HttpResponseRedirect(reverse('blog:index'))
'blog:index',blog表示命名空间的名字,index表示name属性的值

命名空间的嵌套使用,嵌套与patterns中,如下所示:
from django.urls import path

from . import views
# 定义命名空间,一般命名空间名和子应用名相同,便于记忆
app_name = 'blog' blog_patterns = (
[
path('app_name/', views.app_name, name='app_name'),
],
# 此处就是嵌套的命名空间
'reading'
) urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('reading/', include(blog_patterns)),
...
]

在模板中使用嵌套空间的方法

<a href="{% url 'blog:reading:app_name' %}">点击链接</a>

<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>

02-URLConf调度器的更多相关文章

  1. Django 源码小剖: URL 调度器(URL dispatcher)

    在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...

  2. CDN调度器HAProxy、Nginx、Varnish

    http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/ CDN功能如下:1.将全网IP分为若干个IP段组,分组的依据通常是运 ...

  3. Spring 3 调度器示例 —— JDK 定时器和 Quartz 展示

    Spring框架提供了执行和调度任务的抽象,支持线程池或者在应用服务器环境中代理给CommonJ. Spring也集成了支持使用JDK Timer和Quartz调度库提供的Quartz Schedul ...

  4. URL 调度器(URL dispatcher)

    URL 调度器(URL dispatcher) 在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 UR ...

  5. MySQL事件调度器event的使用

    Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...

  6. quartz2.3.0(七)调度器中断任务执行,手动处理任务中断事件

    job任务类 package org.quartz.examples.example7; import java.util.Date; import org.slf4j.Logger; import ...

  7. Golang调度器GMP原理与调度全分析(转 侵 删)

    该文章主要详细具体的介绍Goroutine调度器过程及原理,包括如下几个章节. 第一章 Golang调度器的由来 第二章 Goroutine调度器的GMP模型及设计思想 第三章 Goroutine调度 ...

  8. TVM自动调度器

    TVM自动调度器 随着模型大小,算子多样性和硬件异构性的不断增长,优化深度神经网络的执行速度非常困难.从计算的角度来看,深度神经网络只是张量计算的一层又一层.这些张量计算(例如matmul和conv2 ...

  9. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...

随机推荐

  1. Asp.Net Mvc 控制器详解

    理解控制器 控制器的角色 (1)中转作用:控制器通过前面的学习大家应该知道它是一个承上启下的作用,根据用户输入,执行响应行为(动 作方法),同时在行为中调用模型的业务逻辑,返回给用户结果(视图). ( ...

  2. 十六进制颜色码及其表示-(6 digit color code)

    我们知道对于RGB颜色系统,颜色是由三个256位的十进制数值表示的: (R:0-255,G:0-255,B:0-255) 那么一个三元组可以确定一种颜色. 然而,在很多配置文件中颜色并不是直接用十进制 ...

  3. .Net Core基础的健康检查

    前言 健康检查能查看我们的应用程序当前是否是一个健康的运行状态.微软已经给我们提供了健康检查轮子,只需要简单的配置就能完成服务的状态检查.一起来实现一个最简单的健康检查吧. 开始 新建一个空的webA ...

  4. 【JMeter_16】JMeter逻辑控制器__随机控制器<Random Controller>

    随机控制器<Random Controller> 业务逻辑: 当每次执行到该逻辑控制器时,随机挑选控制器下的任意一个子节点<取样器.逻辑控制器> Ignore sub-cont ...

  5. ca75a_c++_标准IO库-利用流对象把文件内容读取到向量-操作文件

    /*ca75a_c++_标准IO库习题练习习题8.3,8.4,8.6习题8.9.8.10 ifstream inFile(fileName.c_str());1>d:\users\txwtech ...

  6. HTTP参数污染学习

    HTTP参数污染 --- HPP 参考: 参数污染漏洞(HPP)挖掘技巧及实战案例全汇总 视频内容 HPP,简而言之,就是给参数赋上多个值. 比如: https://www.baidu.com/s?w ...

  7. JSON类库Jackson优雅序列化Java枚举类

    1. 前言 在Java开发中我们为了避免过多的魔法值,使用枚举类来封装一些静态的状态代码.但是在将这些枚举的意思正确而全面的返回给前端却并不是那么顺利,我们通常会使用Jackson类库序列化对象为JS ...

  8. elasticSearch插件的安装以及使用nginx的modles收集nginx的日志

    1.首先在windows环境上搭建es的集群 集群的配置如下 #node01的配置: cluster.name: es-itcast-cluster node.name: node01 node.ma ...

  9. FreeSql 使用 ToTreeList/AsTreeCte 查询无限级分类表

    关于无限级分类 第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fi ...

  10. 洛谷P3694 邦邦的大合唱站队【状压dp】

    状压dp 应用思想,找准状态,多考虑状态和\(f\)答案数组的维数(这个题主要就是找出来状态如何转移) 题目背景 \(BanG Dream!\)里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. ...