django URL路由基础

URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。

在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除此之外的任何URL都不被处理,也没有返回。通俗地理解,不恰当的形容,URL路由是你的Web服务对外暴露的API。

Django奉行DRY主义,提倡使用简洁、优雅的URL,没有.php.cgi这种后缀,更不会单独使用0、2097、1-1-1928、00这样无意义的东西,让你随心所欲设计你的URL,不受框架束缚。

一、概述

URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下。实际上Django提倡项目有个根urls.py,各app下分别有自己的一个urls.py,既集中又分治,是一种解耦的模式。

随便新建一个Django项目,默认会自动为我们创建一个/project_name/urls.py文件,并且自动包含下面的内容,这就是项目的根URL:

"""mysite URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
 1. Add an import: from my_app import views  2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views  1. Add an import: from other_app.views import Home  2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf  1. Import the include() function: from django.conf.urls import url, include  2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ] 

前面一堆帮助性的文字,我们不用管,关键是默认导入了url和admin,然后有一条指向admin后台的url路径。

我们自己要编写的url路由,基本也是这个套路。

二、Django如何处理请求

当用户请求一个页面时,Django根据下面的逻辑执行操作:

  1. 决定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入的HttpRequest对象具有urlconf属性(由中间件设置),则其值将被用于代替ROOT_URLCONF设置。通俗的讲,就是你可以自定义项目入口url是哪个文件!
  2. 加载该模块并寻找可用的urlpatterns。 它是django.conf.urls.url()实例的一个列表。
  3. 依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。
  4. 导入并调用匹配行中给定的视图,该视图是一个简单的Python函数(被称为视图函数),或基于类的视图。 视图将获得如下参数:
    1. 一个HttpRequest 实例。
    2. 如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。
    3. 关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。
  5. 如果没有匹配到正则表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。

三、简单示例

下面是一个简单的 URLconf:

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

我们要编写的就是上面urlpatterns列表中的一条条url,每条url,都是urlpatterns列表的一个元素。先后顺序有重要关系,不能随意摆放。最后一条的末尾建议添加一个逗号。

urlpatterns中的每条正则表达式在第一次访问时被自动编译,因此其匹配速度是非常快的。

注意:

  • 若要从URL中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加前导的反斜杠,因为每个URL都有。 例如,应该是^articles而不是^/articles
  • 每个正则表达式前面的'r'是可选的但是建议加上。它告诉Python这个字符串是“原始的” —— 字符串中任何字符都不应该转义。

根据上面的urlconf,下面是一些请求的例子,以及它们将匹配到的url:

  • /articles/2005/03/将匹配列表中的第三个模式。Django将调用函数views.month_archive(request, '2005', '03')
  • /articles/2005/3/不匹配任何URL模式,因为列表中的第三个模式要求月份是两个数字。
  • /articles/2003/将匹配列表中的第一个模式不是第二个,因为模式按顺序从上往下匹配,第一个会首先被匹配。Django会调用函数views.special_case_2003(request)
  • /articles/2003不匹配任何一个模式,因为每个模式都要求URL以一个斜杠结尾。
  • /articles/2003/03/03/将匹配最后一个模式。Django将调用函数views.article_detail(request, '2003', '03', '03')

四、命名组

很多时候,我们需要获取URL中的一些片段,作为参数,传递给处理请求的视图。

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL中的值并以位置参数的形式传递给视图。

可以使用命名的正则表达式组来捕获URL中的值并以关键字参数传递给视图。

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

下面是以上URLconf使用命名组的重写:

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

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

  • /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')

在实际应用中,这让你的URLconf更加明晰且不容易产生参数顺序问题的错误。当然,这不是强制性的,也牺牲了一些简洁性。

针对命名组和非命名组:

  • 如果有命名参数,则使用这些命名参数,忽略非命名参数。
  • 否则,它将以位置参数传递所有的非命名参数。

五、URLconf匹配请求URL中的哪些部分

请求的URL被看做是一个普通的Python字符串,URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。

例如,在https://www.example.com/myapp/的请求中,URLconf将查找myapp/

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

URLconf不检查使用何种HTTP请求方法,所有请求方法POST、GET、HEAD等都将路由到同一个URL的同一个视图。在视图中,才根据具体请求方法的不同,进行不同的处理。

六、URL中捕获的参数为字符串类型

每个捕获的参数都作为一个普通的Python字符串传递给视图,即便被捕获的‘100’看起来像个整数,但实际上是个字符串‘100’。 例如,下面这行URLconf中:

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

传递给views.year_archive()的year参数将是一个字符串,不是整数,即使[0-9]{4}只匹配整数字符串。

七、指定视图参数的默认值

有一个小技巧,我们可以指定视图参数的默认值。 下面是一个URLconf和视图的示例:

# URLconf
from django.conf.urls import urlfrom . import views urlpatterns = [ 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. ... 

在上面的例子中,两个URL模式指向同一个视图views.page。但是第一个模式不会从URL中捕获任何值。 如果第一个模式匹配,page()函数将使用num参数的默认值"1"。 如果第二个模式匹配,page()将使用捕获的num值。

八、自定义错误页面

当Django找不到与请求匹配的URL时,或者当抛出一个异常时,将调用一个错误处理视图。错误视图包括400、403、404和500,分别表示请求错误、拒绝服务、页面不存在和服务器错误。它们分别位于:

  • handler400 —— django.conf.urls.handler400。
  • handler403 —— django.conf.urls.handler403。
  • handler404 —— django.conf.urls.handler404。
  • handler500 —— django.conf.urls.handler500。

这些值可以在根URLconf中设置。在其它app中的二级URLconf中设置这些变量无效。

Django有内置的HTML模版,用于返回错误页面给用户,但是这些403,404页面实在丑陋,通常我们都自定义错误页面。

首先,在根URLconf中额外增加下面的条目:

# URLconf
from django.conf.urls import urlfrom . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # 增加的条目 handler400 = views.bad_request handler403 = views.permission_denied handler404 = views.page_not_found handler500 = views.page_error 

然后在,views.py文件中增加四个处理视图:

def page_not_found(request):return render(request, '404.html') def page_error(request): return render(request, '500.html') def permission_denied(request): return render(request, '403.html') def bad_request(request): return render(request, '400.html') 

再根据自己的需求,创建404.html、400.html等四个页面文件,就可以了。

转载于:https://www.cnblogs.com/navysummer/p/10200191.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux在超级计算机领域一统天下

摘要&#xff1a;在世界超级计算机排行榜500强榜单中&#xff0c;基于Linux的超级计算机占据了462个席位&#xff0c;比率高达92%。基于Windows的超级计算机仅有2个席位&#xff0c;份额为0.4%。中国基于Windows的超级计算机Magic Cube排名94位&#xff0c;澳大利亚基于Windows…

Qtum量子链漏洞赏金计划正式开启

本次Qtum量子链赏金计划为了更好的借助社区的力量参与到QTUM主网及周边应用的开发建设中&#xff0c;让QTUM持续地保持安全、高效的运行&#xff0c;同时能满足更多用户的需求。Bug分级与奖励体系1、如果已经有类似的Issue或者Qtum团队已经知道并在解决该问题的情况将不适用于该…

.SpelEvaluationException: EL1008E: Property or field ‘cache_department_list_Tree‘ cannot be found

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题&#xff1a; .SpelEvaluationException: EL1008E: Property or field cache_department_list_Tree cannot be found on object…

修过的一个android framework原生系统代码bug

“坑”描述&#xff1a; 在对我们自己研发的一款android终端进行camera拍照压力测试时&#xff0c;发现当拍照张数达到几万张时&#xff0c;查看内存占用情况&#xff0c;发现内存泄露。 填“坑”&#xff1a; frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.…

Koa项目搭建过程详细记录

2019独角兽企业重金招聘Python工程师标准>>> Java中的Spring MVC加MyBatis基本上已成为Java Web的标配。Node JS上对应的有Koa、Express、Mongoose、Sequelize等。Koa一定程度上可以说是Express的升级版。许多Node JS项目已开始使用非关系型数据库(MongoDB)。Sequel…

商业项目中代码质量是否重要?

这是一篇比较老的 文章&#xff0c;但是文中的这些问题在现在仍然普遍存在。代码质量的高低与商业产品的优劣是否有直接的影响&#xff1f;开发者Frank Sommers在文中给出了他的看法。文章内容如下。在大多数商业项目中&#xff0c;代码质量并不被看重&#xff0c;因为大部分情…

Class is not a root resource. It, or one of its interfaces must be annotated with @Path:

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题&#xff1a; Class is not a root resource. It, or one of its interfaces must be annotated with Path:XXXX 这是一个dub…

Equation漏洞混淆利用分析总结(下)

样本三 如下所示在该样本中&#xff0c;使用了Ole10Native的流&#xff0c;因此没有equative head&#xff0c;默认读取红框中的4位长度。之后的metf head为01. 可以看到metf head的长度为01时&#xff0c;直接进入到if判断中(该if中的函数实际是一个异常处理函数&#xff0c;但…

闲扯工程师的版本管理概念

如果你所在的公司还在通过qq给客户发sdk升级包等&#xff0c;你可以考虑换一家公司了。

resource fork, Finder information, or similar detr

1.关闭当前项目和Xcode 2.打开终端或者iterm cd ~/Library/Developer/Xcode/DerivedData/ 3. xattr -rc . 4.重新打开项目 5.如果不行那你就再试试其他的办法吧&#xff0c;我就是这样弄好的 如果有需要装系统的话可以看一下我自己封装的系统&#xff0c;原装系统无精简&#x…

5 个常用的软件质量指标

在软件开发中&#xff0c;软件质量是衡量软件是否符合需求、标准的重要体现。除了 代码质量外&#xff0c;影响软件整体质量的因素还有很多。因此&#xff0c;要确保软件的整体质量&#xff0c;就需要在各个环节严格控制。本文列出了衡量软件质量的5个最常用的指标。1. SLOC&a…

介绍一个对陌生程序快速进行性能瓶颈分析的技巧

前言 工作多年&#xff0c;一直做的是curd系统。前几年做的系统应用场景&#xff0c;大多对数据库依赖比较重。例如报表统计&#xff0c;数据迁移&#xff0c;批量对账等。所以这些系统出现性能瓶颈一般出在数据库操作上面。 如果程序因为数据库操作出现性能瓶颈是比较好办的&a…

[WARNING] The POM for XXX-system:jar:1.9.0-SNAPSHOT is missing, no dependency information available

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在 git-bash 中 想要启动一个工程服务就是不成功&#xff0c;始终提示jar包找不到&#xff0c;本地代码已提交。 这时可直接登陆git&am…

关于tcp网络通讯的几个场景的小测试

以下场景基于阻塞式IO 发送端向接收端快速的发送数据&#xff0c;接收端如果不接受或者很慢速的接受会发生什么情况。 发送端快速向接收端发送大量数据&#xff0c;然后立即退出&#xff0c;接收端会发生什么情况。

测试一体机ASM failgroup的相关问题处理

环境&#xff1a;3台虚拟机 RHEL 7.3 Oracle RAC 11.2.0.4问题现象&#xff1a;RAC运行正常&#xff0c;ASM磁盘组Normal冗余&#xff0c;有failgroup整体故障&#xff0c;有failgroup配置错误。温馨提示&#xff1a;本文并不是市场上任何一款商业的一体机产品&#xff0c;只是…

掌握穷变富的12条原则 迅速从普通人变成有钱人

“穷忙”和“富闲”是对立面&#xff0c;“穷”对“忙”&#xff0c;“富”对“闲”&#xff0c;很多“穷忙女”是在拿青春当赌注&#xff0c;希望自己今天的“美丽”明天就能在市场上有个不错的“回报”&#xff1b;而多数“富闲女”则是在拿智慧当筹码&#xff0c;既不可替代…

com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如下&#xff1a; com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.XXX.1 access service com.XXX.system.service.…

动手又动脑

1.编写一个程序&#xff0c;指定一个文件夹&#xff0c;能自动计算出其总容量。 import java.io.File; import java.io.IOException; public class FileEdit { double size0.0; //计算文件或文件夹的大小&#xff0c;单位MB public double getSize(File file){ //判断文件是否存…

windows下安装和设置gradle

一、安装前检查 检查jdk是否已经安装 二、下载gradle 1. https://gradle.org/releases/ 2.设置gradle环境变量 3. 环境变量中增加名为GRADLE_HOME的变量名,值为Gralde的解压路径,例如D:\Gradle 在path的后追加%GRADLE_HOME%\bin; 4. 验证 5.修改默认缓存目录 修改Gradle默认缓存…

智能硬件的时代,嵌入式是否已经日薄西山

存吐吐槽&#xff0c;智能硬件现在很火热&#xff0c;导致很多人以为嵌入式行业又迎来了春天&#xff0c;可是明白人都知道&#xff0c;智能硬件核心在智能&#xff0c;硬件是很次要的。目前的硬件产品&#xff0c;要有亮点&#xff0c;都和智能沾边&#xff0c;已经不是那个可…