Flask框架的请求与响应

Flask的请求

  • flask的请求数据通过 request 对象来获取
  • 常用属性:
    Flask框架的请求与响应 - 图1
    代码示例: ```python from flask import Flask, request from werkzeug.datastructures import FileStorage

app = Flask(name)

@app.route(‘/‘, methods=[‘get’, ‘post’]) def index():

  1. # 获取请求的基础数据
  2. # print(request.url) # 请求的URL
  3. # print(request.method) # 本次请求的请求方式
  4. # print(request.headers) # 获取请求头信息 类字典对象
  5. # print(request.headers['Host'])
  6. # print(request.headers.get('Host')) # 建议使用get方法, 键不存在不报错
  7. # 请求传递数据 1> URL路径 -> 路由变量 2> 查询字符串 get 3> 请求体 post 4> 请求头 -> request.headers
  8. # 获取查询字符串 -> request.args xx?name=zs&age=20 类字典对象
  9. # print(request.args.get('name'))
  10. # print(request.args.get('age'))
  11. # 请求体: 键值对(表单) 文本(json/xml) 文件(图片/音频)
  12. # 获取post键值对 -> request.form 类字典对象
  13. # print(request.form.get('username'))
  14. # 获取post文本数据 -> request.data / request.json
  15. # print(request.data) # 返回bytes类型
  16. # print(request.json.get('age')) # request.json直接将json字符串转为字典
  17. # 获取post文件 -> request.files 类字典对象
  18. file = request.files.get("avatar") # type: FileStorage
  19. # print(type(file)) # 返回 FileStorage文件对象
  20. # 将文件保存到本地
  21. file.save('123.jpg')
  22. # 获取文件的二进制数据
  23. # img_bytes = file.read()
  24. # print(img_bytes)
  25. return "index"

if name == ‘main‘: app.run(debug=True)

  1. <a name="d9303819"></a>
  2. ### Flask的响应
  3. 1.访问静态资源
  4. 将静态资源放入到 项目的 static 文件夹中<br />通过内置的静态资源的访问路由, URL路径格式为 /static/,例如 static目录放入文件 123.jpg, 则访问URL为 [http://127.0.0.1:5000/static/123.jpg](http://127.0.0.1:5000/static/123.jpg)<br />Flask对象的初始化参数 也可以 修改静态资源的存储和访问路径
  5. 示例代码:
  6. ```python
  7. from flask import Flask
  8. app = Flask(__name__, # 导入名称, flask会根据该参数查询静态文件的存储路径
  9. # 官方建议直接使用__name__, 表示从当前目录中查询静态文件存储路径
  10. static_folder="static1", # 设置静态文件的存储目录
  11. static_url_path='/res/img', # 设置静态文件的URL访问路径 如 127.0.0.1:5000/res/img/123.jpg
  12. )
  13. if __name__ == '__main__':
  14. app.run(debug=True)

2.设置响应数据

Flask中设置响应数据主要有两种方式:

  • 设置多个返回值
  • 自定义响应对象

2.1 三个返回值
Flask中 视图函数的返回值可以设置三个, 分别对应响应体, 响应状态码, 响应头

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/demo1')
  4. def demo1():
  5. # 返回值: 响应体, 响应状态码, 响应头
  6. return 'demo1', 400, {'A': 40}
  7. if __name__ == '__main__':
  8. app.run(debug=True)

2.2 自定义响应对象

  • 视图函数返回的 str / bytes 类型数据会被包装为 Response 响应对象, 也可以 创建响应对象来 自定义响应头 等信息
  1. from flask import Flask, make_response, Response
  2. app = Flask(__name__)
  3. # 自定义响应对象
  4. @app.route('/demo2')
  5. def demo2():
  6. # 视图函数的返回值可以为str/bytes类型, 并且flask内部会将其包装为Response响应对象
  7. # return 'hello flask'
  8. # 创建响应对象 设置响应头时,需要手动创建响应对象
  9. response = make_response('hello flask') # type: Response
  10. # 设置响应头
  11. response.headers['B'] = 10
  12. return response
  13. if __name__ == '__main__':
  14. app.run(debug=True)

3.返回JSON

如果接口需要返回 JSON 数据,在 Flask 中可以直接使用 jsonify() 生成一个 JSON 的响应
不推荐使用 json.dumps() 直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json

  1. from flask import Flask, make_response, Response, jsonify
  2. app = Flask(__name__)
  3. @app.route('/demo3')
  4. def demo3():
  5. dict1 = {'name': 'zs', 'age': 20}
  6. # 字典转json字符串
  7. # return json.dumps(dict1)
  8. # 可以将字典转json字符串, 并且设置响应头的content-type为application/json
  9. # return jsonify(dict1)
  10. return jsonify(name='zs', age=20) # 也支持关键字实参的形式
  11. if __name__ == '__main__':
  12. app.run(debug=True)

4.重定向

  • flask中通过 redirect() 实现重定向功能
  1. from flask import Flask, redirect
  2. app = Flask(__name__)
  3. @app.route('/demo4')
  4. def demo4():
  5. # 重定向到指定网站
  6. # return redirect('http://www.baidu.com')
  7. # 重定向到自己的路由 只需要URL资源段
  8. return redirect('/demo3')
  9. if __name__ == '__main__':
  10. app.run(debug=True)