Python Pyramid 会话
会话是客户端登录服务器并退出服务器之间的时间间隔。会话对象也是一个字典对象,包含会话变量和相关值的键值对。在Pyramid中,它作为请求对象的属性可用。
为了处理会话机制,Pyramid应用对象必须配置一个返回会话对象的会话工厂。Pyramid核心提供了一个基本的会话工厂,它使用cookie来存储会话信息。
默认会话工厂
pyramid.session 模块定义了 SignedCookieSessionFactory 类。其对象需要一个密钥来对会话cookie信息进行数字签名。
from pyramid.session import SignedCookieSessionFactory
my_session_factory = SignedCookieSessionFactory('abcQWE123!@#')
Configurator类的 set_session_factory() 方法使用此工厂对象来设置会话。
config.set_session_factory(my_session_factory)
一旦完成这一步骤,会话对象 request.session 将可供实现时使用。要添加会话变量,请使用−
request.session['user'] = 'Admin'
要检索一个会话变量,请使用−
user=request.session['user']
要删除一个会话变量,使用 pop() 方法。
request.session.pop('user')
Session示例
以下是在Pyramid应用程序中使用会话变量的示例。首先,登录路由(与login()视图函数相关联)在浏览器上显示登录表单。
@view_config(route_name='login')
def login(request):
html="""
<html>
<body>
<form action='/add'> Enter User name :
<input type='text' name='user'>
<input type='submit' value='submit'>
</form>
</body>
</html>
"""
return Response(html)
add()函数读取’user’表单属性并使用其值来添加一个会话变量。
@view_config(route_name='addsession')
def add(request):
request.session['user']=request.params['user']
return Response("<h2>Session object added.</h2><br><h3><a href='/read'>click here</a></h3>")
read()视图读取会话变量数据并显示欢迎消息。
@view_config(route_name='readsession')
def read(request):
user=request.session['user']
response="<h2>Welcome {} </h2>".format(user)+"<br><h3><a href='/logout'>Logout</a></h3>"
return Response(response)
这些视图连同会话工厂一起添加到应用程序配置中。
config.set_session_factory(my_session_factory)
config.add_route('login','/')
config.add_route('logout','/logout')
config.add_route('addsession', '/add')
config.add_route('readsession', '/read')
config.scan('session')
示例
完整的代码如下:
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config
from pyramid.session import SignedCookieSessionFactory
my_session_factory = SignedCookieSessionFactory('abcQWE123!@#')
@view_config(route_name='login')
def login(request):
html="""
<html>
<body>
<form action='/add'>
Enter User name :
<input type='text' name='user'>
<input type='submit' value='submit'>
</form>
</body>
</html>
"""
return Response(html)
@view_config(route_name='addsession')
def add(request):
request.session['user']=request.params['user']
return Response("<h2>Session object added.</h2><br><h3><a href='/read'>click here</a></h3>")
@view_config(route_name='readsession')
def read(request):
user=request.session['user']
response="<h2>Welcome {} </h2>".format(user)+"<br><h3><a href='/logout'>Logout</a>>/<h3>"
return Response(response)
@view_config(route_name='logout')
def logout(request):
request.session.pop('user')
response="<h2>You have been logged out </h2><br><h3><a href='/'>Login</a></h3>"
return Response(response)
if __name__ == '__main__':
with Configurator() as config:
config.set_session_factory(my_session_factory)
config.add_route('login','/')
config.add_route('logout','/logout')
config.add_route('addsession', '/add')
config.add_route('readsession', '/read')
config.scan('session')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
将此脚本保存为main.py并放在Pyramid虚拟环境文件夹内的一个子文件夹(名为’session’)。请注意,此子文件夹必须有一个空的 __init__.py 文件,以便被视为一个包。
输出
运行main.py,并输入 http://localhost:6543/ 在浏览器中打开登录表单。
输入用户名并按下“提交”按钮。给定的名称将保存为一个名为’user’的会话变量。
“点击这里” 的链接读取 session 变量并显示欢迎信息。
登出链接弹出 session 变量并将浏览器返回到登录页面。