【问题标题】:How to access the request.user in a Piston classmethod如何在 Piston 类方法中访问 request.user
【发布时间】:2011-04-04 14:02:18
【问题描述】:

我有一个包含 ManyToMany to User 的模型,用于跟踪哪些用户“收藏”了特定模型实例。

在此模型的 API 中,当经过身份验证的用户请求时,我想包含一个“is_favorite”布尔值。但是,似乎任何不是直接模型属性的 api 字段都必须实现为类方法,在 Piston 中调用该方法时不会获得对请求对象的引用,因此我无法知道当前用户是谁是。

来自活塞文档:

除此之外,您还可以定义任何其他您想要的方法。您可以通过将它们的名称包含在 fields 指令中来使用它们,这样做,将使用单个参数调用该函数:模型的实例。 然后它可以返回任何内容,并且返回value 将用作该键的值。

那么,如果只有 Piston CRUD 方法获取请求的实例,我的 classmethod 字段如何生成与当前经过身份验证的用户相关的输出?

【问题讨论】:

    标签: python django django-piston


    【解决方案1】:

    我不知道活塞 API,但是如何使用线程本地中间件来访问请求

    将此添加到中间件

    try:                                                                    
        from threading import local                                         
    except ImportError:                                                     
        from django.utils._threading_local import local                     
    
    _thread_locals = local()                                                
    def get_request():                                                
        return getattr(_thread_locals, 'request', None)                       
    
    class ThreadLocals(object):                                             
        def process_request(self, request):                                 
            _thread_locals.request = request
    

    并使用 ThreadLocals 中间件更新设置

    以及您想从中间件访问请求 import get_request 的任何位置

    如果你想只获取当前用户,修改中间件在线程本地只设置request.user

    【讨论】:

    • 解决活塞 API 中似乎存在的缺陷的好方法。我认为真正的“正确”答案应该是完全不同的,但这成功了,谢谢!
    【解决方案2】:

    从活塞wiki page 它说您可以通过嵌套属性指定外键和多对多字段的内容。你的情况

    class FriendHandler(BaseHandler):
        allowed_methods = ('GET',)
        model = User
        fields = ('userfield_1', 'userfield_2', ('friends', ('is_friended')))
    
        def read(self, request):
            # Anything else you might want to do, but return an object of type User
            # Or whatever your model happens to be called
    

    编辑: 另一种稍微笨拙的方法(如果您不希望朋友在 is_friended 为假的情况下通过)是手动创建一个 dict 对象,该对象的结构如何喜欢,然后退货。活塞使用内置发射器处理 dict (肯定是 JSON 的,没有尝试过其他的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多