Flask——request请求、异常处理abort、构造响应信息、与前端交互、cookie、session

request请求: request对象中保存了一次http请求中的一切信息。包括:data、form、args、cookies、headers、method、url、files。

  • data:记录请求的数据,并转换成字符串
  • form:记录请求中的表单数据
  • args:记录请求中的查询参数
  • cookies:记录请求中的cookie信息
  • headers:记录请求中的报文头信息
  • method:记录请求中的http方法
  • url:记录请求的url地址
  • files:记录请求上传的文件
from flask import Flask, request

app = Flask(__name__)


# request中包含了前端发送过来的所有请求数据
@app.route("/index", methods=["GET", "POST"])
def index():
    # 通过request.form可以直接提取请求体中的表单格式的数据,是一个类似字典的对象,可以当做字典一样操作
    # get()方法只能拿到多个同名参数的第一个
    name = request.form.get("name")  # request.form["name"]这种形式也能获取数据,但是你要确定这个键是存在的,否则会报错,所以获取字典的键值,建议使用get的方式
    age = request.form.get("age")
    # getlist()方法可以拿到所有的同名的数据,返回一个列表
    name_list = request.form.getlist("name")
    # data提取请求体中非表单格式形式的数据
    print(f"request.data:{request.data.decode('utf-8')}")
    # args是用来提取url中的参数(查询字符串),也是一个类字典的对象
    city = request.args.get("city")
    country = request.args.get("country")
    print(f"request.method={request.method}\n"
          f"request.headers={request.headers}\n"
          f"request.cookies={request.cookies}\n"
          f"request.form={request.form}\n"
          f"request.args={request.args}\n"
          f"request.files={request.files}\n"
          f"request.url={request.url}\n")

    return f"hello name={name}, age={age}, name_list={name_list}, city={city}, counter={country}"


@app.route("/upload", methods=["POST", "GET"])
def upload():
    file_obj = request.files.get("pic")
    if file_obj:
        file_obj.save("./demo.png")
    else:
        return "Find no file!"

    return "Upload successfully!"


if __name__ == "__main__":
    print(app.url_map)
    app.run()

request课题获取请求体里的所有数据,使用postman模拟浏览器请求,执行上段程序,运行结果如下:

1、访问127.0.0.1:5000/index?city=nanjing,body中包含的数据都是表单数据,其中包含了多个同名参数name

2、访问127.0.0.1:5000/upload上传文件,上面表单数据的格式text类型,这里的是file类型注意request.files.get的键名要与表单里的键名一致

3、模拟浏览器发送cookie信息,这里postman的模拟过程如下:

4、访问127.0.0.1:5000/index?country=China&city=nanjing,body中包含的数据都是非表单数据(json格式的数据),使用request.data获取这些数据,并对所有类型数据进行打印输出,结果如下:

构造相应信息、元祖法、make_response

from flask import Flask, make_response


app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def index():
    # 使用元组。返回自定义响应信息,return ×××, ××× ... Python会自动将这些参数打包成一个元组返回,别人收到的也是一个元组
    # 响应信息分别是:响应体, 状态码, 响应头,响应头的格式是:[("键1", "值1"), ("键2", "值2"), (...)]
    # return "Index page", 200, [("Ubuntu", "Python"), ("City", "Beijing")]
    # 响应头的格式也可以是字典
    # return "Index Page", 200, {"Linux": "Python", "City": "Shanghai"}
    # 状态码也可以是非标准的http码
    # return "Index Page --2", 666, {"XXOO": "xxoo", "haha": "lala"}
    # 给状态码添加状态信息,格式:"状态码 状态信息",状态信息不能为中文
    # return "Index Page --3", "666 very good" , {"name": "zhangsan", "age": 18}
    # 响应信息的顺序不能变,但是 响应体, 状态码, 响应头不一定全写,只能从后往前删
    return "Index Page --4", "777 lalala"

@app.route("/index")
def response():
    # 使用make_response返回响应体信息
    res = make_response("Response Page!")
    res.status = "666 very six"
    res.headers["name"] = "Big Head"
    return res


if __name__ == "__main__":
    app.run(debug=True)

运行结果如下:
使用元组返回自定义的响应信息
1、状态码为非标准的http码:

2、给状态码添加状态信息:

使用make_response返回响应体信息
3、make_response 响应体信息运行结果

abort函数: 异常处理

from flask import Flask, abort, Response


app = Flask(__name__)


@app.route("/")
def index():
    # abort函数可以提前终止视图函数
    # 方式一:传递状态码信息,必须是标准的http状态码(常用)
    abort(404)
    print("-----haha-----")
    return "Index Page"
    # 方式二:传递响应体信息
    # res = Response("Not Found", 404, {"name": "zhangsan"})  # Response也可以返回响应体信息
    # abort(res)  # abort 相当于return
    # print("-----haha-----")
    # return "Index Page"


@app.errorhandler(404)
def handle_404_error(err):
    # 自定义异常处理
    # 这个函数的返回值会是前端用户最终看到的结果
    return f"出现了404错误,错误信息是:{err}"

if __name__ == '__main__':
    app.run()

运行结果如下:
1、直接使用abort传递状态码信息:

2、使用abort传递响应体信息


3、abort配合自定义的异常处理函数:

与前端交互

from flask import Flask, jsonify
import json


