flask笔记3:响应信息与Session Cookie

Table of Contents

响应信息

01 Abort函数

02 自定义异常处理

03 设置响应信息

04 返回json数据

Cookie与session

01 Cookie

03 session



响应信息

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 设置响应信息

自定义响应头:

  1. 元组

@app.route('/index', methods=["GET"])   

def index():

       return "index page", 400, [("city","beijing"),("ITCAST","python")]#响应体,状态码,响应头

  1. 字典

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数据

猜你喜欢

转载自blog.csdn.net/lagoon_lala/article/details/106760573