Restful
- 安装
pip install flask-restful
# exts.py
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_restful import Api
db = SQLAlchemy()
migrate = Migrate()
api = Api()
def init_exts(app):
db.init_app(app=app)
migrate.init_app(app=app, db=db)
api.init_app(app=app) # 初始化
# apis.py
from flask import jsonify
from flask_restful import Resource, fields, marshal_with, reqparse
# 类视图: CBV Class Based View
# 视图函数: FBV Function Based View
class HelloResouce(Resource):
# 如果url中定义了参数,请求方法也需要定义对应的参数
# 如果add_resource中有url没有这个参数,就需要给这个参数设置一个默认值
def get(self,msg='请求'): # get函数是Resource 类的,发送get请求会自动调用该函数
return jsonify({'msg': msg})
# restful接口默认返回的都是json数据
def post(self,msg='请求'):
return jsonify({'msg': msg})
# urls.py 路由文件
from .exts import api
from .apis import *
# 路由 第一个参数是类视图,第二个参数是路径
# # 可以在url中指定参数,就和“app.route”中定义参数一样,也需要在对应请求方法里也定义这个参数
# # add_resource定义url时,可以传入多个url,比如第二个url是没有传入参数的,这时候就需要在定义请求方法时将这个参数设置一个默认值,不然会报错
# # endpoint参数用于url_for函数反转,如果不指定endpoint参数,那么将使用视图类的名称的全小写作为endpoint
api.add_resource(HelloResouce, '/hello/','/hello/<msg>/')
# App包下的__init__.py
from flask import Flask
from .exts import init_exts
from .urls import * # 导入进来否则urls的不会执行
def create_app():
app = Flask(__name__)
# 配置数据库
db_uri = 'sqlite:///sqlite3.db' # sqlite配置
# db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 禁止对象追踪修改
# 初始化插件
init_exts(app=app)
return app
字段格式化
# apis.py
from flask import jsonify
from flask_restful import Resource, fields, marshal_with, reqparse
from .models import *
# 类视图: CBV Class Based View
# 视图函数: FBV Function Based View
class HelloResouce(Resource):
# 如果url中定义了参数,请求方法也需要定义对应的参数
# 如果add_resource中有url没有这个参数,就需要给这个参数设置一个默认值
def get(self,msg='请求'): # get函数是Resource 类的,发送get请求会自动调用该函数
return jsonify({'msg': msg})
# restful接口默认返回的都是json数据
def post(self,msg='请求'):
return jsonify({'msg': msg})
# --------------------------- 字段格式化 --------------------------- #
# Flask-RESTful
# 字段格式化:定义返回给前端的数据格式
ret_fields = {
'status': fields.Integer,
'msg': fields.String,
# 'data': fields.String,
'like': fields.String(default='ball'),
'like2': fields.String(),
'data2': fields.String(attribute='data') # 使用data的值
}
class UserResource(Resource):
@marshal_with(ret_fields)
def get(self):
return {
'status': 1,
'msg': 'ok',
'data': '千锋教育Python'
}
# --------------------------- 字段格式化 --------------------------- #
#
user_fields = {
# 'id': fields.Integer,
'name': fields.String,
'age': fields.Integer,
# 绝对路径
'url': fields.Url(endpoint='id', absolute=True)
}
ret_fields2 = {
'status': fields.Integer,
'msg': fields.String,
# user对象
'data': fields.Nested(user_fields)
}
class User2Resource(Resource):
@marshal_with(ret_fields2)
def get(self):
user = User.query.first()
return {
'status': 1,
'msg': 'ok',
'data': user
}
# --------------------------- 字段格式化 --------------------------- #
user_fields2 = {
'name': fields.String,
'age': fields.Integer,
}
ret_fields3 = {
'status': fields.Integer,
'msg': fields.String,
'data': fields.List(fields.Nested(user_fields2))
}
class User3Resource(Resource):
@marshal_with(ret_fields3)
def get(self):
users = User.query.all()
return {
'status': 1,
'msg': 'ok',
'data': users
}
# urls.py 路由文件
from .exts import api
from .apis import *
# 路由 第一个参数是类视图,第二个参数是路径
# # 可以在url中指定参数,就和“app.route”中定义参数一样,也需要在对应请求方法里也定义这个参数
# # add_resource定义url时,可以传入多个url,比如第二个url是没有传入参数的,这时候就需要在定义请求方法时将这个参数设置一个默认值,不然会报错
# # endpoint参数用于url_for函数反转,如果不指定endpoint参数,那么将使用视图类的名称的全小写作为endpoint
api.add_resource(HelloResouce, '/hello/','/hello/<msg>/')
# 第一个参数为视图类的名称,第二个参数是url字符串,并且可以有多个url,第三个参数是endpoint等关键字参数。
api.add_resource(UserResource, '/user/', endpoint='id')
api.add_resource(User2Resource, '/user2/')
api.add_resource(User3Resource, '/user3/')