前言
其實准備把這篇刪掉,先寫Flask-restful相關的,后來想想大體框架還是先寫出來,這兩天踩了很多坑,有的谷歌也沒有答案.一直摸索也總算是開始了.
正文
SQLAlchemy/alembic 的 使用方法之前寫過,詳見我的博客,今天講講如何與 flask-restful 結合一起(只是簡單的講講搭配,Flask-restful以后會詳細講述)
搭建大體框架
其實與普通的 Flask 差不多,只不過app的功能模塊中我們需要加一個 models 文件存放我們建立的 model,在按功能寫py,大致如下

編輯model
models.py
# -*- coding=utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, relationship, backref from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer, ForeignKey, DateTime # 用戶名:密碼@訪問地址:端口/數據庫?編碼方式 engine = create_engine('mysql+mysqldb://root:***@***:***/website?charsite=utf8mb4') # 創建DBSession類型 DBSession = sessionmaker(bind=engine) # 創建Base基類 Base = declarative_base() class AdminUser(Base): # 超級用戶表 __tablename__ = 'admin_user' # 表名 id = Column(Integer, primary_key=True) # 主鍵 username = Column(String(12), nullable=False, index=True, unique=True) # 用戶名,Varchar12位,不可為空,常規索引 pwd = Column(String(256), nullable=False) # 密碼,不可為空 token = Column(String(256), nullable=True) # token token_end_time = Column(DateTime, nullable=True) # token過期時間 class Vip(Base): # VIP用戶 __tablename__ = 'vip' # 表名 id = Column(Integer, primary_key=True) # id name = Column(String(12), nullable=False, index=True, unique=True) # name pwd = Column(String(25), nullable=False) # pwd money = Column(Integer, nullable=False) # 金幣 status = Column(Integer, nullable=False) # 賬號狀態(1:正常,0:封禁,2:審核) fk_vip_on_vip_lv = Column(Integer, ForeignKey('vip_lv.id'), nullable=False) # 關聯VIPLV等級(多對一) VipLv = relationship('VipLv', backref=backref('Vip', uselist=True)) class VipInfo(Base): # VIP信息 __tablename__ = 'vip_info' # 表名 id = Column(Integer, primary_key=True) # id info = Column(String(256), nullable=True) # 備注,可為空 last_time = Column(DateTime, nullable=True) # 最后登陸時間,可為空 fk_vip_info_on_vip = Column(Integer, ForeignKey('vip.id'), unique=True, index=True, nullable=False) # 關聯外鍵VIP.id(一對一) Vip = relationship('Vip', backref=backref('VipInfo', uselist=False)) # 設置關聯使VIPInfo能查詢到VIP class VipLv(Base): # VIP等級 __tablename__ = 'vip_lv' # 表名 id = Column(Integer, primary_key=True) # id lv = Column(Integer, nullable=False) # 等級 name = Column(String(25), nullable=False) # 等級名稱 info = Column(String(256), nullable=False) # 等級說明 month_money = Column(Integer, nullable=True) # 月費 year_money = Column(Integer, nullable=True) # 年費 class VipOrder(Base): # VIP訂單 __tablename__ = 'vip_order' # 表名 id = Column(Integer, primary_key=True) # id found_time = Column(DateTime, nullable=False) # 訂單創建時間 check_status = Column(Integer, nullable=False) # 訂單確認狀態,1成功/0失敗/2待確認/3已過期 err_info = Column(String(256), nullable=True) # 訂單錯誤原因(訂單錯誤時填寫) success_time = Column(DateTime, nullable=True) # 訂單確認時間 fk_vip_order_on_vip_lv = Column(Integer, ForeignKey('vip_lv.id'), nullable=False) # 關聯外鍵VIP等級(多對一) VipLv = relationship('VipLv', backref=backref('VipLv', uselist=True)) money = Column(Integer, nullable=False) # 訂單金額 go_time = Column(DateTime, nullable=False) # 開始時間 on_time = Column(DateTime, nullable=False) # 結束時間 # if __name__ == '__main__': # Base.metadata.create_all(engine)
初始化Flask-restful/藍圖
我們在 website下的 __init__中初始化 restful
# -*- coding=utf-8 -*- from flask import Blueprint from flask_restful import Api from .VIP import Vip, Token website_1_0 = Blueprint('website_1_0', __name__, url_prefix='/api/v1.0') # 生成藍圖,名稱為website_1_0,設置藍圖下的統一前綴為/api/v1.0 api = Api(website_1_0) # 初始化api # 下方是添加路由控制 # api.add_resource(引入view的視圖類, 匹配url) api.add_resource(Vip, '/website/vip/<int:vip_id>') # 獲取VIP常用信息(匹配url帶有int數字的傳給Vip視圖,url的參數命名為vip_id)
導入注冊藍圖/restful
在app下的__init__.py中
# -*- coding=utf-8 -*- from flask import Flask from datetime import timedelta from flask_restful import Api # from flask_wtf.csrf import CsrfProtect from flask_cors import * # 導入模塊 import datetime def create_app(): app = Flask(__name__) CORS(app, supports_credentials=True) # 設置跨域 # CsrfProtect(app) # from .website import website # app.register_blueprint(website) # from .website.views import VIP # VIP.init_app(app) from .website import api api.init_app(app) # restful需要initaoo from .website import website_1_0 app.register_blueprint(website_1_0) # 結合藍圖使用 return app
寫Vip相關的視圖類
vip.py
# -*- coding=utf-8 -*- from flask_restful import reqparse, abort, Api, Resource, request # from . import website from flask import render_template, Flask, \ request, redirect, url_for from app.website.models import DBSession, Vip, VipInfo, AdminUser, VipLv, VipOrder from ..tools import info_tool class Vip(Resource): # VIP信息(單) def get(self, vip_id): # 獲取vip基本信息 from app.website.models import DBSession, Vip session = DBSession() obj = session.query(Vip).filter(Vip.id==vip_id).first() inf = info_tool.oneobj_to_safe(obj) # info_tool是我自己寫的序列化 return inf
這樣就能成功將其組合到一起了
