[英]How to set cookie on DRF viewset?
I'd like to know how to set a cookie on Django rest framework ViewSet/ModelViewSet.我想知道如何在 Django rest 框架 ViewSet/ModelViewSet 上设置 cookie。
I read some SO posts that say you can use Response({serializer.data})
, but in retrieve it may be okay, but for create() like the following one, doesn't Response() affect its following processing?我读了一些SO帖子说你可以使用
Response({serializer.data})
,但是在检索它可能没问题,但是对于像下面这样的 create() , Response() 不影响它的后续处理吗?
Actually when I used HttpResponse() like HttpResponse(status=401, reason="you cannot post anymore.")
replacing the raise PermissionDenied()
line in the below one, I got a 500 error (error says AttributeError: 'collections.OrderedDict' object has no attribute 'pk'
or such) but not the specified 401 code.实际上,当我使用 HttpResponse() 之类的
HttpResponse(status=401, reason="you cannot post anymore.")
替换下面的raise PermissionDenied()
行时,我收到了 500 错误(错误显示AttributeError: 'collections.OrderedDict' object has no attribute 'pk'
等)但没有指定的 401 代码。
So basically the following explains what I want to do, that is denies when the user's post count is >= 4, but otherwise continues perform_create() and the following DRF script, with attaching a cookie, that tells browser "you have n post slots left".所以基本上下面解释了我想要做什么,即当用户的帖子计数> = 4时拒绝,否则继续 perform_create() 和下面的 DRF 脚本,附加一个 cookie,告诉浏览器“你有 n 个帖子槽剩下”。
class PostViewSet(viewsets.ModelViewSet):
..
def perform_create(self, serializer):
role = self.request.user.userproperty.role
if role == "guest":
post_count = self.request.user.posts.count()
if post_count >= 4:
raise PermissionDenied({"message": "you cannot post anymore."})
else:
response = // anyhow gets response here //
response.set_cookie("notify", "your post slot is " + str(3 - post_count) + "left now.")
serializer.save(user=self.request.user)
But I don't know how can I possibly get response
from something, or calling Response()
without harming consequences script.但我不知道如何才能从某事中获得
response
,或者调用Response()
而不损害后果脚本。
I tried, but didn't work (as I could expect):我试过了,但没有奏效(正如我所料):
self.request.COOKIES["new_cookie"] = "test."
self.response
. self.response
。 It seems I didn't have an enough research.看来我的研究还不够。 I found a solve:
我找到了解决办法:
def create(self, request, *args, **kwargs):
response = super().create(request, args, kwargs)
// whatever
response.set_cookie("_hoge", "hogee.")
return response
The point is that perform_create() doesn't deal with Response(), while create() does;关键是 perform_create() 不处理 Response(),而 create() 处理; since create() calls perform_create(), it was no problem to move the block to create().
由于 create() 调用 perform_create(),所以将块移动到 create() 是没有问题的。
Reference: Adding extra data to Django Rest Framework results for entire result set - Stack Overflow参考: 将额外数据添加到 Django Rest 整个结果集的框架结果 - 代码日志
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.