文章目录
知识点回顾
- 虚拟环境如何搭建?
- Flask的几种配置方式? 区别是什么?
- 什么是设计模式? 工厂模式是什么?
- 如何封装Flask APP? 意义是什么?
- Flask路由定义的语法是什么? 参数的含义都是什么?
- 如何启动Flask 服务器?
今日内容
- 请求的参数
- 固定参数与转换器
- 查询参数
- 表单数据
- 文件上传
- 其他请求参数
- 响应新手三件套
- json数据与元组数据
- make_response()自定义响应
1. 请求数据及后端获取
1.1 请求的参数
客户端请求的参数可以放三个地方:
- URL参数:
- 固定参数
- 查询字符串
- 请求头
- 请求体
请求参数如下表:
序号 | 参数或信息 | 解释 |
---|---|---|
1 | 固定参数 | URL的组成部分, 不可缺失 |
2 | 查询字符串: args | 根据需求, 可有可无 |
3 | 表单数据: form | 提交form表单时传递的数据 |
4 | 文件上传: files | 用户向服务器上传的文件 |
5 | 请求头: headers | 请求头中携带的请求信息 |
1.2 固定参数与转换器
固定参数
: 地址中的一部分,必需
如 /article/1,这里1作为文章的id, 则是不可缺少的一部分;
/article/1?title=“装饰器”,title跟在?后面, 是查询字符串,非必需
- 固定参数的获取
# 固定参数的获取
@app.route('/users/<user_id>')
def user_info(user_id):
print(user_id,type(user_id))
return '获取到的userid为: {}'.format(user_id)
# 使用<user_id>接收固定参数, 将user_id传给视图。
以上为不限定类型,默认为字符串
类型。
限定类型使用<int:user_id>,固定参数就必须符合类型要求,否则报404。
默认字符串类型:
<name>
<string:name>
float类型
<float: number>
int类型
<int: user_id>
<uuid: uuid>
flask中匹配路由基本都是通过转换器实现,默认有6个转换器:
app.url_map.default_converters
DEFAULT_CONVERTERS = {
'default': UnicodeConverter, # 字符串
'string': UnicodeConverter, # 字符串转换器
'any': AnyConverter, # 任意类型转换器 ?
'path': PathConverter, # 路径转换器 如匹配
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
自定义转换器
# 导入BaseConverter
from werkzeug.routing import BaseConverter
# 自定义Converter类
class PhoneConverter(BaseConverter):
regex = r'1[3-9]\d{9}'
# 添加至converters字典
app.url_map.converters['phone'] = PhoneConverter
# 使用自定义转换器
@app.route('/user/<phone:user_id>')
def user_info(user_id):
reutnr user_id
1.3 查询参数获取
# 查询参数,以?拼接的key=value组合
# /user/?userid=333
# 获取查询参数
request.args.get('key') # 建议
request.args['key']
# 示例:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/')
def user_info():
# 通过['key']形式获取查询参数的user_id
user_id_1 = request.args['userid']
# 通过get方式获取查询参数中的user_id
user_id_2 = request.args.get('userid')
return 'user_id_1: {}, user_id_2: {}'.format(user_id_1, user_id_2)
# 访问路由: http://127.0.0.1:5000/?userid=333, 即可在页面上看到结果.
1.4.表单数据获取
form表单数据, 一般用在登录, 注册信息提交。 将表单数据封装在请求体中。
request.form.get('key')
# 示例
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', method=['POST'])
def login():
# 获取form表单中的用户名
username = request.form.get('uname')
# 获取form表单中的密码
password = request.form.get('pwd')
# 用户名与密码的判断
if username == 'admin' and password == 'admin123':
return '登录成功'
else:
return '登录失败'
if __name__ == '__main__':
app.run()
# apipost访问http://127.0.0.1:5000/, 并指定form-data为{'uname': 'admin', 'pwd': 'admin'}
1.5 文件上传
# 文件对象的获取
file = request.files.get('key')
# 文件对象的属性
file.filename: 上传文件的文件名
file.name: 上传文件指定的key
file.save('path'): 文件对象保存方法
# 示例:
from flask import Flask
from flask import request
# 创建Flask实例对象
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_file():
# 获取前端传递过来的文件对象
img = request.files.get('pic')
# 获取文件对象的文件名
file_name = img.filename
# 保存文件对象
img.save(file_name)
return '上传成功!'
if __name__ == '__main__':
app.run()
1.6 其他请求参数
- headers: 请求头数据
- method: 请求方法
- url: 请求的完整URL地址
- path: 路由地址
# 示例:
from flask import Flask
from flask import request
# 创建Flask实例对象
app = Flask(__name__)
@app.route('/')
def index():
# 请求头信息
print(request.headers)
# 打印请求方法
print(request.method)
# 打印请求的URL
print(request.url)
return 'other args'
if __name__ == '__main__':
app.run()
2. 响应数据之新手三件套
2.1 字符串响应
直接使用return关键字返回一个字符串:
# 字符串
return 'hello flask'
2.2 模板响应
- 建立templates文件夹
- 创建xxx.html页面,在视图中render_template
# 模板的返回
# 示例:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
# render_template()返回模板
return render_template('index.html')
# return render_template("users/index.html")
# 直接在templates下找模板
if __name__ == '__main__':
app.run()
2.3 重定向响应
重定向是跳转至一个新的路由, 使用redirect
- 直接重定向一个外链
- 重定向一个内部链接
# 重定向外链示例:
from flask import Flask
from flask import redirect
app = Flask(__name__)
@app.route('/')
def index():
# 访问/根路由, 直接跳转至百度首页
return redirect('http://www.baidu.com/')
if __name__ == '__main__':
app.run()
# 重定向至内部连接
from flask import url_for
app = Flask(__name__)
@app.route('/')
def start():
# 使用url_for跳转至内部链接, url_for()中指定某个路由的endpoint值
return redirect(url_for('idx'))
# redirect直接跳转, 内部传入指定的路由
# return redirect('/index')
@app.route('/index', endpoint='idx')
def index():
return 'index页面'
if __name__ == '__main__':
app.run(debug=True)
3. 响应json数据与元组数据
3.1 json数据响应
返回json数据需要借助flask提供的jsonify来实现
# 实例如下:
from flask import Flask
from flask import jsonify
app = Flask(__name__)
@app.route('/index', endpoint='idx')
def index():
# 字典形式数据
data = {
'name': 'jeremy',
'age': 18
}
# 返回json数据
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
3.2 元组数据响应
返回一个元组,必须是 (response, status, headers) 的形式,且至少包含2个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。
# 示例如下:
from flask import Flask
from flask import jsonify
app = Flask(__name__)
@app.route('/index', endpoint='idx')
def index():
# return ('要返回的字符串', 6969是状态码, {'author': 'jeremy'}字典是设置在响应头中的键值对信息)
return ('要返回的字符串', 6969, {'author': 'jeremy'})
if __name__ == '__main__':
app.run(debug=True)
4. make_response()自定义响应
flask可以返回make_response自定义的响应, make_response()内部需要传递返回的字符串, 其创建的对象还有headers属性用于设置响应头, status属性用于设置状态码
# 示例如下:
from flask import Flask
from flask import make_response
app = Flask(__name__)
@app.route('/index', endpoint='idx')
def index():
# 响应字符串
resp = make_response('自定义的响应字符串')
# 响应头键值对
resp.headers['author'] = 'jeremy'
# 状态码与状态码提示信息
resp.status = '6969 post'
# 注意: 响应头键值对与状态码提示信息均为英文, 否则抛异常
return resp
if __name__ == '__main__':
app.run(debug=True)