天天看點

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

Flask

  • Restful API 規範
  • Flask 架構結合 Restful 大子產品

Restful API 規範

首先安裝 flask_restful 子產品,指令如下

pip install flask_restful
           

此處我們用 API 規範修飾了 Flask 對象,定義了類視圖且在類視圖裡定義了 get 和post 方法,具體文法是,

reqparse.RequestParser()

用來執行個體化傳輸對象,

對象.add_argument()

用來添加參數,并且可以指定屬性,

對象.parse_args()

用來擷取所有參數

from flask import Flask  # 用于建立 Flask 執行個體
from flask_restful import Api, Resource, reqparse, inputs
# 用于綁定 Flask 對象, 繼承父類, 執行個體化對象, 判斷 url

web = Flask(__name__)
# 使用 Api 來綁定 web
api = Api(web)


class IndexView(Resource):
    def get(self):
        p = reqparse.RequestParser()
        p.add_argument('name', type=str, help='名字錯誤', required=True)  
        # required 參數的作用是隻有修飾的變量接收到值時, 才能執行傳回語句
        p.add_argument('password', type=str, help='密碼錯誤', required=True)
        args = p.parse_args()
        print(args)
        return {'info': '登入成功'}

    def post(self):
        parse = reqparse.RequestParser()
        parse.add_argument('username', type=str, help='使用者名錯誤', required=True)
        parse.add_argument('password', type=str, help='密碼錯誤', required=True)
        parse.add_argument('age', type=int, help='年齡錯誤', required=True)
        parse.add_argument('gender', type=str, help='性别錯誤', choices=['man', 'woman'])
        parse.add_argument('url', type=inputs.url, help='url 錯誤')  # inputs.url 方法自動判斷是否為 url
        args = parse.parse_args()  # 擷取 parse 對象所有參數的鍵值
        print(args)
        return {'info': '登入成功'}


# 給視圖函數類增添 url, 和起别名
api.add_resource(IndexView, '/', endpoint='index')


if __name__ == '__main__':
    web.run(debug=True, port=2000)  # 運作 Flask 執行個體
           

get 方法

不傳遞參數,先判斷了 name,并且查詢到了 name 并沒有接收到,所有傳回如下字元串

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

傳遞參數 name,然後判斷了 password,并且查詢到了 password 并沒有接收到,所有傳回如下字元串

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

傳遞參數 name,password,并且查詢到都接收到了,所有傳回如下字元串

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

post 方法(postman 示範)

傳遞了所有參數

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

傳遞第一個參數 username

Flask 架構 API 規範 & Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

Flask 架構結合 Restful 大子產品

Python 檔案(manage.py)

控制台操作此檔案,具體操作為建立遷移倉庫

python manage.py db init

會生成一個遷移檔案夾 migrations,所有的遷移檔案存放的位置,建立遷移腳本

python manage.py db migrate

,更新資料庫

python manage.py db upgrade

(此時資料庫中生成表格)

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
# 以上為二個插件
from exts import db  # 導入 db 資料庫
from flask_restful_demo import web  # 導入 web 執行個體

import models  # 導入模型


manage = Manager(web)

Migrate(web, db)

manage.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manage.run()
           

Python 檔案(config.py)

此處為配置檔案,用于 web 對象和資料庫的關聯

HOSTNAME = '127.0.0.1'  # 位址
DATABASE = 'mysql_1'  # 資料庫
PORT = 3306  # 端口
USERNAME = 'root'  # 使用者名
PASSWORD = 'root'  # 密碼
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)  # 建立 url

SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False
           

Python 檔案(exts.py)

此處為 sqlalchemy 插件插件資料庫

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
           

Python 檔案(flask_restful_demo.py)

此檔案用浏覽器執行,從資料庫中取得資料

from flask import Flask  # 用于執行個體化 Flask 對象
from flask_restful import Api, Resource, fields, marshal_with
# 用于綁定 Flask 對象, 繼承父類, 執行個體化對象, 判斷 url

import config
from exts import db
from models import Article

web = Flask(__name__)  # 執行個體化 Flask 對象
web.config.from_object(config)  # 綁定配置檔案
db.init_app(web)  # 綁定 app
api = Api(web)  # 使用 Api 來綁定 app


class IndexView(Resource):

    resource_fields = {
        'article_title': fields.String(attribute='title'),
        'content': fields.String(attribute='content'),
        # 'author': fields.String, 通路的是另一個表格的資料, 使用方法 fields.Nested
        'author': fields.Nested({
            'username': fields.String(attribute='username'),
            'email': fields.String(attribute='email'),
        })
    }

    @marshal_with(resource_fields)  # 裝飾器裝飾屬性 resource_fields
    def get(self, article_id):
        article = Article.query.get(article_id)  # 查詢 article 表的第一行資料
        return article

    def post(self):
        return {'info': '登入成功'}


api.add_resource(IndexView, '/article/<article_id>', endpoint='article')  # 參數傳入 marshal_with 裝飾器


if __name__ == '__main__':
    web.run(debug=True, port=7500)
           

資料庫補充幾行資料,如下

Flask 架構 API 規範 &amp; Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品
Flask 架構 API 規範 &amp; Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

如當 url 為 /article/1 時,查詢的是第一行資料

Flask 架構 API 規範 &amp; Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

如當 url 為 /article/2 時,查詢的是第二行資料

Flask 架構 API 規範 &amp; Flask 項目Restful API 規範Flask 架構結合 Restful 大子產品

Python 檔案(models.py)

此處為資料庫提供表格

from exts import db
# 建立二個表格, table , article


class User(db.Model):
    __tablename__ = 'table'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(50))
    email = db.Column(db.String(50))


class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(50))
    content = db.Column(db.String(50))
    uid = db.Column(db.Integer, db.ForeignKey('table.id'))
    author = db.relationship('User', backref='articles')