Flask的请求和响应
发布日期:2021-05-25 07:17:11 浏览次数:19 分类:原创文章

本文共 8880 字,大约阅读时间需要 29 分钟。

Flask中的request请求

  • request:flask中代表当前请求的 request 对象
  • 作用:在视图函数中取出本次请求数据
  • 导入from flask import request
  • 代码位置
    • 代理类 from flask.app import Request,
    • 源码类:from werkzeug.wrappers.Request
    • 父类:from werkzeug.wrappers.base_request

常用的属性如下:

属性 说明 类型
data 记录请求体的数据,并转换为字符串
只要是通过其他属性无法识别转换的请求体数据
最终都是保留到data属性中
例如:有些公司开发小程序,原生IOS或者安卓,这一类客户端有时候发送过来的数据就不一样是普通的表单,查询字符串或ajax
bytes类型
form 记录请求中的html表单数据 MultiDict
args 记录请求中的查询字符串,也可以是query_string MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的请求头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件列表 *
json 记录ajax请求的json数据 json

获取args参数

获取get参数的数据,也就是url问号后的键值对数据

from flask import Flask, requestapp = Flask(__name__)@app.route('/args')def args():    """1.获取查询字符串 """    # request    print(request)    """        访问路径:            http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running        打印结果:            <Request 'http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running' [GET]>    """    # 获取原生查询字符串 query_string    print(request.query_string)    """        访问路径:            http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running        打印结果:            b'name=pure3417&pwd=123&like=sing&like=running'    """    # 获取查询字符串    print(request.args)  # 获取查询字符串 也就是url问号后面的    """        访问路径:            http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running        打印效果:            ImmutableMultiDict([('name', 'zero'), ('pwd', '123')])        MultiDict内部实现的是OrderDict字典结构        from collections import OrderedDict   # 有序字典    """    # 获取指定参数的值,有两种方式    print(request.args.get('name'))    print(request.args['name'])  # 不推荐,获取没有指定的参数会报错    """        访问路径:            http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running        打印结果:            pure3417    """    # 获取指定参数的多个值,用于接收表单的多选框值  列表类型    print(request.args.getlist('like'))    """        访问路径:            http://127.0.0.1:5000/args?name=pure3417&pwd=123&like=sing&like=running        打印结果:            ['sing', 'running']    """    return 'hello flask'if __name__ == '__main__':    app.run(debug=True)

获取data请求体数据

接受客户端发送过来的原生请求体数据,是request.json,request.form,request.files等无法接收的数据,全部会保留到这里

from flask import Flask, requestimport jsonapp = Flask(__name__)@app.route("/post", methods=["post", "put", "patch"])def post():    """2.获取请求体请求数据"""    """        请求路径:http://127.0.0.1:5000/post        参数:JSON            {                'username': 'pure3417',                'pwd': '123456'            }    """    print(request.data)  # 打印结果:b'{\n\t"name": "pure3417",\n\t"pwd": "123456"\n}'    data = json.loads(request.data)    print(data)  # 结果: {'name': 'pure3417', 'pwd': '123456'} 在flask版本较低中使用    return "post ok"if __name__ == '__main__':    app.run(debug=True)

获取form表单数据

from flask import Flask, requestimport jsonapp = Flask(__name__)@app.route("/form", methods=['post'])def form():    # 接受表单提交的数据    print(request.form)  # ImmutableMultiDict([('password', '123456'), ('username', 'pure3417')])    print(request.form.get("username"))  # pure3417    return "ok"if __name__ == '__main__':    app.run(debug=True)

获取files文件

from flask import Flask, requestapp = Flask(__name__)@app.route("/files", methods=['post'])def files():    # 接收上传,files是一个列表    print(request.files)  # ImmutableMultiDict([('avatar', <FileStorage: 'hlw.jpg' ('image/jpeg')>)])    avatar = request.files.get("avatar")  # ImmutableMultiDict([('avatar', <FileStorage: 'hlw.jpg' ('image/jpeg')>)])    print(avatar)  # <FileStorage: 'hlw.jpg' ('image/jpeg')>    return "ok"if __name__ == '__main__':    app.run(debug=True)

获取headers请求头

from flask import Flask, requestapp = Flask(__name__)@app.route('/headers', methods=['get', 'post'])def headers():    # 获取请求头的数据    print(request.headers)    """    访问链接:        http://127.0.0.1:5000/headers    打印内容:        Host: 127.0.0.1:5000        Connection: keep-alive        Content-Length: 0        Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"        Cache-Control: no-cache        Sec-Ch-Ua-Mobile: ?0        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36        Postman-Token: 849df90b-812c-9d9e-5bb0-7dc6d8956038        Accept: */*        Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop        Sec-Fetch-Site: none        Sec-Fetch-Mode: cors        Sec-Fetch-Dest: empty        Accept-Encoding: gzip, deflate, br        Accept-Language: zh-CN,zh;q=0.9    """    print(request.headers.get('Host'))  # 打印内容:127.0.0.1:5000    # 例2:获取自定义的请求头信息    print(request.headers.get('pure'))    """    参数:在Headers上加键值对:  pure     3417    打印内容:3417    """    return 'header ok'if __name__ == '__main__':    app.run(debug=True)

