一.Flask中的request请求
相关的学习文档: http://docs.jinkan.org/docs/flask/api.html#flask.request
request:flask中代表当前请求的 request 对象
作用:在视图函数中取出本次请求数据
导入:from flask import request
常用的属性如下:
1.获取args参数
获取get参数的数据,也就是url问号后的键值对数据
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask from flask import request app = Flask(__name__) @app.route("/") def index(): # request print(request) """ <Request 'http://127.0.0.1:9000/?name=zero&pwd=123' [GET]> """ # 1.获取get参数 # 获取查询字符串 print(request.args) # 获取查询字符串 也就是url问号后面的 """ 访问路径: http://127.0.0.1:9000/?name=zero&pwd=123 打印效果: ImmutableMultiDict([('name', 'zero'), ('pwd', '123')]) MultiDict内部实现的是OrderDict字典结构 from collections import OrderedDict # 有序字典 """ """ 访问路径: http://127.0.0.1:9000/?name=zero&pwd=123&like=sing&like=running 打印结果: zero """ # 获取指定参数的值 print(request.args.get('name')) # 打印结果:zero """ 访问路径: http://127.0.0.1:9000/?name=zero&pwd=123&like=sing&like=running 打印结果: ['sing', 'running'] """ # 获取指定参数的多个值,用于接收表单的多选框值 列表类型 print(request.args.getlist('like')) # 打印结果:['sing', 'running'] return 'hello flask' if __name__ == '__main__': app.run(host='127.0.0.1',port=9000)
2.获取data请求体数据
也就是postman上提交body中的json数据
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask from flask import request import json app = Flask(__name__) @app.route("/post", methods=['post']) def get_post(): """2.获取请求体请求数据""" print(request.data) data = json.loads(request.data) print(data) # 结果: {'username': 'xiaoming', 'pwd': '123456'} 在flask版本较低中使用 """ 访问地址:http://0.0.0.0:9000/post 接收效果:b'{ "username":"xiaoming", "pwd":"123456" }' """ """ 直接获取json数据""" print(request.json) # 0.10版本以下没有 """ 参数:JSON { 'username': 'xiaoming', 'pwd': '123456' } """ return "post ok" if __name__ == '__main__': app.run(host='127.0.0.1', port=9000)
3.获取form表单数据
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask from flask import request from werkzeug.utils import secure_filename import os app = Flask(__name__) @app.route("/file", methods=['post']) def form(): UPLOAD_FOLDER = 'static\uploads' # 文件下载路径 win10 # UPLOAD_FOLDER = 'static/Uploads' # 文件下载路径 linux ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'jpg']) # 文件允许上传格式 """接收上传文件""" print(request.files) """ postman上传类型:form-data 一个文件和一个user:zero 打印: ImmutableMultiDict([('user', 'zero')]) ImmutableMultiDict([('notes', <FileStorage: '笔记.txt' ('text/plain')>)]) FileStorage是一个对象 """ print(request.files.get('notes')) """ 可以调用FileStorage里面的save方法进行文件上传的保存到指定的地址 """ # 获取当前项目的目录 # 也就是当前文科的目录 print(os.path.abspath(os.path.dirname(__file__))) current_path = os.path.abspath(os.path.dirname(__file__)) files = request.files.get('notes') if files and ALLOWED_EXTENSIONS: from unicodedata import normalize filename = secure_filename(normalize('NFKD', files.filename).encode('utf-8', 'ignore').decode('utf-8')) # 使用secure_filename()让文件名变得安全 # Libsite-packageswerkzeugutils.py # 这边需要注意中文文件名上传无法获取中文文件名问题 print(filename) # filename = filename.encode('utf-8', 'strict').decode('utf-8') print(filename) path = os.path.join(current_path, UPLOAD_FOLDER, filename) # 路径拼接 print(path) files.save(path) return "file uploads ok" if __name__ == '__main__': app.run(host='127.0.0.1', port=9000)
4.获取method方法
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask from flask import request app = Flask(__name__) # methods=['get', 'post', 'put', 'delete'] 表示允许访问的方法 @app.route('/method', methods=['get', 'post', 'put', 'delete']) def index(): # 打印请求方法 print(request.method) """ get 的时候打印: GET post的时候: POST put的时候: PUT delete的时候: DELETE """ return 'method ok' if __name__ == '__main__': app.run(host='127.0.0.1', port=9000)
5.获取headers请求头数据
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask from flask import request app = Flask(__name__) @app.route('/headers', methods=['get', 'post']) def headers(): # 获取请求头的数据 print(request.headers) """ 访问链接: http://127.0.0.1:9000/headers 打印内容: Content-Type: application/x-www-form-urlencoded User-Agent: PostmanRuntime/7.21.0 Accept: */* Cache-Control: no-cache Postman-Token: 869ac15a-2648-4042-bb7a-9463666e9208 Host: 127.0.0.1:9000 Accept-Encoding: gzip, deflate Content-Length: 43 Connection: keep-alive """ # print(request.headers.get('Content-Type')) """ 打印内容: application/x-www-form-urlencoded """ # 例2:获取自定义的请求头信息 print(request.headers.get('Cpwd')) """ 参数:在Headers上加键值对: Cpwd ewqoeuqieq1231313 打印内容: ewqoeuqieq1231313 """ return 'header ok' if __name__ == '__main__': app.run(host='127.0.0.1', port=9000)
二.Flask中的响应
flask默认支持2种响应方式:
数据响应: 默认响应html文本,也可以返回 JSON格式
页面响应: 重定向
url_for # 站内不同视图的函数跳转
响应的时候,flask也支持自定义http响应状态码
1.返回页面响应
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask, render_template from flask import make_response # 调用了 render_template模板 # 将templates的目录创建在这个应用的同级目录下 app = Flask(__name__) @app.route('/response') def my_response(): response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') # return '<h1>This document carries a cookie!</h1>' # 效果一样 return response # 在templates目录下创建网页 @app.route('/') def index(): return render_template('index.html') @app.route('/user/<name>/') def user(name): return render_template('user.html', name=name) # 自定义404错误页面 在templates目录下创建网页 # 输入错误的url返回404页面 @app.errorhandler(404) def page_not_found(error): return render_template('404.html'), 404 # 自定义500 错误页面 在templates目录下创建网页 @app.errorhandler(500) def page_not_found(DatabaseError): return render_template('500.html'), 500 if __name__ == '__main__': app.run(host='127.0.0.1', port=5000)
2.返回JSON数据
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask, jsonify app = Flask(__name__) @app.route("/json") def json(): # 也可以响应json格式代码 data = [ {"id": 1, "username": "liulaoshi", "age": 18}, {"id": 2, "username": "liulaoshi", "age": 17}, {"id": 3, "username": "liulaoshi", "age": 16}, {"id": 4, "username": "liulaoshi", "age": 15}, ] # 返回前端json数据 return jsonify(data) if __name__ == '__main__': app.run(port=5000, host='127.0.0.1', debug=True)
返回结果如下:
3.返回重定向redirect
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask from flask import redirect app = Flask(__name__) # 页面跳转响应 @app.route("/user") def user(): # 页面跳转 redirect函数就是response对象的页面跳转的封装 # Location: http://www.baidu.com return redirect("http://www.baidu.com") @app.route("/red") def red(): """站内跳转""" return redirect("/user") # 使用 http://0.0.0.0:5000/red 测试会调到/user再重定向到百度 if __name__ == '__main__': app.run(port=5000, host='127.0.0.1', debug=True)
4.重定向到自己写的视图函数url_for
可以直接填写自己 url 路径
也可以使用 url_for 生成指定视图函数所对应的 url
例:
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "hsz" from flask import Flask, jsonify from flask import redirect, url_for app = Flask(__name__) @app.route("/my_json") def json(): # 也可以响应json格式代码 data = [ {"id": 1, "username": "liulaoshi", "age": 18}, {"id": 2, "username": "liulaoshi", "age": 17}, {"id": 3, "username": "liulaoshi", "age": 16}, {"id": 4, "username": "liulaoshi", "age": 15}, ] # 返回前端json数据 return jsonify(data) @app.route("/red") def red(): """站内跳转 会跳转到json函数中去 和json函数上的url变化无关,不管上面怎么变化始终都能跳转到json视图函数 """ return redirect(url_for("json")) # 使用 http://0.0.0.0:5000/red 测试会重定想到上面的json方法 得到json数据 if __name__ == '__main__': app.run(port=5000, host='127.0.0.1', debug=True)
5.自定义状态码或自定义响应头(开发中常见)
在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:
"""还可以使用make_response创建Response对象,然后通过response对象返回数据""" from flask import make_response @app.route("/rep") def rep(): response = make_response("ok") print(response) # 自定义响应头 response.headers["author"] = "huang" # 自定义响应头信息 # 自定义响应状态码 return response, 222 # 返回自定义状态码222