如何在Python Web应用程序中启动会话?

时间:2009-07-26 20:00:26

标签: python session

此问题基于this answer

我正在为Python寻找类似于PHP的session_start()的函数。我希望在PHP中访问类似$_SESSION的字典,该字典在运行命令后可用。

5 个答案:

答案 0 :(得分:8)

让我谈谈可能与你的问题有关的一些事情......它可能与你无关,但我认为其他人可能会带着完全相同的问题来到这里,并可能从我(有限的)经验中受益...因为我也曾经有过这个问题。

作为从PHP到Python(从不回头)的人,我认为了解会话如何工作是有用的。实现自己的会话框架可能是个好主意,除非您(a)想要通过执行更多地了解会话管理,或者(b)需要现有框架不提供的内容。

Wikipedia始终是个好地方。底线:会话数据存储在服务器上的某个位置,并由唯一标识符(某种哈希)索引。此标识符在客户端和服务器之间来回传递,通常作为cookie或作为查询字符串(URL)的一部分。出于安全考虑,您需要使用SSL连接或使用其他一些数据(例如IP地址)验证会话ID。默认情况下,PHP将会话存储为文件,但是在可能带来安全风险的共享服务器上,因此您可能希望覆盖会话引擎,以便将会话存储在数据库中。 Python Web框架具有类似的功能。

当我开始用Python进行Web编程时,我发现了两件事。首先,PHP在语言中包含了很多魔力,这让初学程序员(我在2003年)很容易学习语言,但没有教会我如何运作。因此,我发现自己正在研究许多关于Web应用程序的主题,特别是数据库连接池,URL映射,会话和线程。 PHP(以及Django,根据我的理解)抽象出来。其次,PHP是一种非常糟糕的语言;)但它完成了工作!!

我个人使用CherryPy进行Web开发。它将会话管理作为您可以打开的“工具”。

答案 1 :(得分:7)

作为一名来自PHP并且正在使用Python的人,我可以告诉你Django是开始在网上处理Python的好方法。如果您一直在使用MVC frameworks in PHP,则尤其如此。也就是说,Django已经建立了对会话管理的支持,并在此处记录:

http://docs.djangoproject.com/en/dev/topics/http/sessions/

而且,出于好奇,我用普通的python环顾了会话管理,发现了这个:

http://code.activestate.com/recipes/325484/

从评论来看,似乎你最好使用一个经过验证的真实框架来为你处理这个问题。如果你对Django不感兴趣,你也可以checkout some of the others

答案 2 :(得分:5)

您可以考虑查看Beaker库中的Python,它不依赖于任何一个Web框架,它将在兼容WSGI的环境中工作:

  

http://beaker.groovie.org/

     

Beaker是一个用于缓存和会话的库,用于Web应用程序和独立的Python脚本和应用程序。它附带了WSGI中间件,可以轻松地与基于WSGI的Web应用程序一起使用,以及缓存装饰器,以便于使用任何基于Python的应用程序。

答案 3 :(得分:3)

Python本身并不像PHP那样是Web语言,因此它没有内置Web功能。然而,有许多模块添加了这个功能,但是你必须具体说明你正在使用哪个模块。

以下是与the Django framework一起使用的方式,例如:

def post_comment(request, new_comment):
    if request.session.get('has_commented', False):
        return HttpResponse("You've already commented.")
    c = comments.Comment(comment=new_comment)
    c.save()
    request.session['has_commented'] = True
    return HttpResponse('Thanks for your comment!')

在更简单的Web框架中,可能没有会话支持。会话本身并非不可能实现,但您可以找到一个独立的模块,通过接收/发送会话ID来增加支持(会话ID存储在cookie中,几乎所有Web框架都有某种类型的支持。)

答案 4 :(得分:1)

这适用于使用Apache和零框架的Osx上的Python 3.6。直奔Cgi Bin。

#!/usr/local/bin/python3 
# SheBang C:/Apps/Python0306/python.exe 

import os, cgi, sys 
sys.stderr = sys.stdout 
import cgitb 
cgitb.enable()                       
from http import cookies 
from urllib.request import urlopen 

import urllib 
import urllib.request
import urllib.parse
import http.cookiejar

import requests 

import datetime    
import random      

ary_CgiData = cgi.FieldStorage() 
lst_PostValues = [("Alpha","Bravo"), ("Charlie","Delta")]     
lst_PostValues.pop()
lst_PostValues.pop()  
str_Line = ""
variable = ""
value = ""
r = ""
for key in ary_CgiData.keys():  
    variable = str(key)
    value = str(ary_CgiData.getvalue(variable))
    lst_PostValues.append([variable, value]) 

lst_Matrix = lst_PostValues 
str_HtmlTable = "<table border=1>" 
int_R    = 0 
int_C    = 0 
int_Rows = len(lst_Matrix) 
if int_Rows > 0:
    int_Cols = len(lst_Matrix[0]) 
    while (int_R < int_Rows):  
        str_HtmlTable = str_HtmlTable + "<tr>" 
        for int_C in range(int_Cols): 
            str_HtmlTable = str_HtmlTable + "<td>" + str(lst_Matrix[int_R][int_C]) + "</td>"
        str_HtmlTable = str_HtmlTable + "</tr>" 
        int_R = int_R + 1 
    str_HtmlTable = str_HtmlTable + "</table>"    
str_MenuSelectList = str_HtmlTable

print ("Content-Type: text/html\n\n") 
print ("<html>") 

try:
    if str(lst_Matrix[0][1]) == "AddCookies":
        print ("<meta http-equiv='Set-Cookie' content='TestUniversity=ABCDEFGHIJK9876543210;expires=Wednesday, 08-Aug-2025 23:59:59 GMT'>")
    if str(lst_Matrix[0][1]) == "DeleteCookies":
        print ("<meta http-equiv='Set-Cookie' content='TestUniversity=ABCDEFGHIJK9876543210;expires=Wednesday, 08-Aug-1990 23:59:59 GMT'>")    
except:
      int_X = 0

str_CookieTest001 = "" 
handler = {} 
if 'HTTP_COOKIE' in os.environ: 
    cookies = os.environ['HTTP_COOKIE'] 
    cookies = cookies.split('; ') 

    for cookie in cookies: 
        cookie = cookie.split('=') 
        handler[cookie[0]] = cookie[1] 

for k in handler: 
    str_CookieTest001 += (k + " = " + handler[k] + "<br>") 

print ("</head>")
print ("<title>Enter Some Title Here </title>") 
print ("<body>") 
print ("<br><center>Test Example </center><br>") 
print ("<form action='012_SubmittedCode.py' method='post' >") 
print ("<table border=1>") 
print ("<tr><td><center><input type='submit' value='AddCookies' name='MenuSelect'></td>") 
print ("<td><input type='submit' value='DeleteCookies' name='MenuSelect' ></td></tr>") 
print ("</table>") 
print ("<hr><hr>") 
print ("</form>") 
print ("<hr><hr>")

print ("</form>") 

try:            
    print ("Menu Button Selected: " + str(lst_Matrix[0][1]))
except: 
    int_X = 1

print ("<hr><br>")
print ("Menu Option Selected:<br>") 
print (str_MenuSelectList)
print ("<br><hr>")

print ("############ Cookie Return array Method of Choice ############<br><hr>") 
print (str_CookieTest001) 
print ("<hr><hr>")
print ("</body>")
print ("</html>")