前言
用Django一段時(shí)間了瞬欧,總是感覺Django有些笨重贷屎,而且各版本之間變化比較大。同時(shí)艘虎,我在windows7上安裝的時(shí)候竟然不成功!于是重新拾起之前的Flask作為Django的補(bǔ)充唉侄。
Flask資源
這里羅列一下個(gè)人學(xué)習(xí)使用Flask的資源
- 官網(wǎng),必須的
- Flask中文學(xué)習(xí)網(wǎng)
- Python中文學(xué)習(xí)大本營(yíng)野建,里面有一些翻譯后的教程属划,其中“探索 Flask”對(duì)開發(fā)非常有幫助
- SQLAlchemy,訪問數(shù)據(jù)庫(kù)怎么能少了它呢
寫個(gè)博客練練手吧(又是博客候生。同眯。。)
國(guó)人寫的一個(gè)開源的博客程序(vmaig_blog)給了很大的啟發(fā)唯鸭,不過不支持多用戶须蜗。數(shù)據(jù)層Model基本參照這個(gè)代碼,略有調(diào)整肿孵。
博客將采用Mysql數(shù)據(jù)庫(kù)唠粥,Markdown進(jìn)行文章內(nèi)容編輯疏魏,提供后臺(tái)管理功能及緩存機(jī)制停做。
初步設(shè)計(jì)思路
開發(fā)環(huán)境
- windows7
- Editplus
- python 2.7.9
- Flask==0.10.1
- Flask-SQLAlchemy==2.1
- Flask-Login==0.3.2
- flask-wtf==0.12
- Flask-Admin==1.3.0
- Flask-Cache==0.13.1
- flask_debugtoolbar
- Mistune
- pygments
- Pillow
- mysql-python
項(xiàng)目的結(jié)構(gòu)
項(xiàng)目的結(jié)構(gòu)主要參考了“探索 Flask”,其中有一些個(gè)人的調(diào)整大莫。
blog/
blog/ #項(xiàng)目的主目錄
static/ #靜態(tài)文件
templates/ #模板
views/ #相關(guān)的view放入該目錄
__init__.py #創(chuàng)建app蛉腌,并加載相關(guān)組件
caches.py #緩存
filter.py #過濾器
forms.py #forms表單
models.py #model
utils.py #工具
config/
__init__.py
default.py #默認(rèn)的配置值,可用于所有的環(huán)境或者被個(gè)人的環(huán)境給覆蓋只厘。
development.py #用于開發(fā)環(huán)境的配置值烙丛。這里你可能會(huì)指定本地?cái)?shù)據(jù)庫(kù)的 URI。
production.py #用于生產(chǎn)環(huán)境的配置值羔味。在這里 DEBUG 一定要設(shè)置成 False河咽。
staging.py #根據(jù)開發(fā)進(jìn)度,你可能會(huì)有一個(gè)模擬生產(chǎn)環(huán)境赋元,這個(gè)文件主要用于這種場(chǎng)景忘蟹。
instance/
config.py #這個(gè)文件包含了不應(yīng)該出現(xiàn)在版本控制中的配置變量。 包含像 API 密鑰以及包含密碼的數(shù)據(jù)庫(kù)URIs搁凸。
init_db.py #數(shù)據(jù)庫(kù)初始化腳本
run.py #項(xiàng)目運(yùn)行腳本
requirements.txt #項(xiàng)目所使用到的第三方庫(kù)
部分代碼說明
blog/__init__.py的代碼如下
#-*- coding: utf-8 -*-
from flask import Flask
from flask import render_template
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager
from flask_wtf.csrf import CsrfProtect
from flask_admin import Admin
from flask.ext.cache import Cache
app = Flask(__name__,instance_relative_config=True)
app.config.from_object('config.development')
app.config.from_pyfile('config.py')
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.init_app(app)
admin = Admin(app, name=u'管理控制臺(tái)', template_mode='bootstrap3', base_template='admin/blog_master.html')
db = SQLAlchemy(app)
CsrfProtect(app)
cache = Cache(app,config={'CACHE_TYPE': 'simple'})
from .views.site_bp import site_bp
app.register_blueprint(site_bp)
from .views.admin_bp import admin_bp
app.register_blueprint(admin_bp, url_prefix='/admin')
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
from .filter import *
run.py代碼如下
#-*- coding: utf-8 -*-
from flask_debugtoolbar import DebugToolbarExtension
from blog import app
if __name__ == '__main__':
toolbar = DebugToolbarExtension(app)
app.run(host='0.0.0.0',port=9000,debug=True)
instance/config.py代碼如下
#-*- coding: utf-8 -*-
SECRET_KEY = 'Sm9obiBTY2hyb20ga2lja3MgYXNz'
SQLALCHEMY_DATABASE_URI= "mysql://%s:%s@%s/%s" % ('root', '111111', 'localhost', 'flask_blog')
其中SECRET_KEY的生成
import os
os.urandom(24)