如何在Piston类方法中访问request.user

时间:2010-08-27 01:07:22

标签: python django django-piston

我有一个模型,其中包含一个ManyToMany用户,以跟踪哪些用户'偏爱'特定模型实例。

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

来自活塞的文档:

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

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

2 个答案:

答案 0 :(得分:0)

我不知道活塞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

答案 1 :(得分:0)

从活塞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

编辑:这样做的另一个有点hacky的方法(如果你不希望朋友在is_friended为false的情况下完全通过)将是手动创建一个dict对象,结构如何你喜欢,然后返回它。活塞处理字典与内置发射器一起工作(肯定是JSON,没有尝试其他发射器)