使用Django,有没有更好的方法在urls.py中动态导入视图?

时间:2010-09-20 00:59:39

标签: django dynamic import views django-urls

要点:

假设我在Django中有一个名为“devsite”的项目,它将首先部署到一个临时项目(也称为“devsite”),最后部署到实时代码库(项目称为“livesite”)。在实时部署期间,我必须手动更改urls.py才能从正确的项目中导入视图。这意味着“devsite”中的urls.py会使用类似的内容:

from devsite import views

“livesite”的urls.py将更改为:

from livesite import views

我的解决方案:

以下似乎有效(到目前为止测试有限)。我所做的是在settings.py中创建一个变量来从目录中获取项目名称,如下所示:

settings.py

# /settings.py
import os.path
PROJECT_NAME = os.path.basename(os.path.dirname(__file__))

然后使用它在urls.py中导入正确的视图:

urls.py

# /urls.py
from django.conf import settings
website = __import__('%s' % settings.PROJECT_NAME, fromlist=['views'])
...
urlpatterns = patterns('',
    (r'^monty/$', website.views.monty),
)

我的问题:

我想知道的是:

  1. 这是做我想做的事情的好方法,还是有更好的方法来编写代码?
  2. 或者我是否需要重新考虑整个部署工作流程?
  3. 提前致谢。

2 个答案:

答案 0 :(得分:1)

看看zc.buildout和djangorecipe - 正如Jacob Kaplan-Moss所说,

...is an exceedingly civilized way to develop an app

http://jacobian.org/writing/django-apps-with-buildout/

除了一般的“文明性”之外,djangorecipe还允许您拥有多个可以相互导入的设置文件。然后您可以指定在特定安装中使用哪个设置文件。

development.py

from settings import *
DEBUG = True

live.py

from settings import *
DEBUG = False

......这只是冰山一角

答案 1 :(得分:0)

我会质疑为什么你的live和dev网站有不同的项目。为什么不将所有差异保持在设置/配置之下(例如,与PROJECT_NAME一样),但保持项目的共同点?看起来你只会增加开发和生活之间出错的几率,你每个站点的差异就越大。

除此之外,我认为你所做的事情或多或少都很好。我见过的另一种模式是:

try:
    from livesite import views
except ImportError:
    from devsite import views