文章目录
- 1、创建扩展/组件对象
- 2、创建视图,定义接口
- 2.1、定义接口输出内容
- 2.2、定义接口传入字段
- 2.3、创建视图类
- 3、添加类视图(add_resource)
- 4、完整代码示例:
- 5、我们使用postman访问
- 5.1、查看用户信息(未登录状态)
- 5.2、用户进行登录:(不输入用户名)
- 5.3、用户进行登录:(不输入密码)
- 5.4、用户进行登录:(登录成功)
- 5.5、再次查看用户信息(已登录状态)
- 5.6、用户登录失败(账号或密码错误)
Flask-RESTful
是一个 Flask
扩展,它添加了快速构建 REST API 的支持。
pip 安装
pip install flask-restful
中文文档:http://www.pythondoc.com/Flask-RESTful/index.html
1、创建扩展/组件对象
from flask_restful import Api, Resource, fields, marshal_with, reqparse, marshal
app = Flask(__name__)
api = Api(app)
2、创建视图,定义接口
2.1、定义接口输出内容
定义输出就是想让用户看到哪些信息,哪些需要隐藏前提:数据库必须已经有了这些表和数据
user_fields = {
'id': fields.Integer,
# id是数据库字段,如果不是使用attribute属性
'name': fields.String(attribute='username'),
'phone': fields.String
}
# 输出用户表中的:id、姓名(username输出时字段变为了name)、手机号
2.2、定义接口传入字段
- 设置用户登录接口中前端必须要传入的字段 username,password
login_parser= reqparse.RequestParser()
login_parser.add_argument('username', type=str, help='必须输入用户名', required=True)
login_parser.add_argument('password', type=str, help='必须输入密码', required=True)
2.3、创建视图类
class LoginApi(Resource):
def __init__(self): pass
def get(self):
# 只有登录之后才会有uid
user = User.query.filter(User.phone == session.get('uid', None).first()
if user:
return {'status': 200, 'msg': '登录成功', 'info': marshal(user, user_fields)}
# 输出返回必须是json形式
else:
return {'status': 400, 'msg': '请登录后查看信息'}
def post(self):
args = login_parser.parse_args()
username = args.get('username')
password = args.get('password')
user = User.query.filter(User.username== username).first()
if user and password == 'admin':
session['uid'] = user.phone
return {'status': 200, 'msg': '登录成功'}
else:
return {'status': 400, 'msg': '登录失败'}
def put(self):
pass
def delete(self):
pass
代码解释:
- 1、创建视图类时,必须继承Resource
- 2、上面登录成功后,返回结果
get
方法用到了marshal函数
marshal(参数1, 参数2)
1、参数1为数据,参数2为定义的输出格式
2、也就是将参数1的数据按照参数2的格式进行输出
- 3、接口返回需要位json格式
3、添加类视图(add_resource)
api.add_resource(LoginApi, '/login', endpoint='login1')
# 函数标记默认为类名小写,即访问的url
# 访问地址: http://127.0.0.1:5000/login
总结:
前提:引用Api(from flask_restful import Api)
Api绑定Flask对app
api = Api(app)
1.定义传入的参数,
sms = reqparse.RequestParser()
sms.add_argument('请求字段名', type=int/str, help='xx', required=True) required是否必填
2.定义输出的格式
news_detail_fields = {
'id': fields.Integer,
# id是数据库字段,如果不是使用attribute属性
'name': fields.String
}
3.类中编写查询逻辑并返回(类要继承Resource),使用marshal_with或marshal函数,按照自定义内容输出
4.使用api.add_resource(类名, '访问url'), 制定接口请求的url
4、完整代码示例:
app.py
from flask_restful import Api, Resource, fields, marshal_with, reqparse, marshal
from flask import Flask, session
from models.user_model import User # 导入用户表
from flask_sqlalchemy import SQLAlchemy
import setting
db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(setting.DevelopmentConfig) # 导入配置,主要为数据库连接信息
api = Api(app)
db.init_app(app=app) # 数据库初始化并绑定app对象
# 定义输出
user_fields = {
'id': fields.Integer,
# id是数据库字段,如果不是使用attribute属性
'name': fields.String(attribute='username'),
'phone': fields.String
}
# 定义传入
login_parser= reqparse.RequestParser()
login_parser.add_argument('username', type=str, help='必须输入用户名', required=True)
login_parser.add_argument('password', type=str, help='必须输入密码', required=True)
# 定义视图类
class LoginApi(Resource):
def __init__(self): pass
def get(self):
# 只有登录之后才会有uid
user = User.query.filter(User.phone == session.get('uid', None)).first()
if user:
return {'status': 200, 'msg': '登录成功', 'info': marshal(user, user_fields)}
# 输出返回必须是json形式
else:
return {'status': 400, 'msg': '请登录后查看信息'}
def post(self):
args = login_parser.parse_args()
username = args.get('username')
password = args.get('password')
user = User.query.filter(User.username== username).first()
if user and password == 'admin':
session['uid'] = user.phone
return {'status': 200, 'msg': '登录成功'}
else:
return {'status': 400, 'msg': '登录失败'}
def put(self):
pass
def delete(self):
pass
api.add_resource(LoginApi, '/login', endpoint='login1')
if __name__ == '__main__':
app.run()
5、我们使用postman访问
5.1、查看用户信息(未登录状态)
get请求
5.2、用户进行登录:(不输入用户名)
post请求
5.3、用户进行登录:(不输入密码)
5.4、用户进行登录:(登录成功)
5.5、再次查看用户信息(已登录状态)
5.6、用户登录失败(账号或密码错误)