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

时间:2015-09-09 16:37:54

标签: python django django-middleware

我目前正在使用以下代码在我的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是否每个会话都有一个全局变量设置或类似的东西?

2 个答案:

答案 0 :(得分:2)

虽然这通常不是这样做的方式,但有时也有原因(我们在模型上使用管理器,只返回当前用户可以看到的对象 - 它想知道请求,我们不要&# 39; t控制调用函数的参数。)

我们使用django-tls来实现这一目标。它是一个将请求放在全局中的中间件。

但是,一般来说,您的模型不应该知道存在类似HTTP的内容,或者对用户界面做出任何假设。理想情况下,依赖关系应仅在一个方向上运行:视图知道模型存在,因此模型不应该知道存在视图。如果你必须在Celery任务,管理命令或随机Python代码中做同样的事情,你会很高兴你这样做。

答案 1 :(得分:1)

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