一、路由流程

1. 用户浏览器发出请求后,通过根url设置,去找urlpattern变量。在setting.py中对 ROOT_URLCONF进行配置,以确定根URLconf(URL configuration)路径。

2. 在urlpattern变量(一个django.conf.urls.url()实例的列表)中,从上往下寻找匹配其中正则表达式的url。一般是分解为两级路由。首先是在项目(project)目录下的urls.py中的urlpatterns。通过这里的主urls文件导航到应用(app)urls文件。

from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]

include语法导向应用的路由,它会去掉URL 中匹配的部分并将剩下的字符串发送给include包含的URLconf做进一步处理。这里的正则表达式后面没有$,即以该字符串开头的即可匹配上。include的背后是一种即插即用的思想,即不关心具体app的路由策略,只管往指定的下一级路由转发,这样具体下一级urls文件可以放置在任何位置,不用拷贝到当前应用目录下。实际上,路由的层数可以不止两级,即include指向的urlpatterns还可以使用include指向下一级(参见本文2.7)。

3. 其次,在应用文件夹下新建urls.py,这里的urls文件负责处理具体的视图函数映射。

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^$', views.index, name='index'),
]

4. 最后, 如果没有匹配到url,或抛出一个异常,将触发默认的错误处理视图函数。

  可以在根URLconf中设定handler400,handler403,handler404,handler500进行自定义。

二、urlpatterns语法

示例代码如下:

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()函数可以传递4个参数,其中2个是必须的:regex和view,以及2个可选的参数:kwargs和name。
  regex是一个正则表达式。
  view指定视图函数,或者用include()函数作为url分解器。include()函数中可以定义namespace,方便在视图模板中以{% url 'polls:index' %}方式反查url。
  kwargs任意数量的关键字参数可以作为一个字典传递给视图函数,视图函数再传递给视图模板(函数形参的名字应该和字典key的名字一致)。
  name对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取 了个全局变量名。
  

2. 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。没有命名的正则表达式组(通过圆括号)捕获的值以位置参数传递给视图函数。可以使用命名的正则表达式组来捕获URL中的值并以关键字参数传递给视图函数。

  (注意:捕获的参数都是字符串,即使比如看上去像数字。如果是命名的正则表达式组,函数形参的名字应该和组的名字一致。也就是说可以从url中提取关键字参数,或者直接通过url函数中给定的字典,传递给视图函数,前者是一个可变值,取决于用户输入的url,后者是程序中设定的固定值)

url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$')

def test(request, year, month):
  PASS

3. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。

4. 每个正则表达式前面的'r' 是可选的但是建议加上。

在Python的string前面加上‘r’, 是为了告诉编译器这个string是个raw string,不要转意backslash '\' 。 例如,\n 在raw string中,是两个字符,\和n, 而不会转义为换行符。由于正则表达式和 \ 会有冲突,因此,当一个字符串使用了正则表达式后,最好在前面加上'r'。

5. URLconf进行匹配时将不包括GET或POST请求方式的参数以及域名。

http://www.example.com/myapp/   #URLconf 将查找myapp/。
http://www.example.com/myapp/?page=3 #URLconf 仍将查找myapp/。

6. 指定视图参数的默认值有一个方便的小技巧,是指定视图参数的默认值。

# URLconf
from django.conf.urls import url
from . 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=""):
……

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

7. include()的多级路由方法。如下,请求 /credit/reports/ 将调用credit_views.report()视图函数。

from django.conf.urls import include, url

from apps.main import views as main_views
from credit import views as credit_views extra_patterns = [
url(r'^reports/$', credit_views.report),
url(r'^reports/(?P<id>[0-9]+)/$', credit_views.report),
url(r'^charge/$', credit_views.charge),
] urlpatterns = [
url(r'^$', main_views.homepage),
url(r'^help/', include('apps.help.urls')),
url(r'^credit/', include(extra_patterns)),
]

还可以如下使用,以减少重复部分。

from django.conf.urls import include, url
from . import views urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
]

Django路由的更多相关文章

  1. Django路由系统

    django路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从 ...

  2. Django 路由系统

    Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...

  3. Python菜鸟之路:Django 路由、模板、Model(ORM)

    Django路由系统 Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求.有点类似nginx的location功能. Django的路由关系分为三种:普通关 ...

  4. Django路由控制总览

    今日内容:(路由层) 1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$') -第二个参数是视图函数(不要加括号) -url(r'^admin/', admin.site. ...

  5. Python学习---Django路由系统【all】

    Django URL (路由系统) Django URL (路由系统): URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映 ...

  6. Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数

    一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...

  7. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  8. stark组件前戏(3)之django路由分发的本质include

    django路由分发的三种方式 方式一: from django.urls import re_path, include urlpatterns = [ re_path(r'^web/', incl ...

  9. django路由匹配层

    目录 orm表关系如何建立 一对多 多对多 一对一 django请求生命周期流程图 路由层 路由的简单配置 Django路由匹配规律 分组 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态 虚 ...

  10. Django 路由name使用

    Django 路由name使用 name:对URL路由关系进行命名 ***以后可以根据此名称生成自己想要的URL*** # 路由 url 三种形式 url(r'^index/', views.inde ...

随机推荐

  1. XMemcached使用示例--转

    Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端 ...

  2. Java设计模式09:单例模式的强化(控制实例个数n)

    1. 单例模式的本质: 控制实例数目(目的节约资源) 2. 单例模式体现的一些思想: (1)延迟装载(Lazy Load):懒汉式 (2)缓存:饿汉式 3. 单例模式的变形使用: 控制使用实例个数为3 ...

  3. web service 部署

    写的不好,全当是写给自己看的吧. 公司用飞天诚信的加密狗对网站进行加密,我要部署加密狗的web service.注:web service 由加密狗公司提供. 1.新建网站dog

  4. 比较js中创建对象的几种方式

    1.工厂模式 function createObj(name, sex){ var obj = new Object(); obj.name = name; obj.sex = sex; obj.sa ...

  5. C++之类的析构函数

    一.认识析构函数 在我的前一篇博客介绍了类的构造函数.http://www.cnblogs.com/MrListening/p/5557114.html. 这里我们来简单说说类的析构函数,它是类的一个 ...

  6. iframe实现面页无刷新提交表单

    一.表单提交到了哪里? 这似乎是个无知的问题,我们都知道表单提交到服务器,java,php,asp等服务器,然后由服务器去读.那么之后呢,服务器总要返回点什么吧,要么返回 一个xml或json数据,要 ...

  7. 跨站脚本攻击(XSS)

    跨站脚本攻击(XSS) XSS发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中就出现了不被预期的脚本执行. 跨站脚本的重点不是在“跨站”上,而应该在“脚本上” 简单例子 ...

  8. PHP之文件的锁定、上传与下载

    小结文件的锁定机制.上传和下载 1.文件锁定 现在都在讲究什么分布式.并发等,实际上文件的操作也是并发的,在网络环境下,多个用户在同一时刻访问页面,对同一服务器上的同一文件进行着读取,如果,这个用户刚 ...

  9. nopCommerce的配置以及汉化

    这里给大家一些链接,是关于nopCommerce的一些介绍: nopCommerce的源代码 关于nopcommerce Nopcommerce中文资源 第一步  配置nopCommerce 先上一张 ...

  10. C# 3.0 LINQ to XML

    高级转换: static IEnumerable<XElement> ExpandPaths (IEnumerable<string> paths) { var brokenU ...