获取url地址

from flask import Flask, requestapp = Flask(__name__)@app.route('/urls', methods=['post'])def url():    # 获取本次请求的URL    print(request.url)  # http://127.0.0.1:5000/urls    return 'ok'if __name__ == '__main__':    app.run(debug=True)

获取method方法

from flask import Flask, requestapp = Flask(__name__)# methods=['get', 'post', 'put', 'delete'] 表示允许访问的方法@app.route('/method', methods=['get', 'post', 'put', 'delete'])def method():    # 打印请求方法    print(request.method)    """    get 的时候打印:    GET    post的时候:    POST    put的时候:    PUT    delete的时候:    DELETE    """    return 'method ok'if __name__ == '__main__':    app.run(debug=True)

获取json数据

from flask import Flask, requestapp = Flask(__name__)# methods=['get', 'post', 'put', 'delete'] 表示允许访问的方法@app.route('/json', methods=['get', 'post', 'put', 'delete'])def json():    # 接受ajax或其他客户端提交过来的json数据    print(request.json)  # {'username': 'pure34q7', 'password': '123'}    return 'json ok'if __name__ == '__main__':    app.run(debug=True)

Flask中的响应

flask默认支持2种响应方式:

  • 数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式

  • 页面响应: 重定向

响应的时候,flask也支持自定义http响应状态码

返回页面响应

from flask import Flask, make_responseapp = Flask(__name__)@app.route('/')def index():    # [默认支持]响应html文本    return "<h1>hello user</h1>"    # return make_response("<h1>hello user</h1>")  # 等同于上面的一段if __name__ == '__main__':    app.run(debug=True)

返回JSON数据

from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')def index():    # #也可以响应JSON格式代码    # data = {    #     "id":1,    #     "uname":"pure3417"    # }    # 支持列表形式的JSON数据    data = [        {"id": 1, "username": "pure3417", "age": 18},        {"id": 2, "username": "pure3417", "age": 17},        {"id": 3, "username": "pure3417", "age": 16},        {"id": 4, "username": "pure3417", "age": 15},    ]    # flask中返回json数据,都是flask的jsonify方法返回就可以了.    return jsonify(data)if __name__ == '__main__':    app.run(debug=True)

响应其他数据格式

from flask import Flask, jsonify, make_responseapp = Flask(__name__)@app.route('/')def index():    # # 返回图片等其他自定义格式数据    # with open('关注.webp', "rb") as f:    #     content = f.read()    # response = make_response(content)    # response.headers["Content-Type"] = "image/jpg"  # MIME type 类型    # return response		# 下载文件    with open("关注.webp","rb") as f:        content = f.read()    response = make_response(content)    response.headers["Content-Type"] = "application/zip"    return responseif __name__ == '__main__':    app.run(debug=True)

具体的 MIME type 类型可以查看

重定向

from flask import Flask, redirectapp = Flask(__name__)@app.route("/")def user():    # 页面跳转 redirect函数就是response对象的页面跳转的封装    return redirect("http://www.baidu.com")    # # redirect内部完成的事情如下:    # from werkzeug.wrappers import Response    # response = Response()    # response.headers["Location"] = "http://www.baidu.com"    # return responseif __name__ == '__main__':    app.run(debug=True)

重定向到自己写的视图函数

可以直接填写自己 url 路径

也可以使用 url_for 生成指定视图函数所对应的 url,通过redirect来完成跳转

from flask import Flask, redirect, url_forapp = Flask(__name__)@app.route("/")def index():    """响应处理"""    # 根据视图名称进行页面跳转    # url_for 根据视图函数名获取对应的uri地址    url = url_for("user")    print(url)  # 仅仅是根据参数从app.url_map中提取对应的url地址    return redirect(url)@app.route("/user")def user():    return "用户中心"if __name__ == '__main__':    app.run(debug=True)

重定向到带有参数的路由视图

from flask import Flask, redirect, url_forapp = Flask(__name__)@app.route("/")def index():    """响应处理"""    # 根据视图名称进行页面跳转    url = url_for("user", user_id=3)    return redirect(url)@app.route("/user/<user_id>")def user(user_id):    return f"用户中心,user_id={user_id}"if __name__ == '__main__':    app.run(debug=True)

自定义响应头和状态码

在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:pure: 3417

from flask import Flask, make_responseapp = Flask(__name__)@app.route('/')def index():    return '状态码为 666', 400# 还可以使用make_response创建Response对象,然后通过response对象返回数据@app.route("/pure")def index2():    response = make_response("ok")    print(response)  # <Response 2 bytes [200 OK]>    response.headers["Company"] = "pure"  # 自定义响应头    response.status_code = 201  # 自定义响应状态码    return responseif __name__ == '__main__':    app.run(debug=True)
上一篇:Flask的会话控制
下一篇:python的安装、卸载

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年05月05日 12时42分19秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章