当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 高级视图和URL配置

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:18

由 lxjazni_7 创建,路飞 最后一次修改 2016-02-24 在第三章,我们已经对基本的Django视图和URL配置做了介绍。 在这一章,将进一步说明框架中这两个部分的高级机能。URLconf 技巧URLconf没什么特别的,就象 Django 中其它东西一样,它们只是 Python 代码。 你可以在几方面从中得到好处,正如下面所描述的。流线型化(Streamlining)函数导入看下这个 URLconf,它是建立在第三章的例子上:from django.conf.urls.defaults import *from mysite.views import hello, current_datetime, hours_aheadurlpatterns = patterns('', (r'^hello/$', hello), (r'^time/$', current_datetime), (r'^time/plus/(\d{1,2})/$', hours_ahead),)正如第三章中所解释的,在 URLconf 中的每一个入口包括了它所关联的视图函数,直接传入了一个函数对象。 这就意味着需要在模块开始处导入视图函数。但随着 Django 应用变得复杂,它的 URLconf 也在增长,并且维护这些导入可能使得管理变麻烦。 (对每个新的view函数,你不得不记住要导入它,并且采用这种方法会使导入语句将变得相当长。)可以通过导入 views 模块本身来避免这个麻烦。 下面例子的URLconf与前一个等价:from django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns('', (r'^hello/$', views.hello ), (r'^time/$', views.current_datetime ), (r'^time/plus/(d{1,2})/$', views.hours_ahead ),)Django 还提供了另一种方法可以在 URLconf 中为某个特别的模式指定视图函数: 你可以传入一个包含模块名和函数名的字符串,而不是函数对象本身。 继续示例:from django.conf.urls.defaults import *urlpatterns = patterns('', (r'^hello/$', 'mysite.views.hello' ), (r'^time/$', 'mysite.views.current_datetime' ), (r'^time/plus/(d{1,2})/$', 'mysite.views.hours_ahead' ),)(注意视图名前后的引号。 应该使用带引号的 'mysite.views.current_datetime' 而不是mysite.views.current_datetime 。)使用这个技术,就不必导入视图函数了;Django 会在第一次需要它时根据字符串所描述的视图函数的名字和路径,导入合适的视图函数。当使用字符串技术时,你可以采用更简化的方式:提取出一个公共视图前缀。 在我们的URLconf例子中,每个视图字符串的开始部分都是\,造成重复输入。 我们可以把公共的前缀提取出来,作为第一个参数传给函数:System Message: WARNING/2 (, line 99); backlinkInline literal start-string without end-string.from django.conf.urls.defaults import *urlpatterns = patterns('mysite.views' , (r'^hello/$', 'hello' ), (r'^time/$', 'current_datetime' ), (r'^time/plus/(d{1,2})/$', 'hours_ahead' ),)注意既不要在前缀后面跟着一个点号("." ),也不要在视图字符串前面放一个点号。 Django 会自动处理它们。牢记这两种方法,哪种更好一些呢? 这取决于你的个人编码习惯和需要。字符串方法的好处如下:更紧凑,因为不需要你导入视图函数。如果你的视图函数存在于几个不同的 Python 模块的话,它可以使得 URLconf 更易读和管理。函数对象方法的好处如下:更容易对视图函数进行包装(wrap)。 参见本章后面的《包装视图函数》一节。更 Pythonic,就是说,更符合 Python 的传统,如把函数当成对象传递。两个方法都是有效的,甚至你可以在同一个 URLconf 中混用它们。 决定权在你。使用多个视图前缀在实践中,如果你使用字符串技术,特别是当你的 URLconf 中没有一个公共前缀时,你最终可能混合视图。 然而,你仍然可以利用视图前缀的简便方式来减少重复。 只要增加多个 patterns() 对象,象这样:旧的:from django.conf.urls.defaults import *urlpatterns = patterns('', (r'^hello/$', 'mysite.views.hello'), (r'^time/$', 'mysite.views.current_datetime'), (r'^time/plus/(\d{1,2})/$', 'mysite.views.hours_ahead'), (r'^tag/(\w+)/$', 'weblog.views.tag'),)新的:from django.conf.urls.defaults import *urlpatterns = patterns('mysite.views', (r'^hello/$', 'hello'), (r'^time/$', 'current_datetime'), (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),)urlpatterns += patterns('weblog.views', (r'^tag/(\w+)/$', 'tag'),)整个框架关注的是存在一个名为 urlpatterns 的模块级别的变量。如上例,这个变量可以动态生成。 这里我们要特别说明一下,patterns()返回的对象是可相加的,这个特性可能是大家没有想到的。调试模式中的特例说到动态构建 urlpatterns,你可能想利用这一技术,在 Django 的调试模式下修改 URLconf 的行为。 为了做到这一点,只要在运行时检查 DEBUG 配置项的值即可,如:from django.conf import settingsfrom django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns('', (r'^$', views.homepage), (r'^(\d{4})/([a-z]{3})/$', views.archive_month),)if settings.DEBUG: urlpatterns += patterns('', (r'^debuginfo/$', views.debug), )在这个例子中,URL链接/debuginfo/ 只在你的 DEBUG 配置项设为 True 时才有效。使用命名组在目前为止的所有 URLconf 例子中,我们使用简单的无命名 正则表达式组,即,在我们想要捕获的URL部分上加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。 在更高级的用法中,还可以使用 命名 正则表达式组来捕获URL,并且将其作为 关键字 参数传给视图。关键字参数 对比 位置参数一个 Python 函数可以使用关键字参数或位置参数来调用,在某些情况下,可以同时进行使用。 在关键字参数调用中,你要指定参数的名字和传入的值。 在位置参数调用中,你只需传入参数,不需要明确指明哪个参数与哪个值对应,它们的对应关系隐含在参数的顺序中。例如,考虑这个简单的函数:def sell(item, price, quantity): print "Selling %s unit(s) of %s at %s" % (quantity, item, price)为了使用位置参数来调用它,你要按照在函数定义中的顺序来指定参数。sell('Socks', '$2.50', 6)为了使用关键字参数来调用它,你要指定参数名和值。 下面的语句是等价的:sell(item='Socks', price='$2.50', quantity=

[1] [2] [3] [4] [5] [6]  下一页


Django 高级视图和URL配置