Swagger和Python配合使用

1. 說明

?先來看一個應(yīng)用場景:
?我寫了一段功能性的程序(可能是Java的,也可能是Python的),供他人調(diào)用(調(diào)我程序可能是其它編程語言,或者直接運行,如果調(diào)用者對我使用的工具不熟悉,直接調(diào)用可能很麻煩),這個程序需要傳入多個參數(shù),需要結(jié)構(gòu)化的輸出,我以什么方式提供給比較好呢?
?我們可能會選擇BS的結(jié)構(gòu),建立一個Web-Server,然后把功能性的程序放在Web-Server上并向外暴露接口,其它程序用Http協(xié)議調(diào)用該接口,以POST或GET的方式轉(zhuǎn)入?yún)?shù),然后得到返回結(jié)果。
?于是我們就需要定義一些交互協(xié)議,寫接口描述文檔,在調(diào)用出錯時,聯(lián)調(diào)是哪一端的問題,總之,溝通成本很高。
?Swagger可以很好地解這一問題,一方面,它能按規(guī)范自動生成接口文檔(以網(wǎng)頁形式提供),這樣編寫API和編寫文檔同時完成,幾乎不用考慮文本和代碼版本不同步的問題;另一方面,它能提供測試界面,我們只需要在網(wǎng)頁上填寫相應(yīng)的參數(shù),點擊調(diào)用(網(wǎng)頁由swagger生成),就可以輕松調(diào)用接口,使得服務(wù)端的開發(fā)者,不使用客戶端,就可以完整地調(diào)試代碼。

2. Python & Flask & Swagger實現(xiàn)

(1) 工具介紹

i. Python
?在這里選擇介紹Python+Swagger,因為Python真的非常簡單,不需要關(guān)心太多的代碼,庫,復(fù)雜的環(huán)境,只要關(guān)注流程本身即可。
另外,我這里的開發(fā)環(huán)境是python 2.7。

ii. Flask
?Flask是Python的Web框架,Python的Web框架還有Django,Tornado,Bottle等等,F(xiàn)lask功能雖然不及Django和Tornado強大,但它是個輕量級的工具,三方開源組件也比較豐富。

iii. Swagger
?支持Python+Flask的Swagger庫不少,有flask-swag,flask-swagger,flasgger,本例中選用的是flasgger,它的軟件包中包括了Swagger-UI,除了安裝工具包,幾乎不需要配置其它環(huán)境。

iv. Nodejs與npm
?Nodejs是服務(wù)器后端的JavaScript的工具。
?Npm是一個JavaScript的包管理程序,它就像python中的pip,用于下載和管理三方工具。
?Swagger主要是用javascript實現(xiàn)的,因此依賴node工具集。

(2) 安裝Node工具集

?雖然node能用apt-get方式安裝,但最好下載使用最新版本的node,版本太舊可能遇到各種問題。
?我下載的是http://nodejs.cn/download/ 中64位的linux版本,這里面也包括NPM工具,不用另外安裝。解壓之后,將其中的bin, lib等目錄復(fù)制到/usr/local/的對應(yīng)目錄下即可使用。

(3) 安裝Python的三方工具包

$ sudo pip install flask
$ sudo pip install flasgger

(4) 編寫test.py程序

#coding:utf8

import sys
import random
reload(sys)
sys.setdefaultencoding('utf8')
from flask import Flask,Blueprint,render_template,request,redirect,jsonify
from flasgger import Swagger,swag_from

app = Flask(__name__)
Swagger(app)

@app.route('/api/<string:language>/', methods=['GET'])
def index(language):
    """
    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"]

    """

    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.run(debug=True)

(5) 運行test.py程序

$ python test.py

?此時,用瀏覽器訪問:http://localhost:5000/apidocs/,就可以看到Swagger界面了,程序中雙引號內(nèi)是一個非常簡單的接口描述,我們可以把它寫程序中,或者用@swag_from('index.yml')的方式,將描述文件yml引入程序。
在該界面上點“try it out”,按鈕就可以在網(wǎng)頁上測試該接口。

3. 其它工具和方法

?在網(wǎng)上看到一般安裝swagger方法,是從git下載swagger-edit,swagger-ui:

$ git clone https://github.com/swagger-api/swagger-editor
$ git clone https://github.com/swagger-api/swagger-ui

?然后用工具h(yuǎn)ttp-server通過調(diào)用其目錄中的index.html提供Web界面,其中的接口在yml文件中定義,yml接口一般是在編寫API時程序時,通過引入swagger相關(guān)庫,按照規(guī)則,自動生成的,手動編寫yml文件的比較少。步驟也相對比較復(fù)雜。

4. 參考

(1) Flasgger使用心得

https://changsiyuan.github.io/2017/05/20/2017-5-20-flasgger/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,836評論 6 427
  • Python資源大全中文版,包括:Web框架、網(wǎng)絡(luò)爬蟲、模板引擎、數(shù)據(jù)庫、數(shù)據(jù)可視化、圖片處理等,由伯樂在線持續(xù)更...
    dxl1236閱讀 4,835評論 2 33
  • Python 資源大全中文版 awesome-python[https://github.com/vinta/aw...
    萬色星辰閱讀 9,932評論 0 255
  • 工匠第一章 正文 狹長而陰冷的甬道望不到頭,甬道的兩側(cè)掛著一些淘汰下來的畫,大多是些受潮的油畫,色彩混亂扭曲。燈火...
    灰色彩鉛閱讀 375評論 0 1
  • 早上女兒不想穿襯衣,說不舒服,我說全學(xué)校的同學(xué)都能穿,為啥你不能穿。女兒很堅決就是不想穿,在爸爸勸說下,穿...
    ee978d8b1e98閱讀 192評論 0 2

友情鏈接更多精彩內(nèi)容