繁体   English   中英

如何创建可通过Django中的中间件在模型中访问的全局变量?

[英]How to create global variables accessible in models via middleware in Django?

我目前正在使用以下代码在Django 模型中获取请求对象:

request_user = None
for frame_record in inspect.stack():
    if frame_record[3] == 'get_response':
        request_user = frame_record[0].f_locals['request'].user

虽然这行得通,但我想知道如何在中间件中公开可以在模型中直接访问的请求对象?

我知道如何创建中间件。我的问题是在模型可以访问的中间件中设置什么? 我只能看到无法在模型中直接访问的请求。 Django是否为每个会话设置了全局变量设置或类似的设置?

尽管通常这不是这样做的方法,但有时还是有原因的(我们在模型中使用管理器,这些管理器只返回允许当前用户看到的对象,它想要知道请求,而我们不控制它函数调用的参数)。

我们使用django-tls实现此目的。 它是一种将请求放入全局的中间件。

但是,总的来说,您的模型不应知道存在HTTP之类的东西,也不会对用户界面做任何假设。 依赖关系在理想情况下应该只在一个方向上运行:视图知道模型存在,因此模型不应该知道视图存在。 如果您必须在Celery任务,管理命令或随机Python代码中执行相同的操作,您会感到很高兴。

最直接(且最不容易出错)的方法是简单地创建一个从视图中调用的新函数,并将请求以及所需的其他任何参数传递给请求。

通常,您希望将关注点分开,这样模型方法才应该真正只采用基本原子类型(字符串,字典,列表,数字等)或其他模型实例。 处理请求和响应的东西应该是视图层的函数,用于格式化模板的东西显然是模板帮助器函数。 这将使事情在以后更易于重构或重新设计。

全球人永远无法解决问题。

我认为在中间件中设置某些内容不是一个好方法。

如果只需要访问request对象,则应将请求传递给模型。 在那里,您可以访问request.userrequest.META字典。

我认为您应该实现process_request()而不是设置变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM