2022-06-Python + Restfulapi + Flasgger 实现后端微服务
前情提要
小朋友这个月一直在努力呀!不过自己的大多时间都是在学习基础学科的知识点,我这个喜新厌旧的人呀!不能一直看视频学习,总要动手实践,做些自己感兴趣的事情;
之前写过一篇关于前端的开发和发布的文章,前端既然搞了,那么后端微服务如何开发设计呢,这是一个值得考虑的问题,当然这是基于自我现有的认知做的设计,没有和别人讨论,不过技术实现大家都是相互借鉴的吗?不丢人,哈哈哈哈
选型分析
Web API 框架总有一款 API 文档与之伴随,当前最知名的莫过于支持 Open API 的 Swagger 了。
Python 的 Flask 框架支持 Swagger UI 也有几条路子
- Flasgger: 是 flask-swagger 的 fork
- flask-swagger: 许久未更新了,不用考虑
- flask-restful-swagger: 到目前也两年未更新了
- Flask-RESTPlus 的 Swagger 特性: 真需要用到 Flask-RESTPlus 就可以用它
Flasgger 引用示例: https://github.com/flasgger/flasgger/tree/master/examples
技术实现
项目地址:https://github.com/vpc123/flask-swagger.git
目录结构:
主函数入口(app.py):
作用:声明 swagger_config 全局参数配置和项目路由配置以及引用 swagger 模板进行的服务接口调用;
#! /usr/bin/python3
# -*- coding:utf-8 -*-
import random
from flask import Flask, jsonify, request
from flasgger import Swagger, swag_from
app = Flask(__name__)
swagger_config = {
"headers": [
],
"specs": [
{
"endpoint": 'apispec_2',
"route": '/apispecification.json',
"rule_filter": lambda rule: True, # all in
"model_filter": lambda tag: True, # all in
}
],
"static_url_path": "/flasgger_static",
# "static_folder": "static", # must be set by user
"swagger_ui": True,
"specs_route": "/doc/"
}
template_config = {
"info": {
"title": "Vpc123 API",
"description": "",
"version": "1.0.0"
}
}
Swagger(app, template=template_config, config=swagger_config)
@app.route('/api/<string:language>/', methods=['GET'])
@swag_from("./swag/api_get.yml")
def index(language):
language = language.lower().strip()
features = [
"awesome", "great", "dynamic",
"simple", "powerful", "amazing",
"perfect", "beauty", "lovely"
]
size = int(request.args.get('size', 1))
if language in ['php', 'vb', 'visualbasic', 'actionscript']:
return "An error occurred, invalid language for awesomeness", 500
return jsonify(
language=language,
features=random.sample(features, size)
)
@app.route('/api/name/<string:app_name>/', methods=['GET'])
@swag_from("./swag/app_name.yml")
def appName(app_name):
appName = app_name.lower().strip()
features = [
"awesome", "great", "dynamic",
"simple", "powerful", "amazing",
"perfect", "beauty", "lovely"
]
size = int(request.args.get('size', 1))
if appName in ['ab', 'bc', 'dd', 'ee']:
return "An error occurred, invalid language for awesomeness", 500
version = "v1.0.0"
return jsonify(
appName=appName,
features=random.sample(features, size),
Version=version,
)
app.run(debug=True)
Swageer 版本(main_conf.json):
作用:声明 Swageer 使用的版本信息;
{
"info": {
"title": "Sample API",
"description": "Hahaha, this is a API kingdom!",
"version": "1.0.0"
}
}
swag 目录:
作用:用于存放微服务接口的 RestfulApi 结构声明,原则上每个接口应该维护一份独立的接口说明文件;
api_get.yml 内容如下
This is the language awesomeness API
Call this api passing a language name and get back its features
---
tags:
- Awesomeness Language API
parameters:
- name: language
in: path
type: string
required: true
description: The language name
- name: size
in: query
type: integer
description: size of awesomeness
responses:
500:
description: Error The language is not awesome!
200:
description: A language with its awesomeness
schema:
id: awesome
properties:
language:
type: string
description: The language name
default: Lua
features:
type: array
description: The awesomeness list
items:
type: string
default: ["perfect", "simple", "lovely"]
app_name.yml 内容如下
This is the language awesomeness API
Call this api passing a language name and get back its features
---
tags:
- Awesomeness AppName API
parameters:
- name: app_name
in: path
type: string
required: true
description: The appName name
- name: size
in: query
type: integer
description: size of awesomeness
responses:
500:
description: Error The appName is not awesome!
200:
description: A appName with its awesomeness
schema:
id: awesome
properties:
appName:
type: string
description: The appName name
default: Lua
Version:
type: string
description: The Version name
default: 1.0.0
features:
type: array
description: The awesomeness list
items:
type: string
default: ["perfect", "simple", "lovely"]
运行调试
代码完成以后,如何查看和调试接口呢!
第一步: 代码运行,其实这一步可以在之后的部署中,通过容器化的方式完成
$python app.py
第二步:打开浏览器,查看接口
第三步:调用接口
总结
工作三年了,近期这段时间真的就是一种开窍的阶段,各种项目的源代码信手拈来,前后端架构的分离拆解也是洞若观火,所以呀,有些东西慢慢也就到来了,我不急也不慌,慢慢进步,偷偷惊艳;