1

我对 Django 比较陌生,并且有使用 Rails 的经验。在 Rails 中,urls.py由于. 所以我想为我的项目“导入”一些 Rails 的行为,这样我就不必在每次添加新视图时都重写。REST/controller/action/indexurls.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(请参阅了解 django.shortcuts.redirect),但如果这些问题出现,这似乎不是根源。无论如何,这让我开始思考,现在我不太确定我的调度员是否是一个好主意。

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

无论如何,我想知道那些对 Python 和 Django 更有经验的人是怎么想的。

4

1 回答 1

4

我同意你同事的看法。您应该urls.py 按照文档中的说明使用。

首先,关于感知优势:

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

您不必“重写urls.py”;你必须添加一行。这种显式优于隐式的方法正好符合 Python 的核心,如果您现在开始与之抗争,您将继续遇到类似的问题。

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

马上,最好明确定义 URL — 阅读Diaspora(旨在作为 Rails 中的开源 Facebook 竞争对手)的这篇文章,了解自动 URL 路由如何导致巨大的安全漏洞。

其次,无需查看源代码即可利用您设计的后门。globals()不仅包含本地视图函数,还包含所有导入的模块。希望攻击者找不到接受两个参数的破坏性函数(可能在您的一个模型上,或者在您导入的模型中)sys是危险的。os

于 2012-08-13T17:33:13.550 回答