URLconf路由

一个干净优雅的URL方案是高质量Web应用程序中的一个重要细节。

Django可以让你设计URL,无论你想要什么,没有框架限制。

要为应用程序设计URL,您可以非正式地创建一个名为URLconf(URL配置)的Python模块。

这个模块是纯Python代码,是一个简单的Python模式(简单的正则表达式)到Python函数(您的视图)之间的映射。

1. Django是如何处理一个请求:

当用户从Django供电的站点请求页面时,系统遵循以下算法来确定要执行的Python代码:

  1. 首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,具体在settings.py配置文件中。但是如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则其值将用于替换ROOT_URLCONF设置。
  2. Django加载该Python模块并查找该变量 urlpatterns。这应该是一个Python的django.conf.urls.url()实例列表。
  3. Django按顺序运行每个URL模式,并在匹配所请求的URL的第一个URL中停止。
  4. 一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。
  5. 如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。

示例

以下是一个URLconf示例:

from django.conf.urls import urlfrom . import viewsurlpatterns = [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),
]

说明:

  • 要从URL捕获一个值,只需将其括起来。
  • 没有必要添加一个主要的斜杠,因为每个URL都有。例如^articles,不是^/articles。
  • 正则中的’r’正面的每个正则表达式字符串的中是可选的,但推荐使用。它告诉Python一个字符串是“raw” - 字符串中没有任何内容应该被转义。请参阅Dive Into Python的解释。

示例请求:

  • /articles/2005/03/将匹配列表中的第三个条目。Django会调用该函数 。views.month_archive(request, ‘2005’, ‘03’)
  • /articles/2005/3/ 不符合任何网址格式,因为列表中的第三个条目需要两个数字的月份。
  • /articles/2003/将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个模式是第一个测试通过。随意利用这些命令插入特殊情况。在这里,Django会调用该函数 views.special_case_2003(request)
  • /articles/2003 将不匹配任何这些模式,因为每个模式要求URL以斜杠结尾。
  • /articles/2003/03/03/将匹配最终模式。Django会调用该函数。views.article_detail(request, ‘2003’, ‘03’, ‘03’)

注意:每个捕获的参数都作为纯Python字符串发送到视图,无论正则表达式的匹配是什么,即使[0-9]{4}只会匹配整数字符串。

2. 命名组

  • 上述使用为简单实例,属于正则表达式非命名组(通过括号)捕获URL定位,并将它们作为位置参数传递给视图。

  • 在更高级的使用中,我们可以使用正则表达式命名组来捕获URL定位,并将它们作为关键字 参数传递给视图。

  • 在Python正则表达式中,正则表达式命名组的语法是(?P<name>pattern),其中命名组中的命名就是name,并且 pattern是某些匹配的模式。

实例:

from django.conf.urls import urlfrom . import viewsurlpatterns = [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),
]

这完成了与上一个例子完全相同的事情,有一个微妙的区别:捕获的值被传递到视图函数作为关键字参数,而不是位置参数。

例如:

  • 请求/articles/2005/03/调用函数 ,。views.month_archive(request, year=‘2005’, month=‘03’) 而不是 views.month_archive(request, ‘2005’, ‘03’)

  • 请求/articles/2003/03/03/调用函数 。views.article_detail(request, year=‘2003’, month=‘03’, day=‘03’)

  • 在实践中,这意味着您的URLconfs稍微更明确,更不容易出现参数命令错误 - 您可以重新排序视图的函数定义中的参数。当然,这些好处是以简洁为代价的; 一些开发人员发现命名组语法丑陋而且太冗长。

URLconf的搜索

URLconf将根据所请求的URL进行搜索,作为普通的Python字符串。这不包括GET或POST参数或域名。

例如:

在请求中https://www.example.com/myapp/,URLconf将寻找myapp/。

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

URLconf不查看请求方法。换句话说,所有的请求方法(GET,POST,HEAD等)都将被路由到相同的URL功能。

指定用于视图参数的默认值

一个方便的技巧是为您的视图参数指定默认参数。下面是一个URLconf和view的例子:

在下面的示例中,两个URL模式指向相同的视图views.page- 但是第一个模式不会从URL捕获任何内容。

如果第一个模式匹配,该page()函数将使用它的默认参数num,“1”。

如果第二个模式匹配, page()将使用num正则表达式捕获的任何值。

# URLconf
from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^blog/$', views.page),url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# View (in blog/views.py)
def page(request, num="1"):# Output the appropriate page of blog entries, according to num....

3. 错误处理

当Django找不到与请求的URL匹配的正则表达式时,或者异常引发时,Django将调用错误处理视图。

用于这些情况的视图由四个变量指定。它们的默认值对于大多数项目都是足够的,但通过覆盖其默认值可以进一步定制。

有关详细信息,请参阅自定义错误视图的文档。

这样的值可以在你的根URLconf中设置。在任何其他URLconf中设置这些变量将不起作用。

值必须是可调用的,或者代表视图的完整的Python导入路径的字符串,应该被调用来处理手头的错误条件。

