我不确定我目前的urls.py设计

时间:2012-08-13 16:53:09

标签: django

我对Django比较陌生,并且有使用Rails的经验。在Rails中,由于urls.py REST惯例,你通常不需要调整过多的路径(Django的/controller/action/index)。所以我想为我的项目“导入”一些Rails的行为,这样每次添加新视图时我都不必重写urls.py

这是我的主要urls.py文件

from django.conf.urls import patterns, include, url
from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
        url(r'^$', redirect_to, {'url': '/monitor/'}),
        url(r'^monitor/', include('monitor.urls')),
)

monitor/urls.py,我有

from django.conf.urls import patterns, include, url
urlpatterns = patterns('monitor.views',
        (r'^$', 'dispatcher'),
        (r'^(?P<action>\w+)/(?P<id>.*$)', 'dispatcher'),
)

我的monitors.views.dispatcher函数看起来像

def dispatcher(request, action=None, id=None):
    if action == None:
        action = "index"

    try:
        act_func = globals()[action]
    except KeyError, e:
        return HttpResponseNotFound("No %s action defined. Page not found." % (action))

    return act_func(request, id)

redirect我遇到了很多问题(请参阅Understanding django.shortcuts.redirect),但如果出现这些问题,这似乎不是来源。无论如何,它让我思考,现在我不太确定我的调度员是否是一个好主意。

我还和一位同事讨论过如何不喜欢它。他说,他觉得我已经引入了潜在的安全风险。如果有人知道代码的结构,那么你可以利用它。虽然他的论点似乎对我有用,但在我们的环境中,有人(我们自己)不太可能阅读我们的代码。

无论如何,我想知道人们对Python和Django更有经验的想法。

1 个答案:

答案 0 :(得分:4)

我同意你的同事。您应该使用urls.py following the instructions in the documentation

首先,关于感知的优势:

  

所以我想到为我的项目“导入”一些Rails的行为,这样我每次添加新视图时都不必重写urls.py

你不必“重写urls.py”;你必须添加一行。这种明确优于隐式的方法运行right to the heart of Python,如果你现在开始反击,你将继续遇到类似的问题。

其次, 是您的代码的安全问题。

立即明确定义URL最好 - 阅读此take-down of Diaspora(作为Rails中的开源Facebook竞争对手),以了解自动URL路由如何导致安全漏洞

其次,人们不需要能够看到源代码来利用您设计的后门。 globals()不仅包含本地视图功能,还包含所有导入的模块。希望攻击者无法找到具有破坏性的功能(可能在您的某个模型上,或者在导入的sysos中)接受两个参数是很危险的。