在Django的URLconf中进行函数导入的方法

作者:goldensun 时间:2023-07-10 10:46:26 

看下这个 URLconf:


from django.conf.urls.defaults import *
from mysite.views import hello, 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与前一个等价:


from django.conf.urls.defaults import *
**from mysite import views**

urlpatterns = 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 (<string>, line 99); backlink

Inline 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 中混用它们。 决定权在你。

标签:Django,URLconf
0
投稿

猜你喜欢

  • Python中线程threading.Thread的使用详解

    2023-07-22 13:25:48
  • SQL SERVER日志进行收缩的图文教程

    2024-01-27 13:09:16
  • JavaScript利用时间分片实现高性能渲染数据详解

    2024-04-29 13:24:26
  • pyqt5 设置窗体透明控件不透明的操作

    2022-04-18 09:16:16
  • JS forEach跳出循环2种实现方法

    2024-04-29 13:19:28
  • Python基于正则表达式实现检查文件内容的方法【文件检索】

    2021-06-11 07:58:45
  • python中pandas操作apply返回多列的实现

    2023-03-04 06:46:44
  • python 读取、写入txt文件的示例

    2023-09-29 22:04:18
  • MySQL索引用法实例分析

    2024-01-22 16:42:22
  • Python包和模块的分发详细介绍

    2021-10-06 07:25:32
  • 五个方便好用的Python自动化办公脚本的实现

    2022-04-13 10:10:59
  • Python中字符串切片详解

    2022-04-27 01:58:11
  • Python利用openpyxl库遍历Sheet的实例

    2023-10-20 20:19:01
  • Python自动化构建工具scons使用入门笔记

    2023-09-21 19:58:16
  • js文本框输入内容智能提示效果

    2024-04-22 13:01:32
  • python简单区块链模拟详解

    2023-11-09 12:04:57
  • Javascript中判断变量是数组还是对象(array还是object)

    2024-04-17 09:51:28
  • 如何实现固定长度的自动编号?

    2010-06-03 10:08:00
  • Mysql数据库表中为什么有索引却没有提高查询速度

    2024-01-13 19:25:16
  • python使用xlrd实现检索excel中某列含有指定字符串记录的方法

    2021-04-23 12:41:26
  • asp之家 网络编程 m.aspxhome.com