工程結構如下,全局的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')