钩入Django视图
这是个简单的问题。我有很多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
。响应中间件总是会在每个响应上被调用。