【问题标题】:Django: Context processors in views, bad practice?Django:视图中的上下文处理器,不好的做法?
【发布时间】:2011-10-01 03:30:21
【问题描述】:

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

但是,当我也想在视图中访问它时应该怎么做?

选项 1:在我要访问此 FacebookUser 对象的每个视图中,调用上下文处理器方法或执行完全相同操作的方法。

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

哪种做法更好,有什么推荐的工作方式吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您需要大量的 FacebookUser 对象,请使用中间件。 Documentation is here

    对于示例中间件类:

    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 个人资料对象添加到针对登录用户的每个请求的请求中。所以对不经常使用的对象使用中间件并不是一个好主意。

    【讨论】:

    • 中间件对我来说听起来是个好主意,但我并没有真正考虑过——几乎每个页面都需要它,所以它可能是最好的选择。
    • @Sam:上下文处理器中间件。你已经在使用它了!
    【解决方案2】:

    选项 1. 将上下文处理器的工作委托给另一个函数,然后调用该函数。

    【讨论】:

      【解决方案3】:

      你已经在使用中间件了。

      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

      【讨论】:

        猜你喜欢
        • 2018-02-04
        • 1970-01-01
        • 2013-02-22
        • 2012-06-05
        • 2016-07-01
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多