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

标签 python django django-rest-framework

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

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

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

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

  2. 我也尝试将其保存到 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 的情况下保存状态。

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

关于python - 使用 REST 在服务器端保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28001545/

相关文章:

javascript - 在包含的情况下, View 必须是可调用的或列表/元组

微服务架构中的Django admin + 认证系统

django - 无法使用 Django 和 mongoDB 运行 syncdb

python - Python 2.7 中的线程问题

python - 计算 pandas 系列中的特定值

python - matplotlib 为图像添加蓝色阴影

Django,从带注释的最大值中选择一个最大值(几个字段中的最大值)

python - 如何运行测试 django rest 框架测试?

django - Django Rest Framework的批量,部分更新

python - '操作系统错误 : [WinError 126] The specified module could not be found' when using OpenAI Gym-Atari on Windows 10