Python:在CGI脚本中与会话交互

5 投票
2 回答
6782 浏览
提问于 2025-04-15 15:00

Python的CGI脚本可以读写会话数据吗?如果可以的话,怎么做呢?有没有简单的接口可以用,还是说我得自己写类来实现?

2 个回答

1

我的“低成本”网站托管计划不允许使用wsgi。因为是共享的apache服务器,所以不能使用'mod_wsgi'这个apache模块。我正在开发我自己的类。

为了不从头开始,我正在尝试实现这个网站上提供的一个会话类:http://cgi.tutorial.codepoint.net/a-session-class

8

cgi 中没有“会话”这个概念。如果你使用原始的 cgi,你需要自己写代码来处理会话。

简单来说,会话的工作原理是创建一个独特的 cookie 编号,并将其通过响应头发送给客户端,然后在每次连接时检查这个 cookie。你需要在服务器上某个地方存储会话数据(可以是内存、数据库或磁盘),并用这个 cookie 编号作为钥匙,在客户端每次请求时取出相应的数据。

不过,cgi 并不是用 Python 开发网页应用的好方法。你应该使用 wsgi,并选择一个网页框架。

下面是一个使用 cherrypy 的简单示例。cherrypy.tools.sessions 是一个可以自动处理 cookie 设置、获取和与数据关联的工具:

import cherrypy

class HelloSessionWorld(object):
    @cherrypy.tools.sessions()
    def index(self):
        if 'data' in cherrypy.session:
            return "You have a cookie! It says: %r" % cherrypy.session['data']
        else:
            return "You don't have a cookie. <a href='getcookie'>Get one</a>."
    index.exposed = True

    @cherrypy.tools.sessions()
    def getcookie(self):
        cherrypy.session['data'] = 'Hello World'
        return "Done. Please <a href='..'>return</a> to see it"
    getcookie.exposed = True

application = cherrypy.tree.mount(HelloSessionWorld(), '/')

if __name__ == '__main__':
    cherrypy.quickstart(application)

请注意,这段代码是一个 wsgi 应用,这意味着你可以将它发布到任何支持 wsgi 的网络服务器上(比如 Apache 有 mod_wsgi)。此外,cherrypy 也有自己的 wsgi 服务器,所以你只需用 Python 运行这段代码,它就会在 http://localhost:8080/ 上提供服务。

撰写回答