Django:在视图中使用上下文处理器是坏习惯吗?
在我的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 个人资料对象。所以,如果一个对象不常用,使用中间件就不是个好主意。