Flask day2 HTTP进阶(实践)

重定向回上一个页面(点击返回登录前页面):

# 创建了两个视图函数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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值