重定向回上一个页面(点击返回登录前页面):
# 创建了两个视图函数foo和bar,分别显示一个Foo页面和一个Bar页面
@app.route('/foo')
def foo():
return '<h1>Foo page</h1><a href="%s">Do something</a>' % url_for('do_something')
@app.route('/bar')
def bar():
return '<h1>Bar page</h1><a href="%s">Do something </a>' % url_for('do_something')
# 行为视图
@app.route('/do_something')
def do_something():
# do something
return redirect(url_for('hello'))
# 如果在Foo页面上单击链接,我们希望被重定向回Foo页面;如果在Bar页面上单击链接,我们则希望返回
# 到Bar页面的功能。
.获取上一个页面的URL(实现条件)
# 方法一、HTTP_REFERER字段记录了用户所在的原站点URL
# do_something视图的返回值编写为:
return redirect(request.referrer or url_for('hello'))
# 方法二、next
from flask import request
@app.route('/foo')
def foo():
return '<h1>Foo page</h1><a href="%s">Do something and redirect</a>' % url_for('do_something', next=request.full_path)
@app.route('/bar')
def bar():
return '<h1>Bar page</h1><a href="%s">Do something and redirect</a>' % url_for('do_something', next=request.full_path)
# 在do_something视图中,我们获取这个next
# 值,然后重定向到对应的路径:
return redirect(request.args.get('next', url_for('hello')))
next和referer都为空的情况:
def redirect_back(default='hello', **kwargs):
for target in request.args.get('next'), request.referrer:
if target:
return redirect(target)
return redirect(url_for(default, **kwargs))
# 通过设置默认值,我们可以在referer和next为空的情况下重定向到默认的视图。在do_something视图中::
@app.route('/do_something_and_redirect')
def do_something():
# do something
return redirect_back()
URL安全验证(必要)URL验证函数is_safe_url():
from urlparse import urlparse, urljoin # Python3需要从urllib.parse导入
from flask import request
def is_safe_url(target):
ref_url = urlparse(request.host_url)
test_url = urlparse(urljoin(request.host_url, target))
return test_url.scheme in ('http', 'https') and \
ref_url.netloc == test_url.netloc
# 代码修改如下:
def redirect_back(default='hello', **kwargs):
for target in request.args.get('next'), request.referrer:
if not target:
continue
if is_safe_url(target):
return redirect(target)
return redirect(url_for(default, **kwargs))
使用AJAX技术发送异步请求(自动刷新(局部)):
XMLHttpRequest不仅支持HTTP协议,还支持FILE和FTP协议。
AJAX让Web程序也可以 像桌面程序那样获得更流畅的反应和动态效果,AJAX让 Web程序更像是程序,而非一堆使用链接和按钮连接起来的网页资源。(重要)
.使用jQuery发送AJAX请求:
jQuery处理了不同 浏览器的AJAX兼容问题,我们只需要编写一套代码,就可以在所有主 流的浏览器正常运行。
更多参数:http://api.jquery.com/category/ajax/。
返回“局部数据”:
# 1.纯文本或局部HTML模板(返回评论列表)
@app.route('/comments/<int:post_id>')
def get_comments(post_id):
...
return render_template('comments.html')
.JSON数据(可在JS直接操作)
@app.route('/profile/<int:user_id>')
def get_profile(user_id):
...
return jsonify(username=username, bio=bio)
#3.空值
# 有些时候,程序中的某些接收AJAX请求的视图并不需要返回数据给客户端,比如用来删除文章的视图。这时我# # 们可以直接返回空值,并将状态码指定为204(表示无内容),比如:
@app.route('/post/delete/<int:post_id>', methods=['DELETE'])
def delete_post(post_id):
...
return '', 204
# 4.异步加载长文章示例:
# (文章正文下方有一个“加载更多”按钮,当加载按钮被单击时,会发送一个AJAX请求获取文章的更多内容并直# 接动态插入到文章下方。)
from jinja2.utils import generate_lorem_ipsum
@app.route('/post')
def show_post():
post_body = generate_lorem_ipsum(n=2) # 生成两段随机文本
return '''
<h1>A very long post</h1>
<div class="body">%s</div>
<button id="load">Load More</button>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function() {
$('#load').click(function() {
$.ajax({
url: '/more', // 目标URL
type: 'get', // 请求方法
success: function(data){ // 返回2XX响应后触发的回调函数
$('.body').append(data); // 将返回的响应插入到页面中
}
})
})
})
</script>''' % post_body
处理/more的视图函数会返回随机文章正文:
@app.route('/more')
def load_post():
return generate_lorem_ipsum(n=1)
HTTP服务器端推送,HTTP Server Push(HTTP 服务器端推送)
(显示 新提醒和私信的数量,用户的在线状态更新,股价行情监控、显示商品 库存信息、多人游戏、文档协作等)
更多内容:https://stackoverflow.com/a/12855533/5511849