在Django的URLconf中进行函数导入的方法
看下这个URLconf:
fromdjango.conf.urls.defaultsimport* frommysite.viewsimporthello,current_datetime,hours_ahead urlpatterns=patterns('', (r'^hello/$',hello), (r'^time/$',current_datetime), (r'^time/plus/(\d{1,2})/$',hours_ahead), )
在URLconf中的每一个入口包括了它所关联的视图函数,直接传入了一个函数对象。这就意味着需要在模块开始处导入视图函数。
但随着Django应用变得复杂,它的URLconf也在增长,并且维护这些导入可能使得管理变麻烦。(对每个新的view函数,你不得不记住要导入它,并且采用这种方法会使导入语句将变得相当长。)可以通过导入views模块本身来避免这个麻烦。下面例子的URLconf与前一个等价:
fromdjango.conf.urls.defaultsimport* **frommysiteimportviews** urlpatterns=patterns('', (r'^hello/$',**views.hello**), (r'^time/$',**views.current_datetime**), (r'^time/plus/(d{1,2})/$',**views.hours_ahead**), )
Django还提供了另一种方法可以在URLconf中为某个特别的模式指定视图函数:你可以传入一个包含模块名和函数名的字符串,而不是函数对象本身。继续示例:
fromdjango.conf.urls.defaultsimport* 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例子中,每个视图字符串的开始部分都是``\,造成重复输入。我们可以把公共的前缀提取出来,作为第一个参数传给\``函数:
SystemMessage:WARNING/2(<string>,line99);backlink Inlineliteralstart-stringwithoutend-string. fromdjango.conf.urls.defaultsimport* 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中混用它们。决定权在你。