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

3 投票
2 回答
602 浏览
提问于 2025-04-16 03:22

我有一个模型,这个模型和用户之间有多对多的关系,用来记录哪些用户“收藏”了某个模型实例。

在我的这个模型的API中,当经过认证的用户请求时,我想加一个“is_favorite”的布尔值,表示这个用户是否收藏了这个模型。不过,似乎任何不是直接模型属性的API字段都必须作为类方法来实现,而在Piston中调用这个方法时,并不会得到请求对象的引用,因此我就不知道当前用户是谁了。

根据Piston的文档:

除了这些,你还可以定义任何你想要的方法。你可以通过在字段指令中包含这些方法的名字来使用它们,这样这个函数会接收一个参数:模型的实例。然后它可以返回任何东西,返回值将作为那个键的值。

所以,如果只有Piston的CRUD方法能获取请求的实例,那我的类方法字段怎么才能生成与当前认证用户相关的输出呢?

2 个回答

0

在piston的维基页面上提到,你可以通过嵌套属性来指定外键和多对多字段的内容。在你的情况下

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为假时传递朋友的信息),就是手动创建一个字典对象,按照你想要的结构来组织,然后返回这个字典。piston会处理这个字典,并与内置的发射器一起工作(JSON发射器肯定可以用,其他的我没试过)

0

我对piston 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

撰写回答