RM新时代官方网站

10分鐘,帶你用Python構建RESTful API 服務(python restful api接口規(guī)范)

0分鐘,帶你用Python構建RESTful

1. 前言

上一篇文章,介紹了使用 Java Spring Boot MyBatis 構建 RESTful api 的詳細步驟;很多小伙伴表示,更愿意用 Python 編寫 RESTful API 服務,希望我能寫一下

本篇將以 Python 開始介紹搭建 RESTful API 的流程 ,使用的技術棧是:Flask flask-restful flasgger

2. 安裝依賴

使用 Python 編寫 RESTful API 之前,我們需要先在虛擬環(huán)境內安裝對應的依賴

具體包含:

  • Flask– 基礎 Web 框架

  • flask_restful– Flask 的擴展,增加了對快速構建 REST API 的支持

  • flasgger– flask 支持的 Swagger UI,可以生成 API 接口文檔

# 安裝flask
pip3 install flask

# 安裝flask-restful
pip3 install flask-restful

# 安裝flasgger
# 注意:需要更新setuptools
pip3 install -U setuptools
pip3 install flasgger

# 管理數(shù)據庫的依賴
pip3 install flask_script
pip3 install flask_migrate

3. Hello World

首先,我們使用 Pycharm 創(chuàng)建一個 Flask Web 項目,初始化代碼如下:

from flask import Flask

app = Flask(__name__)

