
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 并沒有接收到,所有傳回如下字元串
傳遞參數 name,然後判斷了 password,并且查詢到了 password 并沒有接收到,所有傳回如下字元串
傳遞參數 name,password,并且查詢到都接收到了,所有傳回如下字元串
post 方法(postman 示範)
傳遞了所有參數
傳遞第一個參數 username
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)
資料庫補充幾行資料,如下
如當 url 為 /article/1 時,查詢的是第一行資料
如當 url 為 /article/2 時,查詢的是第二行資料
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')