使用 REST 在服务器端保存数据

Saving data on server side using REST

我正在使用 django rest 框架并尝试保存一些数据,以便 GETPUTDELETE.

可以访问这些数据

因此,当用户发送 GET 请求时,服务器会发送一些信息(例如,一个随机数),并且在用户发送 PUT 同一个 url 请求后需要该信息。如何保存这样的信息?我正在使用基于 class 的视图。

所以我想在 GET 方法上保存该信息。

  1. 我尝试将该信息保存到 class 变量 self.information,但问题是 self.information 在调用 PUT 方法时为空。

  2. 我也试过保存到session中,但是和class变量一样,执行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)
        # ...
    

在我开始之前,请务必注意 ,并且您希望将状态添加到组合中。如果你可以重新做你正在做的事情而不依赖于以前的请求,那么在长期 运行.

中可能会更好

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。因此,class 变量不会跨请求持续存在。即使他们这样做了,那也意味着 每个人 都可以访问持久值,但不清楚这是否是您要查找的内容。

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,但它不适用于在浏览器外部发生的任何身份验证。这是因为不会包含会话 cookie,所以 Django 会认为新请求在不同的会话下。


现在,仅仅因为 HTTP 大部分是无状态的并且这样做可能会导致未来的麻烦,这并不意味着您永远不应该这样做。如果不需要,Django 会话就不会存在,并且有一些方法可以在没有 Django 会话的情况下保存状态。

  1. 为状态创建新模型 - 这通常是保存每个用户状态并确保它不会消失的最佳方式。该模型需要一个用户字段以及将存储状态的字段,您需要做的就是有一个查询来检索用户的状态对象。
  2. Use the Django cache - 对于您在问题中指定的情况,这是我推荐的方式。当你不需要存储太多状态,状态在每个人之间共享,或者你可以忍受它不存在(过期),将数据存储在一个简单的缓存环境中可能是最好的。您可以更好地控制存储的内容,但代价是必须做更多的工作。