挂入django的意见

时间:2010-01-21 15:30:06

标签: python django hook django-views

简单的问题。我有一堆django的观点。有没有办法告诉django对于每个视图,使用foo(view)代替?例如:

而不是写

@foo
@bar
@baz
def view(request):
    # do something

一直以来,我都想

def view(request):
    markers = ['some', 'markers']

并将其挂钩到django:

for view in all_the_views_in_my_app:
    view = do_something_based_on_the_marker(view)

我想在服务器启动时完成此操作。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据您想要做什么(或实现),您可以编写custom middelware并实施方法process_view(和/或您需要的任何其他方法):

  在Django调用视图之前调用

process_view()。它应返回NoneHttpResponse对象。如果它返回None,Django将继续处理此请求,执行任何其他process_view()中间件,然后执行相应的视图。如果它返回一个HttpResponse对象,Django将不会打扰调用任何其他请求,视图或异常中间件或相应的视图;它将返回HttpResponse。每次响应都会调用响应中间件。

答案 1 :(得分:1)

我不知道你为什么要这样做。我不知道为什么你不想使用装饰器。但你可以使用这个丑陋(并且可能容易出错)的黑客作为开始:

def view(request):
    pass
view.markers = ['some', 'markers']

其他地方:

from app import views
[x for x in views.__dict__.values() if hasattr(x,'markers')]