我正在使用 django Rest 框架并尝试保存一些数据,以便可以通过 GET
、PUT
、DELETE
访问它。
因此,当用户发送 GET
请求时,服务器会发送一些信息(例如随机数),并且在用户对同一网址发送 PUT
请求后需要该信息。如何保存这样的信息?我正在使用基于类的 View 。
所以我想在 GET
方法上保存该信息。
我尝试将该信息保存到类变量 self.information 中,但问题是调用
PUT
方法时 self.information 为空。我也尝试将其保存到 session 中,但与类变量一样,当执行
PUT
方法时, session 也是空的。class SampleClass(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, generics.GenericAPIView): serializer_class = SampleSerializer def get(self, request): random_number = random.randint(0, 10) request.session['number'] = random_number; content = {'random_number': random_number} return Response(content) def put(self, request): number = request.session['number'] # key doesn't exists process_number(number) # ...
最佳答案
在开始之前,请务必注意 HTTP is a stateless protocol ,并且您希望将状态添加到组合中。如果您可以修改正在做的事情,不依赖于以前的请求,从长远来看,这可能会更好。
<小时/>I tried saving that information to class variable self.information, but the problem is self.information is empty when PUT method is getting called.
这是因为the class is re-initialized for each request 。因此,类变量不会跨请求持续存在。即使他们这样做了,也意味着每个人都可以访问持久值,并且尚不清楚这是否是您正在寻找的内容。
I also tried saving it to session, but like class variable, session is also empty when PUT method is being executed
这不起作用because Django sessions are persisted through the use of cookies 。虽然这可能适用于 SessionAuthentication
,但它不适用于浏览器外部发生的任何身份验证。这是因为 session cookie不会被包含在内,所以Django会认为新请求是在不同的 session 下。
现在,仅仅因为 HTTP 大多是无状态的并且这样做可能会导致 future 的麻烦,但这并不意味着您永远不应该这样做。如果不需要,Django session 就不会存在,并且有一些方法可以在没有 Django session 的情况下保存状态。
- 为状态创建新模型 - 这通常是保存每个用户状态并确保其不会消失的最佳方式。该模型需要一个用户字段以及将存储状态的字段,您所需要做的就是进行一个查询来检索用户的状态对象。
- Use the Django cache - 这是我针对您在问题中指定的情况推荐的方式。当您不需要存储太多状态,状态在每个人之间共享,或者您可以接受它不存在(过期)时,将数据存储在简单的缓存环境中可能效果最好。您可以更好地控制存储的内容,但代价是必须做更多工作。
关于python - 使用 REST 在服务器端保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28001545/