【问题标题】:Hooking into django views挂钩 django 视图
【发布时间】:2011-01-07 19:10:43
【问题描述】:

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

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

【问题讨论】:

    标签: python django hook django-views


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,我知道 process_view() 和自定义中间件,但是,我想在服务器启动时执行一次,而不是在每次请求之前执行此操作。但是,这听起来确实是唯一可能的非 hacky 方式。谢谢。
    【解决方案2】:

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

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

    其他地方:

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

    【讨论】:

    • 如果我使用装饰器,我必须在所有应用程序的每个views.py 文件中导入装饰器,并将它们应用于每个视图。我想要一个可以种植这个钩子并对每个视图进行预处理的地方。为什么?好吧,只是为了减少代码。如果实际上它会变成可读性较差的代码,那么我会改变主意。我猜猴子补丁并没有在生产环境中带来任何好处......
    猜你喜欢
    • 2019-08-28
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多