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

时间:2012-03-01 22:48:22

标签: django request middleware

是否有建议的方法将变量传递给我的所有视图?就是在我的情况下,我想传递一个UserProfile对象,即Foreign keys a django.contrib.auth.models.User对象。我发现大多数(如果不是全部)我的观点需要拉取UserProfile对象并将其置于中间件中似乎是要走的路。看起来我可以做类似下面的事情(我已经在网上看到了几个建议它的解决方案):

request.session['userprofile'] = userprofile_object

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

2 个答案:

答案 0 :(得分:4)

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

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

request.user_profile = request.user.get_profile()

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

答案 1 :(得分:0)

此提案取决于userprofile对象仅在用户已登录时才有意义的假设,因此您可以通过request.user获取登录用户。 应该可以通过反向移动foreignkey键关系来获取userprofile:

if request.user.is_authenticated():
    request.user.userprofile_object_set.all() #gets all related userprofile objects
else:
   #...