前言
用Django一段时间了,总是感觉Django有些笨重,而且各版本之间变化比较大。同时,我在windows7上安装的时候竟然不成功!于是重新拾起之前的Flask作为Django的补充。
Flask资源
这里罗列一下个人学习使用Flask的资源
- 官网,必须的
- Flask中文学习网
- Python中文学习大本营,里面有一些翻译后的教程,其中“探索 Flask”对开发非常有帮助
- SQLAlchemy,访问数据库怎么能少了它呢
写个博客练练手吧(又是博客。。。)
国人写的一个开源的博客程序(vmaig_blog)给了很大的启发,不过不支持多用户。数据层Model基本参照这个代码,略有调整。
博客将采用Mysql数据库,Markdown进行文章内容编辑,提供后台管理功能及缓存机制。
初步设计思路
开发环境
- 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
项目的结构
项目的结构主要参考了“探索 Flask”,其中有一些个人的调整。
blog/
blog/ #项目的主目录
static/ #静态文件
templates/ #模板
views/ #相关的view放入该目录
__init__.py #创建app,并加载相关组件
caches.py #缓存
filter.py #过滤器
forms.py #forms表单
models.py #model
utils.py #工具
config/
__init__.py
default.py #默认的配置值,可用于所有的环境或者被个人的环境给覆盖。
development.py #用于开发环境的配置值。这里你可能会指定本地数据库的 URI。
production.py #用于生产环境的配置值。在这里 DEBUG 一定要设置成 False。
staging.py #根据开发进度,你可能会有一个模拟生产环境,这个文件主要用于这种场景。
instance/
config.py #这个文件包含了不应该出现在版本控制中的配置变量。 包含像 API 密钥以及包含密码的数据库URIs。
init_db.py #数据库初始化脚本
run.py #项目运行脚本
requirements.txt #项目所使用到的第三方库
部分代码说明
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'管理控制台', 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)