Django:在视图中使用上下文处理器是坏习惯吗?

0 投票
3 回答
2081 浏览
提问于 2025-04-16 21:05

在我的Django项目中,我有一个上下文处理器,它根据请求中的cookies返回一个FacebookUser对象(使用Facebook的Python SDK)。这意味着当用户登录时,他们对应的FacebookUser对象在我的模板中总是可以使用。

但是,当我想在视图中访问这个对象时,我该怎么做呢?

选项1:在每个需要访问这个FacebookUser对象的视图中,调用上下文处理器的方法,或者调用一个做同样事情的方法。

选项2:同样,在每个视图中,调用RequestContext(request),这样就可以访问上下文处理器已经添加到上下文中的对象。

哪种做法更好?有没有推荐的工作方式?

3 个回答

0

你已经在使用中间件了。

https://docs.djangoproject.com/en/1.3/topics/http/middleware/#middleware

你只需要实现一个叫做 process_request 的功能,这样每次请求的时候就会自动执行了。

https://docs.djangoproject.com/en/1.3/topics/http/middleware/#process_request

1

选项1:把上下文处理器的工作交给另一个函数去做,然后调用那个函数。

3

如果你经常需要使用 FacebookUser 对象,那就可以考虑用中间件。这里有相关文档

下面是一个中间件类的示例:

class FacebookApiIntegrator(object):

    def process_request(self, request):
        if request.user.is_authenticated():# check if user has logged in
            request.facebook = <your profile func or obj..>

在任何视图中,你只需要这样使用:

request.facebook

不过要记住,你的中间件会在每次请求时都运行,并且会在每个已登录用户的请求中添加 Facebook 个人资料对象。所以,如果一个对象不常用,使用中间件就不是个好主意。

撰写回答