Flask項目的拆分

Flask介紹:

  • Flask是一種使用Python編寫的輕量級的Web框架, WSGI工具採用Werkzeug,模板引擎使用Jinja2, Flask使用的是BSD受權
  • Flask核心簡單, 能夠自定義擴展, 沒有固定的數據庫和模板等設置, 簡單輕便
  • Flask也有web開發'微'框架之稱

開始項目

  下面是官網中的一個Flask項目, 只須要簡單的7行代碼, 咱們就是能夠讓一個Flask項目運行起來。css

from flask import Flask

app = Flask(__name__)


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


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

項目拆分

  Flask因爲框架體量小, 全部的拓展包都須要咱們本身去安裝, 因此一個Flask項目會安裝不少的拓展包是很常見的。基於項目的可拓展性和代碼的可閱讀性, 當代碼量較大時, 將全部的代碼寫在一個文件中是一件很可怕的事, 因此咱們就要對其進行拆分, 主要仍是參考 MVC模式進行, 將不一樣的功能放在其對應的模塊中, 方便咱們進行閱讀。html

  • 建立app的文件目錄, 將views 和 models 寫入其中進行管理mysql

  • 在app目錄下建立 static 目錄,存放靜態文件web

  • 在app目錄下建立 templates 目錄, 存放網頁模板redis

  • 在app目錄下建立settings.py文件,存放全部的配置文件sql

  • 建立ext.py文件,用來管理擴展的工具函數
  • 在app下的__init__.py文件中,建立一個函數用來建立app並整合全部的配置信息。
  • 將主要的執行內容寫在執行文件manage.py中,manage.py和建立的app目錄爲同一級, 在這裏面調用app下__init__.py中建立的函數來建立app,而且引入 Manage 進行管理app。

總體結構:

 

from flask_script import Manager
from myapp import create_app

app = create_app('debug')
manage = Manager(app = app)

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

static目錄用來存放靜態文件目錄。如css,js,img等。templates目錄用來存放html模板文件。數據庫

from flask import Flask   
from myapp.ext import init_ext   #導入擴展庫中的函數
from myapp.settings import conf    #從settings中導入配置文件
from myapp.views import init_blue   #從views中導入註冊藍圖的函數
from myapp.models import db    #從models中導入實例化SQLAlchemy的對象


def create_app(env_name):     #建立一個建立app的函數,並傳入要配置的環境
    if not env_name in conf.keys():
        raise Exception('環境名稱有問題')
    app = Flask(__name__)  

    app.config.from_object(conf.get(env_name))    #根據傳入的環境導入settings配置

    init_ext(app)   #實例化第三方插件

    init_blue(app)   #實例化藍圖

    return app
__init__.py
from flask_session import  Session
from flask_sqlalchemy import SQLAlchemy


def init_ext(app):   #實例化第三方插件並綁定app
    se = Session()
    se.init_app(app)

    db = SQLAlchemy()
    db.init_app(app)
ext.py
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  #實例化SQLAlchemy對象

class Student(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(30),nullable=True,unique=True)
models.py
import os
from redis import StrictRedis

# 數據庫的鏈接拼寫規則
def get_db_uri(conf):
    uri = '{backend}+{engine}://{user}:{pwd}@{host}:{port}/{name}'.format(
        backend=conf.get('backend'),
        engine=conf.get('engine'),
        user=conf.get('user'),
        pwd=conf.get('pwd'),
        host=conf.get('host'),
        port=conf.get('port'),
        name=conf.get('name'),
    )
    return uri

class Config:
    Debug = False
    Test = False
    Online = False
    SECRET_KEY = 'aisofhas'
    #作session持久化的配置
    SESSION_TYPE = 'redis'     # 指定session存儲方案
    SESSION_KEY_PREFIX = 'myapp:'     # 設置緩存的開頭

    SQLALCHEMY_TRACK_MODIFICATIONS = False


class DebugConfig(Config):
    Debug = True
    SESSION_REDIS = StrictRedis('127.0.0.1',db=1)
    DATABASE = {
        'backend':'mysql',
        'engine':'pymysql',
        'user':os.environ.get('DB_USER'),
        'pwd':os.environ.get('DB_PASSWD'),
        'host':'127.0.0.1',
        'port':3306,
        'name':'hzflask'
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)

class TestConfig(Config):
    Test = True
    SESSION_REDIS = StrictRedis('127.0.0.1', db=2)
    DATABASE = {
        'backend': 'mysql',
        'engine': 'pymysql',
        'user': os.environ.get('DB_USER'),
        'pwd': os.environ.get('DB_PASSWD'),
        'host': '127.0.0.1',
        'port': 3306,
        'name': 'hzflask2'
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)

class OnlineConfig(Config):
    Online = True
    SESSION_REDIS = StrictRedis('127.0.0.1', db=3)
    DATABASE = {
        'backend': 'mysql',
        'engine': 'pymysql',
        'user': os.environ.get('DB_USER'),
        'pwd': os.environ.get('DB_PASSWD'),
        'host': '127.0.0.1',
        'port': 3306,
        'name': 'hzflask3'
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)

conf = {
    'debug':DebugConfig,
    'test':TestConfig,
    'online':OnlineConfig,
}
settings.py
from flask import Blueprint, session, render_template
from myapp.models import db, Student

blue = Blueprint('wusir',__name__)

def init_blue(app):
    app.register_blueprint(blue)

@blue.route('/')
def index():
    return 'index'
views.py
相關文章
相關標籤/搜索