APIFlask初体验

团队需要一个封装接口的工具平台,作为数据团队,Python的普及率比较高,于是就选择了 Python 的 Flask 框架,于是就发现了百度搜索第一条的 APIFlask 这个高级框架。

核心特性
  • 更多方便的装饰器,比如 @app.input()、@app.output()、@app.get()、@app.post() 等等
  • 自动反序列化和验证请求数据,当请求数据不符合模式类要求时,会自动生成包含错误详细信息的错误响应(基于 Webargs)
  • 自动格式化和序列化响应数据,在定义好响应模式后,你可以直接在视图函数返回一个模型类对象,或是返回字典(基于 Marshmallow)
  • 自动生成 OpenAPI Specification 文件,你可以把这个文件导入到 API 调试工具或是用来生成客户端代码(基于 APISpec)
  • 自动生成交互式 API 文档,并自动为蓝本和视图设置对应的标签分类(基于 Swagger UI and Redoc)
  • 自动为 HTTP 错误生成 JSON 格式的错误响应
搭建开发环境
  1. 创建新的Docker容器,并安装依赖
$ docker exec -it -u root da4aafc14644 /bin/bash
$ apt-get update
$ apt-get install python3     # 3.7.3
$ apt-get install python3-pip
$ pip3 install flask      # 2.1.2
$ pip3 install apiflask   # 1.0.0
$ pip3 install flask_sqlalchemy  # 2.5.1
$ pip3 install pymysql    # 1.0.2
    1. Docker 内安装SSH,用于远程调试
$ apt-get install openssh-server
$ apt-get install vim
$ vim /etc/ssh/sshd_config
```增加三行
PubkeyAuthentication yes #启用公钥私钥配对认证方式 
PermitRootLogin yes #允许root用户使用ssh登录 
PasswordAuthentication yes
```
$ /etc/init.d/ssh restart
$ sudo passwd root # root 密码设置为 root
$ ssh localhost # 验证
$ docker commit da4aafc14644 data_microservices # 保存镜像
$ docker stop da4aafc14644 # 关闭容器
$ docker run -d -p 8822:22 -p 5001:5000 data_microservices # 重启镜像
$ docker exec -it -u root b33794dfee7b /bin/bash # 进入容器
$ /etc/init.d/ssh restart
$ ssh root@127.0.0.1 -p 8822 # 验证
  1. 对接VSCODE
### 本地
调出扩展面板(Ctrl+Shift+X)
安装:Remote Development 插件
打开命令面板(Ctrl+Shift+P)
输入remote-ssh,选择open Configuration file,按提示输入主机地址,用户名,密码等信息(一个设置文件中允许同时添加多个连接)。
此时,左侧出现"远程资源管理器选项卡",点连接右侧的attach remote container可连接远程主机。
登录后看起来就像是打开了一个本地项目,选择文件夹作为工作目录。
同时打开多个项目时,右键点击contrainer,选择attach in new window。
### 远程
连接远程主机中的docker,操作如下:
首先,远程主机端也需要启动docker并向外暴露端口如8822。
在左侧打开远程资源管理器,在第二个选项卡选择SSH Target。
打开命令面板(Ctrl+Shift+P),输入remote-ssh,选择open Configuration file,添加如下内容:
Host 192.168.1.201
  HostName 192.168.1.201
  Port 8822
  User root
保存后,左侧远程资源管理器内容被刷新,然后点该项右侧的Connect to Host...并按提示输入密码后,即可正常连接。
### 运行代码
写一个简单的python文件,如:
print("abcde")
然后点击左侧运行按钮,选择运行和调试,此时会提示安装Python扩展,我选择了第一个推荐"Python"。
安装后再运行,选择Python,提示设置launch.json;在左侧面板选择创建launch.json,然后选择Python,保持默认选项即可。
此时,即可通过运行按钮(播放键)直接运行程序,运行结果在下方的终端面板中显示。

  1. 特性验证-Rest/ORM/序列化
from apiflask import APIFlask, Schema
from apiflask.fields import Integer, String
from apiflask.validators import Length, OneOf
from flask_sqlalchemy import SQLAlchemy

app = APIFlask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@192.168.110.25:3306/apiflask_demo?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class PetModel(db.Model):
   id = db.Column(db.Integer, primary_key=True)
   name = db.Column(db.String(10))
   category = db.Column(db.String(10))


@app.before_first_request
def init_database():
   db.create_all()

   pets = [
       {'name': 'Kitty', 'category': 'cat'},
       {'name': 'Coco', 'category': 'dog'},
       {'name': 'Flash', 'category': 'cat'}
   ]
   for pet_data in pets:
       pet = PetModel(**pet_data)
       db.session.add(pet)
   db.session.commit()

class PetInSchema(Schema):
   name = String(required=True, validate=Length(0, 10))
   category = String(required=True, validate=OneOf(['dog', 'cat']))

class PetOutSchema(Schema):
   id = Integer()
   name = String()
   category = String()

@app.get('/')
def say_hello():
   return {'message': 'Hello!'}


@app.get('/pets/<int:pet_id>')
@app.output(PetOutSchema)
def get_pet(pet_id):
   return PetModel.query.get_or_404(pet_id)

@app.get('/pets')
@app.output(PetOutSchema(many=True))
def get_pets():
   return PetModel.query.all()

@app.post('/pets')
@app.input(PetInSchema)
@app.output(PetOutSchema, 201)
def create_pet(data):
   pet = PetModel(**data)
   db.session.add(pet)
   db.session.commit()
   return pet

@app.patch('/pets/<int:pet_id>')
@app.input(PetInSchema(partial=True))
@app.output(PetOutSchema)
def update_pet(pet_id, data):
   pet = PetModel.query.get_or_404(pet_id)
   for attr, value in data.items():
       setattr(pet, attr, value)
   db.session.commit()
   return pet

@app.delete('/pets/<int:pet_id>')
@app.output({}, 204)
def delete_pet(pet_id):
   pet = PetModel.query.get_or_404(pet_id)
   db.session.delete(pet)
   db.session.commit()
   return ''

  1. 特性验证-Swagger
http://127.0.0.1:5001/docs
  1. 特性验证-OpenAPI Specification
$ flask spec --output openapi.json
# postman 导入 openapi.json 调试接口
1. 打开postman,在workspace中点击import
2. 点击upload files—选择 openapi.json 文件
参考文档

https://apiflask.com/docs/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值