Django URL路由概述

一个干净优雅的URL方案是高质量Web应用程序中的一个重要细则
Django可以让你设计URL,无论你想要什么,没有框剪限制
要为应用程序设计URL,您可以非正式地创建一个名为URLconf(URL configura URL配置)的Python模块。
这个模块是纯Python代码,是一个简单的Python模式(简单的正则表达式)到Python函数(您的视图)之间的映射

Djangon如何处理一个请求

当用户从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函数(或基于类的视图)。该视图通过以下参数传递:

  • 4.1 一个实例 HttpRequest。
  • 4.2 如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。
  • 4.3 关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖django.conf.urls.url()

5. 如果没有正则表达式匹配,或在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。

示例
以下是一个URLconf示例:

 from django.conf.urls import url

 from . 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),
]

说明:
1. 要从URL捕获一个值,只需要将其括起来
2.没有必要添加一个主要的斜杠,因为每个URL都含有。例如^articles , 不是 ^/articles。
3.正则表达式前面的 'r' 是可选的,但是推荐使用。它告诉Python 这个字符串是一个'raw'(元字符串,字符串中没有任何内容被转义)

请求示例:
/articles/2005/03/    将匹配列表中的第三个条目。Django会调用views.month_archive(request, '2005', '03')函数

/articles/2005/3/      不会匹配其中的任何 URL模式 。因为第三个条目中 views.month_archive 月份需要两位数字。

/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} 只会匹配整数字符串。


Django 路由 —— Djangon如何处理一个请求的更多相关文章

  1. Nginx如何处理一个请求

    看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...

  2. nginx是如何处理一个请求的(包含https配置)

    配置https首先要有ssl证书,这个证书目前阿里有免费的,但如果自己做实验,也是可以自签证书,只不过不受信 openssl genrsa -des3 -out server.key 1024     ...

  3. [转载]Nginx如何处理一个请求

    http://nginx.org/cn/docs/http/request_processing.html 对我的扫盲文章 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一 ...

  4. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

  5. Nginx 如何处理一个请求

    基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_na ...

  6. Nginx是如何处理一个请求

    首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到 ...

  7. django源码分析——处理请求到wsgi及视图view

    本文环境python3.5.2,django1.10.x系列 根据前上一篇runserver的博文,已经分析了本地调试服务器的大致流程,现在我们来分析一下当runserver运行起来后,django框 ...

  8. python的Web框架:Django路由系统以及模板导入

    Django的路由系统 当一个请求来到时 当一个请求来到时 1.首先到项目目录下的urls.py(根URLconf模块)中,查找路由规则: 2.根URELcof模块,里面定义了 urlpatterns ...

  9. 第2天:Django路由与视图

    在应用中创建视图定义路由 配置文件说明 静态文件使用 Django解析路由的流程 路由顺序 路由命名与reverse反推 在应用中创建视图定义路由 前面我们已经创建了子应用users,但是这个user ...

随机推荐

  1. AutoIt:获取计算机已安装程序列表

    $file = FileOpen(@ScriptDir&"\RegInstalledItems.csv",1) if $file = -1 Then ConsoleWrit ...

  2. centos6.5下忘记mysql密码

    1.此方式会使得服务器处于不安全的情况,请尽量保证在安全的环境下进行,因为,此方式,会使得任何人任意地连接MySQL数据库. 2.#vim /etc/my.cnf 在[mysqld]的段中,加上ski ...

  3. 【旧文章搬运】PspCidTable攻与防

    原文发表于百度空间,2009-03-29========================================================================== PspCi ...

  4. 005--linux基础一作业

    1.最小化安装centos7操作系统 2.新增硬盘分两个分区,两个分区的文件系统依次为ext4和xfs 3.将两个文件系统分别挂在到/mnt和/opt目录 4.新增普通用户egon并采用无需重复确认的 ...

  5. 任务24:WebHost的配置

    24 任务24:WebHost的配置 创建HelloCore的项目 我们新建一个空的mvc项目 我们在这里调用COnfigureAppConfiguration方法更改默认的配置.为读取setting ...

  6. python __builtins__ help类 (32)

    32.'help', 接收对象作为参数,更详细地返回该对象的所有属性和方法 class _Helper(builtins.object) | Define the builtin 'help'. | ...

  7. bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】

    把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i- ...

  8. bzoj 2064: 分裂【状压dp】

    参考:https://www.cnblogs.com/liu-runda/p/6019426.html 有点神奇 大概就是显然最直观的转移是全部合起来再一个一个拆,是n+m次,然后设f[i][j]为分 ...

  9. android内存溢出 java.lang.OutOfMemoryError

    今天在做ListView 的时候.想做一个音乐列表模块,前面是图片,后面是分类名称,如下图: 结果运行时候,LogCat是总是报 java.lang.OutOfMemoryError的错误,顾名思义, ...

  10. PHP 使用 header 方式实现文件下载功能

    header() 函数向客户端发送原始的 HTTP 报头. 下载文件要用的的请求头: header("Content-type:application/octet-stream") ...