Python Pyramid 消息闪现
消息闪现机制是由网络应用框架用来向用户提供关于其与应用的交互的反馈的。闪现的消息由会话对象中的队列来保存。
闪现消息机制使得在一个视图中创建消息,并在下一个被调用的视图函数中渲染消息成为可能。就像前面的部分一样,我们必须首先启用会话工厂才能处理会话。要在消息队列中添加消息,可以使用会话对象的 flash() 方法。
request.session.flash('Hello World')
会话有 pop_flash() 和 peek_flash() 方法。pop_flash()方法从队列中删除最后添加的消息。peek_flash()方法在队列中有消息时返回true,否则返回false。
这两个方法用于模板网页中,从队列中获取一个或多个消息,并将其作为响应的一部分渲染出来。
消息闪烁示例
下面的示例演示了消息闪烁机制。在这里,login()视图代码检查它是通过POST还是GET方法调用的。如果方法是GET,它会渲染带有用户名和密码字段的登录表单。提交的表单使用POST方法提交到同一个URL。
当检测到POST方法时,视图进一步检查输入的有效性,并将适当的消息闪烁到会话队列中。这些错误的闪烁消息由登录模板本身提取,而在成功的闪烁消息之后,客户端被重定向到index()视图以渲染index模板。
应用程序代码中的两个视图为−
@view_config(route_name='login', renderer='templates/login.html')
def login(request):
if request.method == 'POST':
if request.POST['password']=='' or request.POST['username']=='':
request.session.flash('User name and password is required')
return HTTPFound(location=request.route_url('login'))
if len(request.POST['password'])in range(1,9):
request.session.flash('Weak password!')
if request.POST['username']not in ['admin', 'manager', 'supervisor']:
request.session.flash('successfully logged in!')
return HTTPFound(location=request.route_url('index'))
else:
request.session.flash('Reserved user ID Forbidden!')
return HTTPFound(location=request.route_url('login'))
return {}
@view_config(route_name='index', renderer='templates/index.html')
def index(request):
return {}
登录.html模板有以下代码-
<!doctype html>
<html>
<head>
<style>
p {background-color:grey; font-size: 150%}
</style>
</head>
<body>
<h1>Pyramid Message Flashing Example</h1>
{% if request.session.peek_flash()%}
<div id="flash">
{% for message in request.session.pop_flash() %}
<p>{{ message }}</p>
{% endfor %}
</div>
{% endif %}
<h3>Login Form</h3>
<form action="" method="POST">
<dl>
<dt>Username:
<dd><input type="text" name="username">
<dt>Password:
<dd><input type="password" name="password">
</dl>
<input type="submit" value="Login">
</form>
</body>
</html>
在显示登录表单之前,jinja2模板代码遍历消息队列,并弹出 **
<
div id=’flash’> ** 部分中的每条消息。
以下是 index.html 的脚本,用于闪现由login()视图插入的成功消息−
<!doctype html>
<html>
<head>
<style>
p {background-color:grey; font-size: 150%}
</style>
</head>
<body>
{% if request.session.peek_flash()%}
<div id="flash">
{% for message in request.session.pop_flash() %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
<h1>Pyramid Message Flashing Example</h1>
<h3>Do you want to <a href = "/login">
<b>log in?</b></a></h3>
</body>
</html>
示例
此示例的应用程序代码为 main.py
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
from pyramid.httpexceptions import HTTPFound
my_session_factory = SignedCookieSessionFactory(' abcQWE123!@#')
@view_config(route_name='login', renderer='templates/login.html')
def login(request):
if request.method == 'POST':
if request.POST['password']=='' or request.POST['username']=='':
request.session.flash('User name and password is required')
return HTTPFound(location=request.route_url('login'))
if len(request.POST['password'])in range(1,9):
request.session.flash('Weak password!')
if request.POST['username']not in ['admin', 'manager', 'supervisor']:
request.session.flash('successfully logged in!')
return HTTPFound(location=request.route_url('index'))
else:
request.session.flash('Reserved user ID Forbidden!')
return HTTPFound(location=request.route_url('login'))
return {}
@view_config(route_name='index', renderer='templates/index.html')
def index(request):
return {}
if __name__ == '__main__':
with Configurator() as config:
config.set_session_factory(my_session_factory)
config.include('pyramid_jinja2')
config.add_jinja2_renderer(".html")
config.add_route('login','/login')
config.add_route('index','/')
config.scan('flash')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
将此程序代码另存为 app.py ,放在Pyramid虚拟环境的flash子文件夹中,其中包含一个空的 __init__.py 。将两个模板(”index.html”和”login.html”)存储在 flush\templates 文件夹中。
输出
运行main.py,在浏览器中点击 http://localhost:6543/login 链接打开登录表单。
尝试输入保留的用户名’admin’、’manager’或’supervisor’之一。错误信息将如下所示闪现 –
此次,输入可接受的凭据并查看结果 −