flask框架学习(4)-处理请求

1.获取json格式的请求体
2.获取表单格式的请求体
3.获取请求中的查询参数
4.文件保存
5.URL路径参数(动态路由)
6.其它的参数属性
7.前置/后置处理器(请求钩子)

1.获取json格式的请求体
# 即 Content-Type:application/json 

import json
from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=["post"])
def deal_request():

    # 数据的格式为bytes,加入了as_test=True参数后就变成Unicode
    # 此时data是字典格式,然后可以通过字典的key去获取对应的value
    data = json.loads(request.get_data(as_text=True))
    
    # 也可以用下面这种写法 
    # data =json.loads(request.data) 
    print(data)
    return "ok"

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

# data的结果 :{'name': 'abc', 'age': 18}

2.获取表单格式的请求体
# 如果是文件上传,一般Content-Type设置为multipart/form-data
# 如果普通表单提交,一般Content-Type设置为application/x-www-form-urlencoded
# 都可以使用request.form去获取值

# -*-coding:utf-8-*-
from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=["post"])
def deal_request():
    
    # 此时data是字典格式,然后可以通过字典的key去获取对应的value
    data = request.form
    
    print(data)
    print(data["name"])
    return "ok"

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

# data的结果 ImmutableMultiDict([('name', 'abc'), ('age', '18')])
# data["name"] 的结果 abc

3.获取请求中的查询参数
# -*-coding:utf-8-*-
from flask import Flask, request

app = Flask(__name__)

@app.route('/api', methods=["get"])
def deal_request():

    # 此时data是字典格式,然后可以通过字典的key去获取对应的value
    data = request.args
    
    print(data)
    print(data["page"])
    return "ok"

if __name__ == '__main__':
    app.run(debug=True)
    
# data的结果 ImmutableMultiDict([('page', '1'), ('num', '10')])
# data["page"] 的结果 1

4.文件保存
from flask import Flask, request
app = Flask(__name__)

@app.route('/', methods=["post"])
def deal_request():
    
    files = request.files["files"]
    print(files)
    
    # 获取文件名
    print(files.filename)
    
    # 设置保存位置
    files.save("./" + files.filename)
    return "ok"

if __name__ == '__main__':
    app.run(debug=True)
 
# files结果: <FileStorage: '1.txt' ('text/plain')>
# files.filename 1.txt

5.URL路径参数(动态路由)
eg: 有一个请求访问的接口地址为/detail/100,其中100实际上为具体的请求参数,
    请求文章详情页id为100的文章。此时如何从url中提取出100?

@app.route('/detail/<detail_id>',methods=["get"])
def detail_info(detail_id):
    print(detail_id)
    return "ok"
    
此处的<>即是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、
并以字符串为数据类型类型、 udetail_id为参数名传入视图。
6.其它的参数属性

7.前置/后置处理器(请求钩子)
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

    1.before_first_request
        在处理第一个请求前执行

    2.before_request
        在每次请求前执行
        如果在某修饰的函数中返回了一个响应,视图函数将不再被调用

    3.after_request
        如果没有抛出错误,在每次请求后执行
        接受一个参数:视图函数作出的响应
        在此函数中可以对响应值在返回之前做最后一步修改处理
        需要将参数中的响应在此参数中进行返回

    4.teardown_request:
        在每次请求后执行
        接受一个参数:错误信息,如果有相关错误抛出


# 示例:
# -*- encoding: utf-8 -*-
from flask import Flask, make_response, abort, jsonify, request

# Flask类接收一个参数__name__
app = Flask(__name__)


@app.before_request
def before_request():
    "每次请求前执行的函数"

    # 获取请求的url
    print(request.url)

    # 获取请求头的值
    print(request.headers.get("User-Agent"))

    # 进去鉴权
    if request.headers.get("permission") is None:
        """
        使用abort抛出异常,程序不会继续往下执行
        使用make_response + jsonify 返回 json格式的数据,否则将返回html格式的数据
        """
        error_message = {"result": "warn", "info": "无权限访问"}
        response = make_response(jsonify(error_message), 403)
        response.headers['Content-Type'] = 'application/json'
        abort(response)


# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
    return 'Hello World'


@app.after_request
def after_request(response):
    """每次请求后执行的函数"""
    print("每次请求结束后执行的函数")
    
    # 需要把响应return出去,不然会报错
    return response


# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, debug=True)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:flask框架学习(4)-处理请求

本文作者:伟生

发布时间:2022-10-01, 21:03:00

最后更新:2024-01-14, 16:58:24

原始链接:http://yoursite.com/2022/10/01/flask_10_deal_request/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