一、路由流程

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. 《Maven_孔浩》Maven命令

    maven命令: mvn compile:maven编译 mvn test:测试 mvn clean:删除编译生成的target文件 mvn package:运行编译.测试.package,把项目打包 ...

  2. php正则测试demo、动态函数

    <?php error_reporting (E_ALL); ini_set ('display_errors', 'on');?><meta http-equiv="Co ...

  3. C# 之 Word光标移动 GoTo 方法

    对于 Document 或 Range对象:返回一个 Range对象,该对象代表指定项(例如页.书签或域)的开始位置. 对于 Selection对象:将插入点移至指定项前面的字符位置,并返回一个 Ra ...

  4. JS获取活动区域高和宽

    var width;            var height;            //获取窗口宽度            if (window.innerWidth)              ...

  5. loadjs异步加载javascript回调

    function loadjs(url,callback){    var script=document.createElement('script');     script.type=" ...

  6. Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  7. js 简易判断一个数字是否是小数

    参考:js验证输入是否是小数 我的方法是: //check the number is decimal number function checkDecimal(number){ if(!isNaN( ...

  8. C#前端頁面判斷控件

    var chbClass = document.getElementById("<%=DDL_CheckboxUserClass1.ClientID %>" + &qu ...

  9. PM2 管理nodejs项目

    pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...

  10. html元素拖拽

    html <div> <div class="money-input"> 定投金额 : <div class="input-rela&quo ...