在不使用request.session的情况下将自定义变量添加到Django Middleware中的请求对象中

jsw*_*jsw 2 django middleware request

有没有推荐的方法可以将变量传递给我的所有视图?也就是说,在我的情况下,我想传递一个外键UserUser对象作为django.contrib.auth.models.User对象。我发现大部分(如果不是全部)视图都需要拉出UserProfile对象,并将其放入Middleware中似乎是一种方法。看来我可以做类似以下的事情(我已经在网上看到了一些建议的解决方案):

request.session['userprofile'] = userprofile_object
Run Code Online (Sandbox Code Playgroud)

我不喜欢这样,因为如果我的UserProfile模型曾经有一个不可序列化的字段,它将破坏request.session。

Kry*_*ski 5

如果AuthenticationMiddleware启用,则user所有视图中都会有一个对象。要获取个人资料,您只需user.get_profile在视图中调用即可。例如,要输出配置文件的ID,您可以这样做{{ user.get_profile.id }}

如果您不想每次都不调用用户对象的get_profile函数,则可以在请求中添加任意项。您将创建一个新的中间件,只需设置

request.user_profile = request.user.get_profile()
Run Code Online (Sandbox Code Playgroud)

然后只需在您的settings.py中注册该中间件,就可以了。过去,我曾使用此方法将用户地理位置数据固定到请求对象。