Flask+SQLAlchemy+alembic+Flask-RESTful使用


前言

其實准備把這篇刪掉,先寫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

這樣就能成功將其組合到一起了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM