一、概述

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

  随便新建个Django项目,默认会自动创建一个/project_name/urls.py文件,并自动包含一些内容,这就是项目的根URL。

  如果要自己编写URL路由,基本也是这个套路。

二、Django如何处理请求

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

    1、决定要使用的根URLconf模块。通俗地讲,就是你可以自定义项目入口url是哪个文件!

    2、加载该模块并寻找可用的URLpatterns。它是django.urls.path()或django.urls.re_path()实例的一个列表。

    3、依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。

    4、导入并调用匹配行中给定的视图,该视图是一个简单地python函数,或基于类的视图。视图将获得如下参数:

      (1).一个HttpRequest实例

      (2).如果匹配的表达式返回了未命名的组,那么匹配的内容将作为位置参数提供给视图。

      (3).关键字参数由表达式匹配的命名组组成,但是可以被django.urls.path()的可选参数kwargs覆盖。

      (4).若没有匹配到任何表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。

三、简单实例

注:

  1.要捕获一段url中的值,需要使用尖括号,而不是圆括号;

  2.可以转换捕获到的值为指定类型,例如例子中的int。默认情况下,捕获到的结果保存为字符串类型,不包含/这个特殊字符;

  3.匹配模式的最开头不需要添加/,因为默认情况下,每个url都带一个最前面的/,既然是都有的部分,就不用特别写一个了。

每当urls.py文件被第一次加载的时候,urlpatterns里的表达式们都将被预先编译,这会大大提高系统处理路由的速度。

四、path转换器

默认情况下,Django内置下面的路径转换器:

  ·str:匹配任何非空字符串,但不含/,如果没有专门指定转换器,那么这个是默认使用的。

  ·int:匹配0和正整数,返回一个int类型。

  ·path:匹配任何非空字符串,重点是可以包含路径分隔符‘/’。这个转换器可以帮助匹配整个url而不是一段一段的url字符串。(要区分path转换器和path()方法)。

  ·uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用破折号,所有字母必须小写。返回一个UUID对象。

  ·slug:可理解为注释、后缀、附属等概念,是url拖在最后的一部分解释性字符。该转换器匹配任何ASCII字符以及连接符和下划线。

五、使用正则表达式

Django2.0之后的url虽然改配置了,但它依然向老版本兼容。而这个兼容的办法,就是用re_path()方法代替path()方法。

与path()方法不同的在于两点:

  ·re_path()由于是用正则进行匹配的,则只能匹配到正则指定的长度或规则。

  ·传递给视图的所有参数都是字符串类型。而不像path()方法可以指定转换成某种类型。在视图中接收参数时一定要小心。

六、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的同一个视图。在视图中,才根据具体请求方法的不同,进行不同的处理。

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

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

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

八、自定义错误页面

当Django找不到与请求匹配的URL时,或者当抛出一个异常时,将调用一个错误处理视图。Django默认的自带的错误视图包括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模板,用于返回错误页面给用户,但是这些页面实在丑陋,通常都自定义错误页面。

首先,在根URLconf中额外增加下面的条目,并导入views模块:

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

再根据自己的需求,创建对应的400、403、404、500.html四个页面文件,就可以了(要注意好模板文件的引用方式,视图的放置位置等等)。

Django的URL路由基础的更多相关文章

  1. Django之url路由

    Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置 ...

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

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

  3. 3/19 Django框架 url路由配置及模板渲染

    3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...

  4. django URL路由基础

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

  5. Django之URL(路由系统)用法

    路由系统 路由系统概念 简而言之,路由系统就是路径和视图函数的一个对应关系.django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里 ...

  6. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  7. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  8. Django之URL路由系统

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

  9. Django( 学习第三部 Django的url路由层)

    目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...

随机推荐

  1. 侯捷C++学习(二)

    #include <iostream>using namespace std;class complex{ public: complex (double r= 0, double i = ...

  2. spring boot项目mybatis配置注解+配置文件

    maven依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  3. 《新标准C++程序设计》3.6-3.7(C++学习笔记9)

    一.成员对象和封闭类 (1)定义 一个类的成员变量如果是另一个类的对象,就称之为“成员对象”. 包含成员对象的类叫封闭类. (2)封闭类构造函数的初始化列表 在构造函数中添加初始化列表的写法: 类名: ...

  4. hive表字段注释显示乱码问题

    创建了一张hive表,对字段增加了注释,比如comment '注释内容' 之类的,但是在hive client查看时候却是乱码 比如: create table test_ultraedit ( id ...

  5. [题解] LuoguP6075 [JSOI2015]子集选取

    传送门 ps: 下面\(n\)和\(k\)好像和题目里的写反了...将就着看吧\(qwq\) 暴力打个表答案就出来了? 先写个结论,答案就是\(2^{nk}\). 为啥呢? 首先你需要知道,因为一个集 ...

  6. 吴裕雄--天生自然C++语言学习笔记:C++ 模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  7. CV_图像滤波[转]---python+opencv均值滤波,高斯滤波,中值滤波,双边滤波

    1.图像滤波算法(cv2) https://blog.csdn.net/qq_27261889/article/details/80822270 2.

  8. 【剑指Offer】面试题03. 数组中重复的数字

    题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...

  9. TX2超详细,超实用刷机教程(亲测有效,所有步骤都是博主亲自实践过)

    https://blog.csdn.net/DeepWolf/article/details/88640937 本篇主要对TX2刷机流程以及刷机过程中遇到的坑和相应的解决办法做个记录,以便再次刷机时能 ...

  10. AP架构基本过程

    ①.有线网络搭建(vlan,dhcp,路由等.) ②.ap零配置启动,通过dhcp获取IP地址及网关ip,同时获取ac ip地址. ③.AP主动建立到达ac的capwap隧道. ④.ap与ac建议隧道 ...