日韩高清亚洲日韩精品一区二区三区,成熟人妻av无码专区,国产又A又黄又潮娇喘视频,男女猛烈无遮挡免费视频在线观看

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

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

1. 前言

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

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

2. 安裝依賴(lài)

使用 Python 編寫(xiě) RESTful API 之前,我們需要先在虛擬環(huán)境內(nèi)安裝對(duì)應(yīng)的依賴(lài)

具體包含:

  • Flask– 基礎(chǔ) Web 框架

  • flask_restful– Flask 的擴(kuò)展,增加了對(duì)快速構(gòu)建 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ù)據(jù)庫(kù)的依賴(lài)
pip3 install flask_script
pip3 install flask_migrate

3. Hello World

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

from flask import Flask

app = Flask(__name__)

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

if __name__ == '__main__':
app.run

從 flask_restful 文件中導(dǎo)入 Api、Resource 兩個(gè)類(lèi),使用上面的 app 對(duì)象,構(gòu)建一個(gè) api 對(duì)象,接著準(zhǔn)備一個(gè)列表數(shù)據(jù)

from flask_restful import Api,Resource

app = Flask(__name__)

# 實(shí)例化一個(gè) Api 對(duì)象,用來(lái)創(chuàng)建、管理 RESTful Api
api = Api(app)

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

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

這里以 GET / POST 動(dòng)作為例,重寫(xiě) get、post 方法,并編寫(xiě)內(nèi)部邏輯,返回?cái)?shù)據(jù)即可

class UserView(Resource):
"""
通過(guò)繼承 Resource 來(lái)實(shí)現(xiàn)調(diào)用 GET/POST 等動(dòng)作方法
"""
def get(self):
"""
GET 請(qǐng)求
:return:
"""
return {'code': 200, 'msg': 'success', 'data': datas}

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

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

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

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

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

運(yùn)行程序后,就可以拿 Postman 或 cURL 去測(cè)試接口了

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

4. 項(xiàng)目實(shí)戰(zhàn)

在實(shí)際項(xiàng)目開(kāi)發(fā)中,數(shù)據(jù)結(jié)構(gòu)、層級(jí)關(guān)系往往要復(fù)雜很多,我們需要對(duì)項(xiàng)目進(jìn)行一次整合,按功能進(jìn)行封裝,具體步驟如下:

第 1 步,編寫(xiě)配置文件

新建一個(gè)配置文件 config.py,將數(shù)據(jù)庫(kù)( 以 Mysql 為例 )的連接信息,包含:用戶(hù)名、密碼、端口號(hào)、數(shù)據(jù)庫(kù)名、連接驅(qū)動(dòng)和 Swagger 的設(shè)置信息追加進(jìn)去

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

DIALECT = 'mysql'
DRIVER = 'pymysql'

# 連接數(shù)據(jù)的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接口"
# 地址,必須帶上端口號(hào)
SWAGGER_HOST = "localhost:5000"

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

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

# models.py
from exts import db

class Foo(db.Model):
"""
模型,將映射到數(shù)據(jù)庫(kù)表中
"""
__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 文件

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

# 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 模型必須顯式導(dǎo)入,否則沒(méi)法映射到數(shù)據(jù)庫(kù)中

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

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

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

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

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

打開(kāi) Navicat For Mysql,即可以看到剛剛映射過(guò)來(lái)的數(shù)據(jù)表及遷移表

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

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

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

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

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

# 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
}

# 裝飾器,定義返回?cái)?shù)據(jù)
@marshal_with(resource_fields)
def get(self):
"""
返回所有記錄
:return:
"""
# 查詢(xún)數(shù)據(jù)庫(kù)
foos = db.session.query(Foo).all
return foos

對(duì)于新增一個(gè)對(duì)象( POST 動(dòng)作)

# 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")
# 構(gòu)建一個(gè)模型
foo = Foo(name=name, age=age)

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

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

第 4 步,返回?cái)?shù)據(jù)統(tǒng)一化

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

# 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 實(shí)例對(duì)象,將上面定義的資源路由暴露出去

#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 步,自動(dòng)生成接口文檔

Flask 中同樣可以利用 Swagger 自動(dòng)生成接口幫助文檔

首先,從配置文件 config.py 中讀取配置,實(shí)例化 Swagger 對(duì)象

#api_app.py
from flasgger import Swagger

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

# 標(biāo)題
swagger_config['title'] = config.SWAGGER_TITLE
# 描述信息
swagger_config['description'] = config.SWAGGER_DESC
# Host
swagger_config['host'] = config.SWAGGER_HOST

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

然后,在資源路由的動(dòng)作內(nèi)新增 swagger 注釋內(nèi)容,包含:請(qǐng)求方式、參數(shù)、響應(yīng)數(shù)據(jù)、描述信息等

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

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

class FooApi(Resource):

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

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

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

最后,運(yùn)行項(xiàng)目,訪問(wèn)下面的鏈接,即可以看到定義好的 RESTful API 服務(wù)了

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

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

5. 最后

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

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

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢(xún)
分享本頁(yè)
返回頂部