2012-08-22 60 views
0

我是一名学习Python的PHP程序员,当我有机会的时候。学习Python,Python web应用程序在请求之间保持活动状态

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

我想知道如何工作。

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

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

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

它如何区分请求者和请求者?

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

比方说,我有一个字典保存,这是全球范围内可用于任何浏览器的所有请求之间,或只有一个浏览器。

何时以及如何清除内存。如果一切都停留在内存中。如果应用程序运行数年而未重新启动,该怎么办?必须有某种到期设置或内存处理?

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

+0

有很多东西依赖于您使用的Web框架。 CherryPy与Django的不同之处在于它与Plone不同。不过,我想,尽管如此,对于大多数Web应用程序来说,大部分仍然适用于Python。 – Makoto

+0

我正在使用bottle.py – RoboTamer

回答

0

我会假设答案取决于你在python中使用的web应用程序框架。他们中的一些人拥有会话管理功能,可以通过请求跟踪用户。但是,如果你只有一个基于HTTP的基本端口监听器,那么你必须自己构建任何cookie支持或会话管理。

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

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

编辑:我看到你提到bottle.py,并且它没有提供认证和会话管理,因为它是一个用于快速原型制作的微型框架,不一定适用于大规模应用(尽管并非不可能,只是很多工作)。

+0

我觉得我的问题更一般。例如,假设我有一个http GET var,并将其保存在python字典中。这个字典现在可以在任何浏览器的所有请求中使用,我猜测没有。如果没有,有没有办法让它可用/全球? – RoboTamer

+0

据我所知,bottle.py没有这个功能。但是,没有任何东西会阻止你将其写入文件系统的平面文件,并将其读出或存储在数据库中。正如我前面所述,还有很多其他的python web框架可以提供会话管理和类似的功能。但你不幸选择了一个目前还没有的。抱歉! –

0

是和否。如果你check out this question你知道它是如何工作的Django应用程序。

但是,你说的方式,它不会工作。在一个请求中定义一个字典而不将它传递给某个地方,以便能够在以下请求中访问它,这显然不会在其他请求中提供。所以,是的,你有这样的选择,但它不是开箱即用的!

0

在使用Twisted's 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() 
0

首先,你应该明白在Python 当地全球变量之间的区别,也如何线程本地存储的作品。

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

  • 全球变量在模块范围内的申报和所有线程共享。只要进程正在运行,它们就会生存,除非明确删除
  • 本地变量是那些在函数中声明并为该函数的每次调用实例化的变量。当函数结束时它们被删除,除非它仍然在其他地方被引用。
  • 线程本地 stoarage允许定义特定于当前线程的全局变量。除非明确删除,否则当前线程正在运行。

现在我会尽力回答您的问题原(答案是具体到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。如果是这样,没有标准的做法,因为不同的实施有利有弊。例如this是会话的bottle.py中间件。

可以说我已经保存了一个字典,这个字典是否可以在全球范围内从任何浏览器获得,也可能只有一个浏览器。当和 如何清除内存。

如果一切都停留在内存中。如果应用程序在未重新启动的情况下运行 几年,该怎么办?必须有某种到期 设置或内存处理?

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

相关问题