Table of Contents
响应信息
01 Abort函数
中止视图函数:raise只将错误信息反映在后端,abort会反映在前端
1.abort可接收http标准状态码
from flask import abort @app.route('/upload', methods=["GET"]) def login(): name="" pwd="" if name!= "zhangsan" or pwd != "admin": abort(400) return "登陆成功" |
前端浏览器显示Bad Request
2.可传递响应体信息(Response)
from flask import abort,Response |
res=Response("login failed") abort(res) |
结果和return相似
02 自定义异常处理
自定义错误出现时返回给前端的信息,修改错误提示页面
@app.errorhandler(404)#定义哪种错误码 def handle_404_error(err):#接收错误信息 return u"404错误: %s" % err#前端最终结果 |
03 设置响应信息
自定义响应头:
- 元组
@app.route('/index', methods=["GET"]) def index(): return "index page", 400, [("city","beijing"),("ITCAST","python")]#响应体,状态码,响应头 |
- 字典
return "index page", 400, {"city":"beijing","ITCAST":"python"} |
响应头在浏览器Network可以查看
这样整个定义时可以自定义状态码:
return "index page", "666 ITCAST status", {"city":"beijing","ITCAST":"python"} |
响应体,状态码,响应头返回时可以从右边开始省略,不能省略前面不省略后面
使用make_response构造响应信息:
from flask import make_response |
@app.route('/index', methods=["GET"]) def index(): res=make_response("index page") res.status="666 ITCAST status" res.headers["city"]="bj" return res |
04 返回json数据
Json就是字符串
import json |
data={ "name":"python" } #字典转字符串 json_str=json.dumps(data) |
#字符串转字典 json_d=json.loads(json_str) |
返回信息content-type默认时txt,可修改为json:
@app.route('/index') def index(): data={ "name":"python" } json_str=json.dumps(data) return json_str,200,{"Content-Type":"application/json"} |
Flask中可使用jsonify完成上述效果
from flask import jsonify |
@app.route('/index') def index(): data={ "name":"python" } return jsonify(data) |
也可直接打包数据:
@app.route('/index') def index(): return jsonify(name="python",country="china") |
Cookie与session
01 Cookie
设置cookie:构造响应对象
from flask import make_response |
@app.route('/set_cookie') def set_cookie(): resp=make_response("success") resp.set_cookie("cookie1","cookie1_centent") resp.set_cookie("cookie2","cookie2_centent") return resp |
响应头response headers中会有几条设置cookie信息Set-Cookie:cookie1= cookie1_content
等同于:
resp.headers["Set-Cookie"]="cookie1=cookie1_content" |
Cookie默认有效期限是浏览器会话结束时,关闭浏览器就消失。修改有效期,单位为秒:
resp.set_cookie("cookie2","cookie2_centent",max_age=3600) |
获取cookie:使用request
from flask import request |
@app.route('/get_cookie') def get_cookie(): req=request.cookies.get("cookie1") return req |
删除cookie
@app.route('/delete_cookie') def delete_cookie(): resp=make_response("del_cookie") resp.delete_cookie("cookie1") return resp |
后端并不能让浏览器真的删除cookie,他会将cookie的过期时间修改为创建时间,让它过期
03 session
存放状态信息的会话机制
from flask import session app.config["SECRET_KEY"]="miyue123" |
设置session:
@app.route('/login') def login(): session["name"]="python" session["id"]="123" return "login success" |
获取session:
@app.route('/index') def index(): name=session.get("name") return "hello %s" % name |
在设置session之前取出的name为None
Django是将session放在数据库中,id用cookie保存在浏览器。cookie保存在浏览器
Session有id,每个用户应该有自己的session,如果cookie被禁止使用,id可使用请求url等携带参数,此时有session_id有效期问题,页面关闭无法保存
Flask将session加密后保存到浏览器的cookie中
除此之外,session也可保存到redis,文件,程序内存全局变量
如果由服务器自己保存,将session保存到不同服务器,有session跨服务器的问题
解决方法有:将nginx设置按地域转发,用专门的一个服务器的redis保存session数据