变量是:

  • handler400- 见django.conf.urls.handler400。
  • handler403- 见django.conf.urls.handler403。
  • handler404- 见django.conf.urls.handler404。
  • handler500- 见django.conf.urls.handler500。

关于404错误

  • 404的错误页面,在模板目录中创建一个404.html的页面,
  • 在配置文件中 settings.py DEBUG=False
  • 在出现404的情况时,自动寻找404页面。
  • 也可以在视图函数中 手动报出404错误,带提醒信息
  • 在视图函数中也可以指定返回一个404
注意 Http404需要在django.http的模块中引入# 响应404raise Http404('纳尼a')

在模板中 404.html

<!DOCTYPE html>
<html>
<head><title>404</title>
</head>
<body><center><h2>404 not found</h2><h3>{ {   exception   } }</h3></center>
</body>
</html>

4. 包括其他的URLconf

在任何时候,您urlpatterns都可以“包含”其他URLconf模块。

这实质上是将一组网址“植根于”其他网址之下

例如,下面是Django网站本身的URLconf的摘录。它包含许多其他URLconf:

from django.conf.urls import include, urlurlpatterns = [# ... snip ...url(r'^community/', include('django_website.aggregator.urls')),url(r'^contact/', include('django_website.contact.urls')),# ... snip ...
]

请注意,此示例中的正则表达式没有$(字符串尾匹配字符),但包含尾部斜线。

每当Django遇到include()(django.conf.urls.include())时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以供进一步处理。

5. URL的反向解析

如果在视图、模板中使用硬编码的链接,在urlconf发生改变时,维护是一件非常麻烦的事情

  • 解决:在做链接时,通过指向urlconf的名称,动态生成链接地址
  • 视图:使用django.core.urlresolvers.reverse()函数
  • 模板:使用url模板标签

Django之URLconf路由相关推荐

  1. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  2. Django学习之路由分发和反向解析

    原 Django学习之路由分发和反向解析 2018年07月12日 14:04:55 huangql517 阅读数 519 1>路由分发 我们之前学习的路由配置都是在项目的全局控制文件(项目名称目 ...

  3. Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM...

    web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...

  4. django 2.0路由配置变化

    urlpatterns变量​​的语法 urlpatterns应该是path()和/或re_path()实例的Python列表. 首先,Django会使用根路由解析模块(root URLconf)来解析 ...

  5. 13.Django之url路由系统初探(一)

    一.什么是django中的url路由系统? django中的url路由系统的本质就是简历某个URL与某个视图(view)函数的对应(映射表)关系表,用下面这种特定的方式来告诉django这个web框架 ...

  6. Django之URL路由系统

    Django下载安装 (day54) 下载Django pip3 install django== 1.11.9 版本号 创建Django项目 django-admin startproject my ...

  7. django——url(路由)配置

    URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除此之外的任何URL都不被 ...

  8. 专题3:Django配置分布式路由

    在之前的项目中,所有的URL都是写在<项目名>/<项目名>/urls.py(即:主路由)中了.如果URL数量少还好,如果我们有很多很多(几十上百)个URL要写,那么要是全写在主 ...

  9. Django DRF routers路由使用

    代码下载:利用django自带的routers实现对url路由的分发(代码实战) 我们常用的定义url的路由有以下两种方式: 第一种: urlpatterns = [url('^student/$', ...

最新文章

  1. 百度2014校园招聘笔试题(成都站,软件研发岗)——2014.09.21
  2. Android7.1图标快捷方式(AppShortcuts)实现Demo
  3. Ado.net连接池 sp_reset_connection 概念
  4. 【原创视频】Docker总体架构设计及各模块原理剖析
  5. 并发编程——线程——理论知识
  6. 面试题之第一部分(Python基础篇) 80题
  7. java模板方法模式_Java中的模板方法模式
  8. centos7安装界面、桌面记录(ubuntu没试过)
  9. MFC 常见窗口操作
  10. 苹果iPhone 13 Pro机型有望采用LTPO技术屏幕 支持120Hz刷新率
  11. fedora下做成liveOS的U盘容量变小问题
  12. 【Liteos系列】之osCmdReg
  13. 阿里云资源编排服务Python SDK使用入门
  14. LuaForUnity1:Lua介绍与使用
  15. mysql 目录的了解以及Linux
  16. CSS-行内框、行框、行高
  17. NeHe OpenGL第九课:移动图像
  18. Linux 命令(35)—— iconv 命令
  19. 导入jasperreports出现Cannot resolve com.lowagie:itext:2.1.7.js6异常、生成PDF中文不显示中文解决方法、使用命令安装jar包
  20. ps图片放大后模糊怎么办?

热门文章

  1. 解决:Do not use built-in or reserved HTML elements as component id: form
  2. mysql -u root -p 解释
  3. Shell编程入门基础上
  4. maven02-----Maven项目构建的初次使用
  5. PHP环境搭建和Apache HTTP服务器配置
  6. Linux下网卡绑定模式
  7. poj 3278 catch that cow BFS(基础水)
  8. Magento--修改已存在的订单的运费
  9. 【原创】StreamInsight查询系列(三)——基本查询操作之过滤
  10. [flask]gunicorn配置文件