0

简单的问题。我有一堆 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)

我想在服务器启动时完成这项工作。有什么想法吗?

4

2 回答 2

2

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

process_view()在 Django 调用视图之前调用。它应该返回一个None或一个HttpResponse对象。如果它返回None,Django 将继续处理这个请求,执行任何其他process_view()中间件,然后是适当的视图。如果它返回一个HttpResponse对象,Django 不会打扰调用任何其他请求、视图或异常中间件或适当的视图;它会返回那个HttpResponse。每个响应都会调用响应中间件。

于 2010-01-21T19:26:53.843 回答
1

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

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

其他地方:

from app import views
[x for x in views.__dict__.values() if hasattr(x,'markers')]
于 2010-01-21T16:42:12.173 回答