如何在Piston类方法中访问request.user
我有一个模型,这个模型和用户之间有多对多的关系,用来记录哪些用户“收藏”了某个模型实例。
在我的这个模型的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
。