文章目录

  • 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请求

flask接口开发 python flask api接口开发_flask

5.2、用户进行登录:(不输入用户名)

post请求

flask接口开发 python flask api接口开发_restful_02

5.3、用户进行登录:(不输入密码)

flask接口开发 python flask api接口开发_python_03

5.4、用户进行登录:(登录成功)

flask接口开发 python flask api接口开发_python_04

5.5、再次查看用户信息(已登录状态)

flask接口开发 python flask api接口开发_flask接口开发 python_05

5.6、用户登录失败(账号或密码错误)

flask接口开发 python flask api接口开发_User_06