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. MSSQL(DAC环境一下一些特殊的访问方式)

    MSSQL(在DAC环境下访问: 存储过程) Server name:      admin:计算机名\实例名                 or       admin:IP地址\实例名      ...

  2. FR嵌套报表(Nested Report)

    //主界面只是说明放置了哪些东西(3个ADOQuery不必放): //MasterSource.MasterField的设置如下: 1) Customer.Orders.Items 的 MasterS ...

  3. PIP设置镜像源

    PIP设置镜像源 pip安装Python包时候,默认是国外的下载源,速度太慢,本文介绍几种设置pip国内镜像源的方法 镜像源 阿里云 http://mirrors.aliyun.com/pypi/si ...

  4. ca73a_c++_流的条件状态

    /*ca73a_c++_流的条件状态strm::iostate strm::badbit //流的状态strm::failbit //输入的状态,应该输入数字,结果输入为字符,strm::eofbit ...

  5. 超详细Maven技术应用指南

    该文章,GitHub已收录,欢迎老板们前来Star! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual 搜索关注微信公众号" ...

  6. java关于传值与传引用

    关于java传值还是传引用的问题经常出现在一些烦人的面试题中,主要考察个人对java基础的掌握情况. 首先明确一下:本地方法中,java的参数传递都是传值.但是如果是远程调用方法时,会将对象本身传递过 ...

  7. msf stagers开发不完全指北(二)

    采用 Golang 开发stagers 上一篇文章 msf stagers开发不完全指北(一)中我们谈到如何采用 c 进行 msf 的 stagers 开发,这篇文章我们探讨一下如何使用 Golang ...

  8. jQuery制作div板块拖动层排序

    html结构: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  9. 一个很酷炫也挺实用的JS库leader-line

    简单粗暴,直入主题,看看效果再说. 是不是这效果挺棒?这样的效果在做系统时,可以有很多的应用,可以让枯燥的页面生动起来. 具体效果,大家可以上这个搜索网站Mag[i]上面看,切身体会一下. 这是一个开 ...

  10. 键盘鼠标(PS2)模拟器驱动及Demo

    详情 KeyboardMouseSimulateDriver 问题描述: 鼠标相对移动存在不正确性,绝对移动没正确性. 基于于Thinkpad E460上的开发及测试. 不支持HID设备.