0

我是一名学习 Python 的 PHP 程序员,只要我有机会。

我读到 Python Web 应用程序在请求之间保持活动状态。这意味着数据保留在内存中并且在请求之间可用,对吗?

我想知道这是如何工作的。

在 php 中,我们放置一个带有唯一令牌的 cookie,并将数据保存在会话中。会话是数组,保存在磁盘或数据库上。在请求会话函数之间,根据具有唯一令牌的 cookie 恢复正确的会话数组。这意味着每个浏览器都有自己独特的会话,并且会话具有预设的到期时间。如果用户处于非活动状态并且触发了过期获取,则会话将被清除。当用户回来时,必须创建一个新会话。

我的理解是 Python 不需要这个,因为应用程序在请求之间保持活动状态。

在 Python 中不是每个请求都有一个唯一的线程吗?

它如何区分请求,请求者是谁?

是否有一种处理方法来分隔用户和应用程序之间的变量?

假设我保存了一个字典,这个字典在来自任何浏览器的所有请求之间是全局可用的,还是仅对那个浏览器可用。

何时以及如何清除内存。如果一切都留在记忆中。如果应用程序运行了几年而没有重新启动怎么办。必须有某种过期设置或内存处理?

一位评论者说这取决于网络应用程序。所以我正在使用 Bottle.py 来学习。

4

4 回答 4

0

在使用Twisted 的Web 服务器之前,我能够在请求之间在 Python 中保留一个对象。我没有尝试亲自查看它是否在浏览器中持续存在,但我有一种感觉。这是文档中的代码片段:

Twisted 包括一个事件驱动的 Web 服务器。这是一个示例 Web 应用程序;注意资源对象如何在内存中持久存在,而不是在每次请求时重新创建:

from twisted.web import server, resource
from twisted.internet import reactor

class HelloResource(resource.Resource):
    isLeaf = True
    numberRequests = 0

    def render_GET(self, request):
        self.numberRequests += 1
        request.setHeader("content-type", "text/plain")
        return "I am request #" + str(self.numberRequests) + "\n"

reactor.listenTCP(8080, server.Site(HelloResource()))
reactor.run()
于 2012-08-23T09:16:26.460 回答
0

是和不是。如果您查看这个问题,您就会了解它如何适用于 Django 应用程序。

但是,按照您所说的方式,它不起作用。在一个请求中定义一个字典而不将其传递到某个地方以使其在后续请求中可访问显然不会使其在进一步的请求中可用。所以,是的,你可以选择这样做,但它不是开箱即用的!

于 2012-08-22T01:40:23.577 回答
0

我认为答案将取决于您在 python 中使用的 Web 应用程序框架。其中一些具有会话管理部分,可以跨请求跟踪用户。但是,如果您只有一个基本的端口侦听器来响应 http,则您必须自己构建任何 cookie 支持或会话管理。

另一个很大的区别是,在 php 中,您在服务器上安装了一个模块,实际的 http 服务器委托给该模块以生成响应。PHP 不处理响应的路由或实际服务。其中 python 实际上可以是服务器和生成响应的资源。这取决于运行服务器的机器上如何安装/访问 python。因此,从这个意义上说,您可以在 python Web 应用程序中做任何您想做的事情。

如果你有兴趣,你应该看看一些可用的python web 框架

编辑:我看到你提到了bottle.py,并且开箱即用,它不提供身份验证和会话管理,因为它是一个用于快速原型设计的微型框架,不一定适合大型应用程序(尽管并非不可能,只是很多工作)。

于 2012-08-22T01:15:22.820 回答
0

首先你应该了解python中局部变量和全局变量的区别,以及线程本地存储是如何工作的。

这是一个(非常)简短的解释:

  • 全局变量是在模块范围内声明的变量,并由所有线程共享。只要进程正在运行,它们就会存在,除非明确删除
  • 局部变量是在函数内部声明并在每次调用该函数时实例化的变量。当函数结束时它们会被删除,除非它仍然在其他地方被引用。
  • 线程本地存储允许定义特定于当前线程的全局变量。除非明确删除,否则与当前线程运行时一样活跃。

现在我将尝试回答您最初的问题(答案是特定于bottle.py,但它是python Web 服务器中最常见的实现)

Doesn't each request get a unique thread in Python?

每个并发都有一个单独的线程,未来的请求可能会重用以前的线程。

How does it distinguish between requests, who the requester is?

bottle.py 使用线程本地存储来访问当前请求

Is there a handling method to separate vars between users and application?

听起来你正在寻找一个session. 如果是这样,则没有标准的方法,因为不同的实现方式各有优缺点。例如,这是一个用于会话的 bottle.py 中间件。

假设我保存了一个字典,这个字典在来自任何浏览器的所有请求之间是全局可用的,还是仅对那个浏览器可用。何时以及如何清除内存。

如果一切都留在记忆中。如果应用程序运行了几年而没有重新启动怎么办。必须有某种过期设置或内存处理?

确切地说,必须有一个过期设置。由于您使用的是自定义字典,因此您需要一个计时器来检查字典中的每个条目是否过期。

于 2012-08-23T10:15:59.980 回答