【问题标题】:Saving data on server side using REST使用 REST 在服务器端保存数据
【发布时间】:2015-03-16 02:18:07
【问题描述】:

我正在使用 django rest 框架并尝试保存一些数据,以便GETPUTDELETE 可以访问它。

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

所以我想将这些信息保存在 GET 方法中。

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

  2. 我也尝试将其保存到会话中,但就像类变量一样,在执行PUT 方法时会话也是空的。

    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)
        # ...
    

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在我开始之前,请务必注意HTTP is a stateless protocol,并且您希望将状态添加到组合中。如果您可以重做您正在做的事情以不依赖于以前的请求,那么从长远来看可能会更好。


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

    这是因为the class is re-initialized for each request。因此,类变量不会在请求之间持续存在。即使他们这样做了,这也意味着每个人都可以访问持久值,但不清楚这是否是您要寻找的。​​p>

    我也尝试将其保存到会话中,但与类变量一样,执行 PUT 方法时会话也是空的

    这不起作用because Django sessions are persisted through the use of cookies。虽然这可能适用于SessionAuthentication,但它不适用于在浏览器之外发生的任何身份验证。这是因为不会包含会话 cookie,所以 Django 会认为新请求在不同的会话下。


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

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

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2016-12-24
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多