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

第二步:打开浏览器,查看接口

第三步:调用接口

总结

工作三年了,近期这段时间真的就是一种开窍的阶段,各种项目的源代码信手拈来,前后端架构的分离拆解也是洞若观火,所以呀,有些东西慢慢也就到来了,我不急也不慌,慢慢进步,偷偷惊艳;

posted @ 2022-06-19 17:59  流雨声  阅读(870)  评论(0编辑  收藏  举报