我对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更有经验的想法。
答案 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()
不仅包含本地视图功能,还包含所有导入的模块。希望攻击者无法找到具有破坏性的功能(可能在您的某个模型上,或者在导入的sys
或os
中)接受两个参数是很危险的。