gpt4 book ai didi

django - 在 Django 中间件中访问当前 View 类实例

转载 作者:行者123 更新时间:2023-12-04 12:32:18 25 4
gpt4 key购买 nike

问题:

我正在尝试访问中间件层中 View 实例的属性。

例如,给定一个这样的基于类的 View :

# views.py
class MyView(View):
my_attribute = 'something'

我很想知道 my_attribute在中间件中执行以下操作:
# middleware.py
def process_view(self, request, view_func, view_args, view_kwargs):
my_attribute = request.view.my_attribute

当然,这行不通,因为 Django 不会通过请求对象公开 View 实例。有没有办法做到这一点?

谢谢!

我的第一次尝试:

我最初认为 process_view()方法可能是执行此操作的好地方。不幸的是, view_func它接收的参数包含一个函数—— MyView.as_view() 的输出-- 而不是 View 实例本身。来自 Django docs :

process_view(self, request, view_func, view_args, view_kwargs)

...view_func is the Python function that Django is about to use. (It’s the actual function object, not the name of the function as a string.)...



我的第二次尝试:

View 实例的句柄在 process_template_response() 中可用。方法,但它很尴尬,无论如何,我希望能够使用 my_attribute在中间件堆栈的较早位置。但这确实有效:
def process_template_response(self, request, response):
my_attribute = response.context_data['view'].my_attribute

最佳答案

没有内置的方法可以做到这一点,但这是 django-users 邮件列表上一位好心的用户给我的解决方案。我在这里重新发布他的建议,以防其他人试图做同样的事情。

这在以下情况下很有用:

  • 您想在中间件中识别当前 View 的属性并相应地执行处理,并且;
  • 出于各种原因,您不想使用 mixin 或装饰器来完成类似的结果。

  • 这会检查 view_func传递给 process_view() 的对象中间件 Hook 并确定并导入适当的 View 类。
    # middleware.py
    from myutils import get_class

    def process_view(self, request, view_func, view_args, view_kwargs):
    view = get_class(view_func.__module__, view_func.__name__)
    view.my_attribute

    那么你的 get_class()定义:
    # myutils.py
    from django.utils import importlib

    def get_class(module_name, cls_name):
    try:
    module = importlib.import_module(module_name)
    except ImportError:
    raise ImportError('Invalid class path: {}'.format(module_name))
    try:
    cls = getattr(module, cls_name)
    except AttributeError:
    raise ImportError('Invalid class name: {}'.format(cls_name))
    else:
    return cls

    关于django - 在 Django 中间件中访问当前 View 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20715552/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com