flask快速搭建

工程結構如下,全局的static和template目錄: 

1、main.py,讀取設置,註冊藍圖即各個模塊,然後初始化數據庫orm,app運行 

#coding=utf-8
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker,scoped_session
from flask import Flask

from apps.home import home
from config import config


app = Flask(__name__)
app.config.from_object('settings')
app.register_blueprint(home, url_prefix='/')

if __name__ == '__main__':
    engine = create_engine(config['database']['engine_url'], **config['database']['engine_setting'])
    config['database']['engine'] = engine
    db_poll = scoped_session(sessionmaker(bind=engine))
    session = db_poll
    from apps.home.model import DbBase
    DbBase.metadata.create_all(bind=engine)
    config['database']['session'] = session

    app.run(host='0.0.0.0', port=8104)

2、settings.py

DEBUG=True
SECRET_KEY='sufeiabcd'
SESSION_COOKIE_NAME='session'
PREFERRED_URL_SCHEME='http'
JSONIFY_MIMETYPE='application/json'
TEMPLATES_AUTO_RELOAD=True

3、數據庫配置

# coding=utf-8
import os
from sqlalchemy.pool import StaticPool
import logging
import json

# 數據庫配置
database_config = dict(
    engine=None,
    # engine_url='postgresql+psycopg2://mhq:1qaz2wsx@localhost:5432/blog',
    # 如果是使用mysql+mysqldb,在確認所有的庫表列都是uft8編碼後,依然有字符編碼報錯,
    # 可以嘗試在該url末尾加上queryString charset=utf8
    engine_url='sqlite:////opt/wizard/e3cwizard.db',
    engine_setting=dict(
        echo=False,  # print sql
        echo_pool=False,
        # 設置7*60*60秒後回收連接池,默認-1,從不重置
        # 該參數會在每個session調用執行sql前校驗當前時間與上一次連接時間間隔是否超過pool_recycle,如果超過就會重置。
        # 這裏設置7小時是爲了避免mysql默認會斷開超過8小時未活躍過的連接,避免"MySQL server has gone away”錯誤
        # 如果mysql重啓或斷開過連接,那麼依然會在第一次時報"MySQL server has gone away",
        # 假如需要非常嚴格的mysql斷線重連策略,可以設置心跳。
        # 心跳設置參考https://stackoverflow.com/questions/18054224/python-sqlalchemy-mysql-server-has-gone-away
        pool_recycle=25200,
        connect_args={'check_same_thread': False},
        poolclass=StaticPool,
        # pool_size=20,
        # max_overflow=20,
    ),
    session=None,
)

# 站點相關配置以及tornado的相關參數
config = dict(
    debug=False,
    log_level="ERROR",
    log_console=False,
    log_file=True,
    log_file_path="/var/wizard/logs",  # 末尾自動添加 @端口號.txt_日期
    compress_response=True,
    xsrf_cookies=True,
    cookie_secret="kjsdhfweiofjhewnfiwehfneiwuhniu",
    login_url="/login",
    port=8103,
    max_threads_num=50,
    database=database_config,
    master=True,  # 是否爲主從節點中的master節點, 整個集羣有且僅有一個,(要提高可用性的話可以用zookeeper來選主,該項目就暫時不做了)
    navbar_styles={"inverse": "魅力黑", "default": "優雅白"},  # 導航欄樣式
    default_avatar_url="identicon",
    application=None,  # 項目啓動後會在這裏註冊整個server,以便在需要的地方調用,勿修改
    async_do = None,
    progress = 0,#安裝進度
    result = '',#安裝結果
    component=json.load(open("./static/resource/component.json","r")),  #模塊名和安裝包名,依賴包名的映射表
    packet_name=json.load(open("./static/resource/packet_name.json","r"))   #模塊名和安裝包名的映射表
)



settings = dict(
    template_path=os.path.join(os.path.dirname(__file__), "template"),
    static_path=os.path.join(os.path.dirname(__file__), "static"),
    compress_response=config['compress_response'],
    xsrf_cookies=config['xsrf_cookies'],
    cookie_secret=config['cookie_secret'],
    login_url=config['login_url'],
    debug=config['debug']
)

logging.basicConfig(filename='/opt/wizard/basic.log')
logger = logging.getLogger('main')
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler('/opt/wizard/log.log', encoding='utf-8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter('[%(asctime)s -%(levelname)s -%(filename)s:%(lineno)d -%(funcName)s]:%(message)s'))
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(logging.Formatter('[%(asctime)s -%(levelname)s -%(filename)s:%(lineno)d -%(funcName)s]:%(message)s'))
logger.addHandler(fh)
logger.addHandler(ch)

4、每個模塊的__init__.py

from flask import Blueprint

home = Blueprint(
    'home',
    __name__,
    template_folder='templates',
    static_folder='static'
)

from . import view

5、視圖舉例

from flask import Flask,request,redirect,session,render_template,make_response
from . import home

@home.route('/', methods=['GET','POST'], endpoint='index')
def index():
    if request.method == 'GET':
        return render_template('index.html'), 201, {'author':'sufei'}  #{{ url_for('static', filename='css/commons.css') }}'  {% for i in list %} {% endfor %}  {{ v }}
    else:
        response = make_response('hello world')
        response.headers['xxx']='flask'
        return response
        # return "Index"
        # return render_template('index.html'), 201, {'author':'sufei'}
        # return redirect('/')   #return(url_for('index')
        # return response, status, headers  #可缺省
        # return render_template()   可傳入python函數func=test,或者用@app.template_global(),@app.template_filter() 裝飾函數直接使用
        # return jsonify(name='alex',age='18')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章