app = Flask(__name__)


@app.route("/")
def index():
    data = {
        "name": "zhangsan",
        "age": 18,
        "city": "Beijing",
        "country": "china"
    }
    # # json.dumps(字典):将Python中的字典转换成json字符串【json就是字符串】
    # # json.loads(json字符串):将json字符串转换为Python中的字典
    # json_str = json.dumps(data)
    # # 虽然已经将字典转换成json字符串了,但是响应头里的Content-Type并不是json,还需要设置
    # return json_str, 200, {"Content-Type": "application/json"}

    # jsonify()可以帮助我们转换json数据并设置响应头Content-Type: application/json
    # 方式一:将字典传入jsonify
    return jsonify(data)
    # 方式二:直接以关键字的形式传参
    # return jsonify(name="lisi", age=18, city="shanghai")


if __name__ == '__main__':
    app.run()

运行结果如下:

cookie值的设置、获取与删除

首先简单的介绍一下cookie,在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并登录成功后,第二次请求服务器依然不知道当前请求的是哪个用户。cookie的出现解决了这个问题,第一次登录后服务器会返回一些数据(cookie)给浏览器,然后浏览器保存到本地,当用户第二次请求的时候,就会自动把上次请求存储的cookie数据自动的携带给服务期,服务器通过携带的数据就能判断当前用户是哪一个了。cookie存储的数量是有限的,因此只能存储一些小量的数据。

还有一个跟cookie很像的东西就是session,都是为了存储用户的相关信息,不同的是:cookie是存储在本地浏览器,二session存储在服务器。存储在服务器的数据会更加安全,不易被窃取。但是存储在服务器也有一个弊端,就是会占用服务器资源。但是服务器发展到现在,存储一些session是绰绰有余的。

cookie和session结合使用: 在如今的市场和企业中,一般存储方式有两种:

  • 1、存储服务器端:通过cookie存储一个session_id,然后具体的信息保存到session中,如果用户已经登录,则服务器会在cookie中保存一个session_id,下次请求时,会把session_id携带上来,服务器根据session_id 和 session库中获取session数据,就能知道该用户到底是谁了。专业术语叫:sever side session
  • 2、将session加密,然后存储到cookie中,专业术语叫:client side session,Flask就是采用的这种方式,也可以替换成其他方式。

Flask中的cookie是通过response对象来操作的,可以在response返回之前通过response.set_cookie 来设置。这个方法有几个参数需要注意:

  • key:设置的cookie的key。
  • value:key对应的value。
  • max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。
  • expires:过期时间,应该是一个datetime类型。
  • domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com
  • path:该cookie在哪个路径下有效。

使用:

  • 获取:request.cookies.get(key, ‘默认值’)
  • 设置:resp.set_cookie(key, value, max_age=整数)
  • 删除:resp.delete_cookie(key)
from flask import Flask, make_response, request


app = Flask(__name__)

# 设置cookie值
@app.route("/")
def set_cookie():
    res = make_response("Set cookie")
    # 设置cookie值,默认有效期是临时cookie,浏览器关闭即失效,设置几个写几个
    res.set_cookie("Username", "zhangsan")
    res.set_cookie("Password", "123456")
    # max_age 设置有效期,单位 秒
    res.set_cookie("City", "Nanjing", max_age=3600)

    return res

# 直接在响应头中设置cookie
@app.route("/set_cookie")
def set_cookie_2():
    res = make_response("Set cookie --2")
    # 其实set_cookie真正做的是在响应头里加了一个"Set-Cookie",可以直接操作响应头设置cookie值
    res.headers["Set-Cookie"] = "Username=laowang"
    return res

# 获取cookie值
@app.route("/get_cookie")
def get_cookie():
    cookie = request.cookies.get("Username")
    return f"The username in cookie is {cookie}"

# 删除cookie值
@app.route("/delete_cookie")
def delete_cookie():
    res = make_response("Delete cookie")
    res.delete_cookie("Username")
    return res


if __name__ == '__main__':
    app.run()

运行结果如下:
1、设置cookie值,set_cookie方法

2、访问127.0.0.1:5000/,设置cookie值,再访问127.0.0.1:5000/get_cookie时,请求体中会带上服务器设置的cookie值

3、获取cookie值

4、删除Username 的这个cookie值,再次访问127.0.0.1:5000/get_cookie时发现请求头里的这个cookie值已经没有了

session的设置、获取与删除

from flask import Flask, session

app = Flask("__name__")

# Flask默认是把session保存到cookie里,这样是不安全的,所以需要设置秘钥字符串,否则会报错
app.config["SECRET_KEY"] = "qwertyuiopasdfghjk"


@app.route("/")
def login():
    # session 可以当做字典一样设置键值对
    session["name"] = "zhangsan"
    session["password"] = "zhangsan1234"

    return "login success"


@app.route("/index")
def index():
    # 获取session数据
    name = session.get("name")
    password = session.get("password")
    return f"Hello, {name}, password={password}"


@app.route("/delete_session")
def delete_session():
    # 删除session值
    try:
        session.pop("name")
        session.pop("password")
        return "Session is deleted"
    except:
        return "The session has been deleted!"


if __name__ == '__main__':
    app.run()

运行结果如下:
1、设置session值

2、获取session值

访问相同地址时,cookie里面都会带有这个session值

3、删除session值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值