Django提供了干净优雅的 URL 方案,URL配置文件是一个标准的 python 文件,支持动态配置。它的本质就是URL模式与调用的视图函数之间的映射表,最简单的配置文件如下:

from django.conf.urls.defaults import *
from sailing.manager.views import search urlaptterns = patterns('',
url(r'^search$',search),
)

  上面使用的是传递函数对象的方式(在 python 中,函数是一级对象,你可以像传递其它变量一样传递它们。使用传递函数对象的方式,还可以对函数对象进行包装),下面使用的是传递字符串的方式:

from django.conf.urls.defaults import *

urlaptterns = patterns('sailing.manager.views',
url(r'^search/$','search'),
)

  如果使用字符串的方式,可以不用 import 相关模块,而且可以使用通用前缀(patterns 函数的第一个参数是一个字符串,表示一个视图函数的通用前缀)。当有不同的前缀时,还可以增加多个 patterns() 对象,然后相加即可,如:

from django.conf.urls.defaults import *

urlaptterns = patterns('sailing.manager.views',
url(r'^search/$','search'),
)
urlaptterns += patterns('',
url(r'^admin/', include(admin.site.urls)),
)

  大多数的URL模式会以 ^ 开始,以 $ 结束,如果在URL模式尾部有一个斜杠,表面上看是不匹配尾部不带斜杠的URL,但是默认地,尾部没有斜杠的URL如果不匹配任何模式,将被重定向至尾部包含斜杠的模式。所以在 urlpatterns 中配置URL时,应尽量在尾部带上斜杠。

  另外,由于 urls.py 是标准的 python 文件,所以支持动态设定 urlpatterns,如只在DEBUG模式下有效的模式:

from django.conf import settings
from django.conf.urls.defaults import * if settings.DEUG:
urlpatterns = patterns('',
(r'^search/','search'),
)

  URLconf 中,无命名正则表达式组中,如果想要捕获URL部分的数据,就加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。此外,还可以使用命名的正则表达式组来捕获URL,也要加上小括号,并且将其作为关键字参数传递给视图。命名的正则表达式组的语法是: (?P<name>pattern) ,它的优点是可读性强,而且可以在view函数中对参数重新排序,它的缺点是不够简洁。注意,在同一个 URLconf 中,命名组和非命名组不能同时存在,否则虽然不会抛出错误,但可能有会意想不到的问题,所以请尽量避免。

  除了在URL模式中传递参数之外,patterns() 函数中每一个 URLconf 可以有第三个元素,它是一个 dict 类型,表示关键字参数与传递的值(该值可以是字符串,也可以是任何类型的对象)。视图函数只关心它获得了参数,而不关心这些参数是捕捉到的,还是额外提供的。但是当冲突出现的时候,额外 URLconf 参数优先于捕捉值,如:

urlpatterns = patterns('',
(r'^mydata/(?P<id>\d+)/$', views.my_view, {'id':3}),
)

  则不管请求的URL中 id 的值是什么,都只会将 id = 3 传递到视图函数中。每个被捕获的参数都是作为字符串发送到视图函数中的,而不管正则表达式中的格式,所以在视图函数中,你可能需要做一些类型转换(但可能不需要捕捉异常,因为 URLconf 的正则表达式已经确保只有该类型的字符串才能传到这个视图中)。

  还有一个细节是视图函数中的参数可以有默认值,这样一来,可以做一些动态的功能;相应的,也可以使用 python 可变参数的特性(参数前面有一个*号,表示传递的参数保存为一个 tuple,参数前有两个*号,表示传递的关键字参数保存为一个字典)

  在 URLconf 中,除了可以包装匹配的函数对象之外,还可以通过 include 包含其它 URLconf 。每当 Django 遇到 include() 时,它将URL中已匹配模式的文本去除,将剩余部分发往 include() 中指定的 URLconf 进一步处理。URLconf 的第三个参数(额外视图函数的参数),也可以传递到 include() 中指定的 URLconf 中去。

Django URLconf的更多相关文章

  1. Django URLConf 进阶

    Django处理一个请求 项目启动后根据 settings  ROOT_URLCONF 决定项目根URLconf urlpatterns是django.conf.urls.url()实例的一个Pyth ...

  2. django URLconf调度程序

    路由的编写方式是Django2.0和1.11最大的区别所在,Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...

  3. 45、django工程(URLconf)

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

  4. django 学习点滴

    django连接数据库要安装第三方包,比如mysql的就是 python-mysqldb, 用apt-cache search python-mysql 搜索一下. django的project可以放 ...

  5. 结合使用AngularJS和Django

    原地址 好吧,我承认自己很懒,时间又不够用. 翻译的几个文章都是虎头蛇尾,但我保证这次肯定不太监. 关键的单词不翻译,实在觉得翻译成汉语很别扭,括号里是参考翻译. 有问题和建议尽管提出来,我会改进完善 ...

  6. Tutorial: 结合使用AngularJS和Django

    好吧,我承认自己很懒,时间又不够用. 翻译的几个文章都是虎头蛇尾,但我保证这次肯定不太监. 关键的单词不翻译,实在觉得翻译成汉语很别扭,括号里是参考翻译. 有问题和建议尽管提出来,我会改进完善. Tu ...

  7. Django开发目录

    Django开发[第一章]:Django基础和基本使用 Django开发[第二章]:Django URLConf 进阶 Django开发[第三章]:Django View 进阶 Django开发[第四 ...

  8. Django基础和基本使用

    Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或 ...

  9. Django第一步

    对于一个web框架,掌握了三部分的内容,就可以说是迈出了第一步. 1. 准备开发环境 2. 创建一个工程,并运行 3. 开发hello world应用 1. 准备环境 首先应该是安装python和dj ...

随机推荐

  1. codevs1183泥泞的道路

    题意:给定一张有向稠密图和通过每条边的时间和路程,问从1到n的路程/时间 最大为多少 正解:SPFA+二分答案 开始做的时候,想直接跑图论,后来发现好像不对(不然数据范围怎么这么小) 但是显然要用到图 ...

  2. [IOS 静态库]

    http://www.2cto.com/kf/201402/276718.html 一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷 ...

  3. shutil模块

    shutil模块 提供了大量的文件的高级操作,特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 常用方法 shutil.copyfile(src, dst) 复制文件内容(不包含元数据)从 ...

  4. AngularJs $q 承诺与延迟

    $q 一个帮助处理异步执行函数的服务.当他们做完处理时,使用它们的返回值(或异常). 受 Kris Kowa’s Q 的启发,这是一个实现promise/deferred对象的启用. $q的两种方式- ...

  5. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  6. python标准模块(一)

    本文会涉及到的模块: time datetime sys os random re hashlib 模块,用若干代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能 ...

  7. JQuery 学习笔记(01)

    JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Oper ...

  8. 使用LaTeX编辑数学公式

    首先在博客园的页首html里添加以下代码: <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex ...

  9. IBatis 批量插入数据

    sql语句 <!--批量插入待收流水--> <insert id="BatchInsertOrder" parameterClass="ArrayLis ...

  10. apache无法正常启动,80端口被占用的解决方法

    apache无法正常启动,80端口被占用的解决方法 网上的方法: 仔细查看提示: make_sock: could not bind to address 0.0.0.0:80 恍然大悟,计算机上安装 ...