案例:学生成绩管理
新建项目目录stud, 并创建虚拟环境
mkvirtualenv stud -p python3
安装开发中使用的依赖模块
pip install flask==0.12.4 pip install redis==3.2.1 pip install flask-session==0.3.1 pip install flask-script==2.0.6 pip install flask-mysqldb==0.2.0 pip install flask-sqlalchemy==1.3.4 pip install flask-migrate==2.5.2 pip install flask_wtf==0.14.2
在pycharm中打开项目目录,设置虚拟环境以后,编写manage.py启动项目的文件
创建 manage.py
文件
from flask import Flask app = Flask(__name__) @app.route('/index') def index(): return 'index' if __name__ == '__main__': app.run()
mange.py终不能存放大量的开发代码, 在开发中应该体现的是一种分工精神,所以我们可以把flask中各种功能代码进行分类分文件存储.
创建项目目录结构:
项目根目录/ ├── application/ # 项目主要逻辑代码保存目录 | ├── settings/ # 项目配置存储目录 │ │ ├ dev.py # 开发阶段的配置文件 │ │ ├ prop.py # 生产阶段的配置文件 │ ├── __init__.py # 项目初始化文件 ├── manage.py # 项目的终端管理脚本文件
配置文件
settings/__init__.py
代码:
from redis import StrictRedis class Config(object): """项目配置核心类""" # 调试模式 DEBUG = True # todo 配置日志 pass # mysql数据库的配置信息 SQLALCHEMY_DATABASE_URI = "" # 动态追踪修改设置,如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS = False # 查询时会显示原始SQL语句 SQLALCHEMY_ECHO= False # 配置redis REDIS_HOST = '127.0.0.1' # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是 REDIS_PORT = 6379 # 设置密钥,可以通过 base64.b64encode(os.urandom(48)) 来生成一个指定长度的随机字符串 SECRET_KEY = "ghhBljAa0uzw2afLqJOXrukORE4BlkTY/1vaMuDh6opQ3uwGYtsDUyxcH62Aw3ju" # flask_session的配置信息 SESSION_TYPE = "redis" # 指定 session 保存到 redis 中 SESSION_USE_SIGNER = True # 让 cookie 中的 session_id 被加密签名处理 SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT,db=1) # 使用 redis 的实例 PERMANENT_SESSION_LIFETIME = 24 * 60 * 60 # session_id的有效期,单位是秒
settings/dev.py`代码:
from . import Config class DevelopementConfig(Config): """开发模式下的配置""" # 查询时会显示原始SQL语句 SQLALCHEMY_ECHO= True SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/stud?charset=utf8"
settings/prop.py
代码:
from . import Config class ProductionConfig(Config): """生产模式下的配置""" DEBUG = False REDIS_HOST = '127.0.0.1'
项目主应用中初始化项目
在application/__init__.py
文件中,创建flask应用并加载配置
from flask import Flask from application.settings.dev import DevelopementConfig from application.settings.prop import ProductionConfig config = { "dev": DevelopementConfig, "prop": ProductionConfig, } def init_app(config_name): """项目的初始化函数""" app = Flask(__name__) # 设置配置类 Config = config.get(config_name) # 加载配置 app.config.from_object(Config) return app
在manage.py 中调用 init_app 函数,启动项目
from application import init_app app = init_app("dev") @app.route("/") def index(): return "index" if __name__ == '__main__': app.run()
在application/__init__.py
项目初始化文件中加载redis或者mysql的初始化代码
from flask import Flask from redis import StrictRedis from flask_wtf.csrf import CSRFProtect from flask_session import Session from application.settings.dev import DevelopementConfig from application.settings.prop import ProductionConfig config = { "dev": DevelopementConfig, "prop": ProductionConfig, } # 为了方便redis的连接对象在函数外部可以使用,预先设置一个全局变量,接下来在函数中用于保存redis的连接 redis_store = None def init_app(config_name): """项目的初始化功能""" app = Flask(__name__) # 设置配置类 Config = config[config_name] # 加载配置 app.config.from_object(Config) # redis的链接初始化 global redis_store redis_store = StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT,db=0) # 开启CSRF防范功能 CSRFProtect(app) # 开启session功能 Session(app) # TODO 注册蓝图对象到app应用中 return app
调整了redis的加载,把redis的配置信息和初始化代码进行分离
新建文件application/utils/flask_redis,代码:
from redis import StrictRedis def get_redis_connection(option): return StrictRedis(host=option['HOST'], port=option['PORT'], db=option['DB'])
application/settings/__init__.py
,代码:
from redis import StrictRedis from application.utils.flask_redis import get_redis_connection class Config(object): """项目的公共配置核心类""" # 调试模式 DEBUG = True # todo 配置日志 pass # mysql数据库的配置信息 SQLALCHEMY_DATABASE_URI = "" # 动态追踪修改设置,如未设