一、路由流程

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. c++ primer,友元函数上的一个例子(By Sybase)

    本文试图解释c++ primer Screen 和 Window_Mgr的例子,为什么将两个类放在两个文件中无法编译? 将两个类写在同一个文件中,通过三个例子解释问题: 第一种写法问题: 编译到Scr ...

  2. select option jquery javascript

    jQuery获取Select选择的Text和Value: $('#myselect').find('option:selected').attr('ent_id');      $('#ent_id' ...

  3. CSS——伪元素与伪类

    伪类与伪元素 伪类:在特殊性中占据0,0,1,0 :link 向未访问的链接添加特殊的样式.也就是说,链接所指的 URI 尚未出现在用户代理的历史中.这种状态与 :visited状态是互斥的. :vi ...

  4. FastDFS详解

    1.FastDFS是什么 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux.FreeBSD.AIX等UNIX系统.它只能通过 专有API对文件进行存取访问 ...

  5. EditPlus自动补全、模板配置

    EditPlus真的是一款非常好用的编辑器,虽然小,但是短小精悍,速度快.只要配置好了,功能也是很强大的.下面来总结一下如何配置EditPlus的自动补全,和模板配置. 一.配置自动补全:(以开发CS ...

  6. js 拼接参数

    htmlString += "<td><button type=\"button\" onclick=\"artdel('"+pro ...

  7. Smarty中一些标签的使用

    Smarty中的标签和php中的标签不一样 foreach标签{foreach   from=$goods(变量名) key='键,不带$' item='值,不带$'}中间的显示内容{/foreach ...

  8. Activti跳过中间节点的helloworld实例程序

    http://blog.csdn.net/songzheng_741/article/details/17289633 此实例是一个最简单的在运行时人为动态改变流程运转的实例,意在为任意流.驳回等功能 ...

  9. EPP3怎么安装SVN(EclipsePHP Studio 3.0)

    如果你和我一样,喜欢用eclipse,你想用用他来开发PHP,那么EPP是一个不错的选择(个人觉得,中文版的有点不习惯) 我们一般都用svn来进行版本控制和代码共享,但是用epp3的时候会遇到这么一个 ...

  10. Java_Vector类的使用,以及Stack继承Vector,推出的栈的特性

    测试用例: import java.util.Stack; /* * 简单的栈类测试: * Stack继承自Vector向量类: * 所以Stack的使用和Vector的使用类型的 * 而且是线程安全 ...