@app.route(\'/\')
def hello_world:
return \'Hello World!\'

if __name__ == \'__main__\':
app.run

從 flask_restful 文件中導入 Api、Resource 兩個類,使用上面的 app 對象,構建一個 api 對象,接著準備一個列表數(shù)據

from flask_restful import Api,Resource

app = Flask(__name__)

# 實例化一個 Api 對象,用來創(chuàng)建、管理 RESTful Api
api = Api(app)

# 準備一個列表數(shù)據
datas = [{\'id\': 1, \'name\': \'xag\', \'age\': 18}, {\'id\': 2, \'name\': \'xingag\', \'age\': 19}]

然后,利用 Flask 中的 CBV 模式,創(chuàng)建一個 Resource 類的子類,用于定義資源路由

這里以 GET / POST 動作為例,重寫 get、post 方法,并編寫內部邏輯,返回數(shù)據即可

class UserView(Resource):
\"\"\"
通過繼承 Resource 來實現(xiàn)調用 GET/POST 等動作方法
\"\"\"
def get(self):
\"\"\"
GET 請求
:return:
\"\"\"
return {\'code\': 200, \'msg\': \'success\', \'data\': datas}

def post(self):
# 參數(shù)數(shù)據
json_data = request.get_json

# 追加數(shù)據到列表中
new_id = len(datas) 1
datas.append({\'id\':new_id,**json_data})

# 返回新增的最后一條數(shù)據
return {\'code\': 200, \'msg\': \'ok\', \'success\': datas[new_id - 1]}

最后,使用 Api 的實例對象,將上面定義的資源,利用路徑,完全暴露出去

# 暴露接口出去
# 資源路由:UserView
# 路徑:/user
api.add_resource(UserView,\'/user\')

運行程序后,就可以拿 Postman 或 cURL 去測試接口了

0分鐘,帶你用Python構建RESTful

4. 項目實戰(zhàn)

在實際項目開發(fā)中,數(shù)據結構、層級關系往往要復雜很多,我們需要對項目進行一次整合,按功能進行封裝,具體步驟如下:

第 1 步,編寫配置文件

新建一個配置文件 config.py,將數(shù)據庫( 以 Mysql 為例 )的連接信息,包含:用戶名、密碼、端口號、數(shù)據庫名、連接驅動和 Swagger 的設置信息追加進去

# config.py
USERNAME = \'root\'
PASSWORD = \'root\'
HOSTNAME = \"127.0.0.1\"
PORT = \'3306\'
DATABASE = \'xag\'

DIALECT = \'mysql\'
DRIVER = \'pymysql\'

# 連接數(shù)據的URI
DB_URI = \"{} {}://{}:{}@{}:{}/{}?charset=utf8\".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

SQLALCHEMY_DATABASE_URI = DB_URI

SQLALCHEMY_TRACK_MODIFICATIONS = True

SWAGGER_TITLE = \"API\"
SWAGGER_DESC = \"API接口\"
# 地址,必須帶上端口號
SWAGGER_HOST = \"localhost:5000\"

第 2 步,模型映射數(shù)據庫

創(chuàng)建一個模型類 Foo 繼承 SQLAlchemy 對象,使用 __tablename__ 指定生成數(shù)據表的名稱、然后新增幾個常用字段

# models.py
from exts import db

class Foo(db.Model):
\"\"\"
模型,將映射到數(shù)據庫表中
\"\"\"
__tablename__ = \'foo\'

# 主鍵ID
id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
# 名字
name = db.Column(db.String(100), able=False)
# 年齡
age = db.Column(db.INTEGER)

接著,創(chuàng)建 manage.py 文件

顯式導入上面創(chuàng)建的 Foo 類,使用 flask_migrate 中的 Migrate 綁定 App 和數(shù)據庫,利用 flask_script 中的 Manager 實例去添加一個腳本命令

# manager.py
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

from exts import db
from api_app import app
from models import Foo

manager = Manager(app)
migrate=Migrate(app, db)
manager.add_command(\'db\', MigrateCommand)

if __name__ == \'__main__\':
manager.run

需要注意的是,F(xiàn)oo 模型必須顯式導入,否則沒法映射到數(shù)據庫中

最后,通過下面 3 個腳本命令,將模型映射到數(shù)據庫中

除了第一次需要生成遷移腳本外,后面映射數(shù)據庫,只需要執(zhí)行后面兩個命令即可

# 初始化遷移文件
python3 manager.py db init

# 映射到文件
python3 manager.py db migrate

# 映射到數(shù)據庫
python3 manager.py db upgrade

打開 Navicat For Mysql,即可以看到剛剛映射過來的數(shù)據表及遷移表

0分鐘,帶你用Python構建RESTful

第 3 步,創(chuàng)建資源路由

下面以創(chuàng)建列表查詢( GET )、單條記錄的查詢( GET )、更新( PUT )、新增( POST )、刪除( DELETE )為例

flask_restful 中的 marshal_with 類可以作為裝飾器,定義到動作函數(shù)上,指定要返回的字段;然后使用 SQLAlchemy ORM 操作數(shù)據庫,將數(shù)據直接進行返回

比如:返回獲取數(shù)據列表

# api_foo.py
from flask_restful import Resource, fields, marshal_with, request

class FooListApi(Resource):
# 定義要返回的字段
resource_fields = {
\'id\': fields.Integer,
\'name\': fields.String,
\'age\': fields.String
}

# 裝飾器,定義返回數(shù)據
@marshal_with(resource_fields)
def get(self):
\"\"\"
返回所有記錄
:return:
\"\"\"
# 查詢數(shù)據庫
foos = db.session.query(Foo).all
return foos

對于新增一個對象( POST 動作)

# api_foo.py
class FooApi(Resource):
def post(self):
\"\"\"
創(chuàng)建一條記錄
:return:
\"\"\"
# 參數(shù)
params = request.get_json
name = params.get(\"name\")
age = params.get(\"age\")
# 構建一個模型
foo = Foo(name=name, age=age)

# 加入到數(shù)據庫
db.session.add(foo)
db.session.commit

return success(\"新增一條記錄成功!\")

第 4 步,返回數(shù)據統(tǒng)一化

為了保證返回的數(shù)據結構一致,可以將返回碼、返回信息及數(shù)據進行一次封裝,通過jsonify進行格式化返回

# restful_utils.py
from flask import jsonify

class HttpCode(object):
ok = 200
un_auth_error = 401
params_error = 400
server_error = 500

def restful_result(code, message, data):
return jsonify({\"code\": code, \"message\": message, \"data\": data or {}})

def success(message=\"\", data=None):
\"\"\"
正確返回
:return:
\"\"\"
return restful_result(code=HttpCode.ok, message=message, data=data)

第 5 步,暴露接口

使用 flask_restful 中的 Api 實例對象,將上面定義的資源路由暴露出去

#api_app.py
from flask_restful import Api

api = Api(app)

# 某一條記錄
api.add_resource(FooApi, \'/api/v1/foo\',\'/api/v1/foo/<int:id>\')

# 所有記錄
api.add_resource(FooListApi, \'/api/v1/foos\')

第 6 步,自動生成接口文檔

Flask 中同樣可以利用 Swagger 自動生成接口幫助文檔

首先,從配置文件 config.py 中讀取配置,實例化 Swagger 對象

#api_app.py
from flasgger import Swagger

# API可視化管理
swagger_config = Swagger.DEFAULT_CONFIG

# 標題
swagger_config[\'title\'] = config.SWAGGER_TITLE
# 描述信息
swagger_config[\'description\'] = config.SWAGGER_DESC
# Host
swagger_config[\'host\'] = config.SWAGGER_HOST

# 實例化
swagger = Swagger(app,config=swagger_config)

然后,在資源路由的動作內新增 swagger 注釋內容,包含:請求方式、參數(shù)、響應數(shù)據、描述信息等

具體可以參考:http://editor.swagger.io/#/

以獲取某一條數(shù)據為例:

class FooApi(Resource):

resource_fields = {
\'id\': fields.Integer,
\'name\': fields.String,
\'age\': fields.String
}

@marshal_with(resource_fields)
def get(self, id):
\"\"\"獲取用戶信息
---
schemes:
- http
parameters:
- name: id
in: path
type: integer
required: true
default: 1
description: 用戶id

responses:
200:
description: 返回用戶信息
examples:
{
\"id\": 1,
\"name\": \"xag\",
\"age\":\"18\"
}
\"\"\"
foo = db.session.query(Foo).get(id)
return foo

最后,運行項目,訪問下面的鏈接,即可以看到定義好的 RESTful API 服務了

http://localhost:5000/apidocs/#/

0分鐘,帶你用Python構建RESTful

5. 最后

上面就是通過 Flask flask_restful 單表實現(xiàn) RESTful API 完整的流程了,項目中涉及的多表,只需要更改數(shù)據庫的邏輯操作就可以了

0分鐘,帶你用Python構建RESTful

版權聲明:本文內容由互聯(lián)網用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至 舉報,一經查實,本站將立刻刪除。

(0)
上一篇 2024年5月13日 下午2:01
下一篇 2024年5月13日 下午2:13

相關推薦

  • 科研項目績效綜合評價

    科研項目績效綜合評價 科研項目的績效評價是項目管理中非常重要的一環(huán),它可以幫助項目管理者和研究人員更好地了解項目的進展情況,及時發(fā)現(xiàn)和解決問題,提高項目的成功率和研究成果的質量。本…

    科研百科 2025年3月16日
    6
  • 半潛船科研項目

    半潛船科研項目是一項全新的科技領域,它將人類帶入了水下世界。半潛船是一種能夠在水面下航行,并在水下進行工作的船只,它的任務是在海洋環(huán)境中執(zhí)行各種任務,如搜索和救援、勘探、科學研究和…

    科研百科 2025年3月21日
    4
  • 項目管理軟件 本地

    項目管理軟件:本地使用和遠程協(xié)作 隨著項目的不斷擴展和復雜化,使用項目管理軟件來跟蹤和管理項目變得越來越重要。本地使用和遠程協(xié)作是當前項目管理軟件的主要使用場景。在本文中,我們將介…

    科研百科 2024年5月28日
    41
  • 列入省部級科研項目

    列入省部級科研項目 近年來,隨著科技的不斷發(fā)展,省部級科研項目的列入變得越來越容易。這些項目是由政府或私人機構資助的,旨在解決重大科學問題或推動科學技術的發(fā)展。 列入省部級科研項目…

    科研百科 2025年1月31日
    6
  • ERP軟件開發(fā)(erp軟件開發(fā)商)

    定制開發(fā)匯信息技術與管理思想于一體的ERP企業(yè)管理系統(tǒng)。包括單機版,網絡版,手機版、微信版、ipad版、小程序。ERP企業(yè)資源計劃系統(tǒng)為企業(yè)決策層及員工提供集成辦公運行手段的管理平…

    科研百科 2023年5月14日
    476
  • app項目管理流程

    App項目管理流程 App項目管理是軟件開發(fā)過程中非常重要的一個環(huán)節(jié),它涉及到從需求分析、設計、開發(fā)、測試、上線和維護等各個階段。一個好的App項目管理流程可以大大提高開發(fā)效率和質…

    科研百科 2024年9月14日
    5
  • 婦產科手術分級(婦產科手術分級目錄2023年版)

    (一) 一級手術 (I)宮頸活檢;(2)上環(huán)、取環(huán)、人流術、藥流,(3)胎頭吸引術;(4)人工剝離胎盤術;(5)臀位牽引術 ;(6)前庭腺膿腫切開引流術;(7)處女膜切開術;(8)…

    科研百科 2024年4月7日
    292
  • 上海政法學院越來越火了

    上海政法學院越來越火了 近年來,上海政法學院取得了巨大的成就,變得越來越受歡迎。這是學校在教學、科研和社會服務等方面不斷努力的結果,也是人們對法律職業(yè)和法治精神的需求不斷增加的結果…

    科研百科 2024年10月30日
    7
  • 通過CIS科研項目得大牛教授推薦信,G5帝國理工UCL等名校本科錄?。ǖ蹏砉ご髮W推薦信)

    本期CIS優(yōu)秀學員專訪的嘉賓斬獲了英國G5帝國理工學院、UCL;曼徹斯特大學、香港大學本科多所名校錄取。在申請季中,她付出了怎樣的努力,最終獲得名校青睞的呢? 學生檔案 姓名:Je…

    科研百科 2024年4月14日
    79
  • 科研項目車位如何配套

    科研項目車位如何配套 隨著城市化進程的不斷加速,科研項目的推進也變得越來越重要。然而,科研項目的推進需要相應的配套措施來支持,其中之一就是科研項目車位的配套。 科研項目車位的配套應…

    科研百科 2025年3月19日
    1
RM新时代官方网站