Flask 学习笔记
1.1、介绍
Flask-Restful 是一个专门用来写 restful api 的一个插件。使用他可以快速的集成 restful api 功能。在 app 的后台以及纯 api 的后台中,这个插件可以帮助我们节省很多时间。当然,如果在普通的网站中,这个插件就显得有些鸡肋了,因为在普通的网页开发中,是需要去渲染 html
代码的,而 Flask-Restful 在每个请求中都是返回 json
格式的数据。
1.2、安装
Flask-Restful 需要在 Flask 0.8 以上的版本,在 Python2.6 或者 Python3.3 上运行。
pip install flask-restful
1.3、参数解析
Flask-Restful 插件提供了类似 WTForms 来验证提交的数据是否合法的包,叫做 reqparse
。可使用 add_argument
可以指定字段的名字、数据类型等。
default:默认值,如果这个参数没有值,那么将使用这个参数指定的值。
required:是否必须。默认为 False,如果设置为 True,那么这个参数就必须提交上来。
type:这个参数的数据类型,如果指定,那么将使用指定的数据类型来强制转换提交上来的值。
choices:选项。提交上来的值只有满足这个选项中的值才符合验证通过,否则验证不通过。
help:错误信息。如果验证失败后,将会使用这个参数指定的值作为错误信息显示。
trim:是否要去掉前后的空格。
from flask_restful import Api, Resource, reqparse, inputs
class IndexView(Resource):
def post(self):
parse = reqparse.RequestParser()
parse.add_argument('username', type=str, help='用户名验证错误', required=True, trim=True)
parse.add_argument('password', type=str, help='密码错误')
parse.add_argument('age', type=int, help='年龄错误', default=18)
parse.add_argument('gender', type=str, help='性别错误', choices=['男', '女', '保密'])
parse.add_argument('homepage', type=inputs.url, help='URL地址错误')
parse.add_argument('telphone', type=inputs.regex(r'1[3|5|8]\d{9}'), help='手机号码错误')
args = parse.parse_args()
# print(args)
# return {"info": "登录成功"}
return args
1.4、输出字段
对于一个视图函数,你可以指定好一些字段用于返回。以后可以使用 ORM 模型或者自定义的模型的时候,他会自动的获取模型中的相应的字段,生成 json
数据,然后再返回给客户端。这其中需要导入 flask_restful.marshal_with
装饰器。并且需要写一个字典,来指示需要返回的字段,以及该字段的数据类型。
from flask_restful import Api, Resource, reqparse, inputs, fields, marshal_with
class ArticleView(Resource):
resource_fields = {
'username': fields.String,
'password': fields.String
}
@marshal_with(resource_fields)
def get(self):
return {'username': 'li666'}
在 get 方法中,为 username
并返回的时候,flask_restful
会自动的读取指定的字段(其值为 null )与其组成一个 json
格式的字符串返回给客户端。
1.5、字段重命名
很多时候你面向公众的字段名称是不同于内部的属性名。使用 attribute
可以配置这种映射。比如上面的例子想要返回 username
中的值,但是在返回给客户端的时候,想以 user
显示,那么可以这样写:
resource_fields = {
# 原字段名为 username , 重命名为 user
'user': fields.String(attribute='username')
}
1.6、字段默认值
在返回一些字段的时候,有时候可能没有值,那么这时候可以在指定 fields
的时候,使用 default
给定一个默认值:
resource_fields = {
'password': fields.String(default='admin')
}
1.7、输出复杂结构数据
有时候想要在返回的数据格式中,形成比较复杂的结构。那么可以使用一些特殊的字段来实现。比如要在一个字段中放置一个列表,那么可以使用 fields.List
,比如在一个字段下面又是一个字典,那么可以使用 fields.Nested
。
from flask import Flask
from flask_restful import Api, Resource, reqparse, inputs, fields, marshal_with
app = Flask(__name__)
# 用 Api 来绑定 app
api = Api(app)
class ProfileView(Resource):
resource_fields = {
'username': fields.String,
'age': fields.Integer,
'school': fields.String,
'tags': fields.List(fields.String),
'more': fields.Nested({
'signature': fields.String,
'email': fields.String
}),
'class': fields.List(
fields.Nested({
'teacher': fields.String,
'student': fields.String
})
),
}
@marshal_with(resource_fields)
def get(self):
return {
'username': 'laohuang',
'tags': [1, 2, 3],
'class': {'username': 'laohuang', 'tags': [1, 2, 3]}
}
api.add_resource(ProfileView, '/profile/', endpoint='profile')
if __name__ == '__main__':
app.run(debug=True)