钩入Django视图

0 投票
2 回答
913 浏览
提问于 2025-04-15 18:18

这是个简单的问题。我有很多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 个回答

1

我不太明白你为什么想这么做,也不清楚你为什么不想用装饰器。不过,你可以试试这个看起来很丑(而且可能容易出错)的办法作为开始:

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

在其他地方:

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

根据你想要做的事情,你可以写一个自定义中间件,并实现一个叫做 process_view 的方法(或者其他你需要的方法):

process_view() 方法在 Django 调用视图之前被调用。它应该返回 None 或者一个 HttpResponse 对象。如果返回 None,Django 会继续处理这个请求,执行其他的 process_view() 中间件,然后调用相应的视图。如果返回一个 HttpResponse 对象,Django 就不会再调用任何其他的请求、视图或异常中间件,也不会调用相应的视图,而是直接返回这个 HttpResponse。响应中间件总是会在每个响应上被调用。

撰写回答