1. 准备工作
新建项目目录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启动项目的文件
注意:安装flask-mysqldb时python底层依赖于一个底层的mysql-client模块,若安装报这个错就先安装
pip install mysql-client
上面的安装命令也出现错误则执行
# 此处在ubuntu下,centos下apt-get换为yum apt-get install libmysqlclient-dev python3-dev
2. 创建manage.py文件
新建manage.py,内容:
from flask import Flask app = Flask(__name__) @app.route('/index') def index(): return 'index' if __name__ == '__main__': app.run()
创建项目目录结构:
项目根目录/ ├── application/ # 项目主要逻辑代码保存目录 | ├── settings/ # 项目配置存储目录 │ │ ├ dev.py # 开发阶段的配置文件 │ │ ├ prop.py # 生产阶段的配置文件 │ ├ __init__.py # 项目初始化文件 ├── manage.py # 项目的终端管理脚本文件
3. 配置文件
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'
4. 项目应用中初始化项目
在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
新建文件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 = "" # 动态追踪修改设置,如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS = False # 查询时会显示原始SQL语句 SQLALCHEMY_ECHO= False # 配置redis REDIS = { 'default':{ 'HOST':'127.0.0.1', # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是 'PORT':6379, 'DB': 0 }, 'session':{ 'HOST': '127.0.0.1', # 项目上线以后,这个地址就会被替换成真实IP地址,mysql也是 'PORT': 6379, 'DB': 1 } } # 设置密钥,可以通过 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 = get_redis_connection(REDIS['session']) # 使用 redis 的实例 PERMANENT_SESSION_LIFETIME = 24 * 60 * 60 # session_id的有效期,单位是秒
application/__init__.py
from flask import Flask from .settings.dev import DevelopementConfig from .settings.prop import ProductionConfig from flask_wtf import CSRFProtect from flask_session import Session config = { "dev": DevelopementConfig, "prop": ProductionConfig, } """APP的初始化函数""" def init_app(config_name): app = Flask(__name__) # 设置配置类 global Config Config = config.get(config_name) # 加载配置 app.config.from_object(Config) # 开启CSRF防范功能 CSRFProtect(app) # 开启session功能 Session(app) # TODO 注册蓝图对象到app应用中 return app
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" # redis的相关配置写在公共配置中
mange.py代码:
from application import init_app app = init_app('dev') @app.route("/") def index(): from application.utils.flask_redis import get_redis_connection redis = get_redis_connection( app.config.get('REDIS').get("session") ) print(redis) return "hello" if __name__ == '__main__': app.run()
from flask import Flask from .settings.dev import DevelopementConfig from .settings.prop import ProductionConfig from flask_wtf import CSRFProtect from flask_session import Session from flask_sqlalchemy import SQLAlchemy config = { "dev": DevelopementConfig, "prop": ProductionConfig, } db = SQLAlchemy() """APP的初始化函数""" def init_app(config_name): app = Flask(__name__) # 设置配置类 global Config Config = config.get(config_name) # 加载配置 app.config.from_object(Config) # 开启CSRF防范功能 CSRFProtect(app) # 开启session功能 Session(app) # 数据库初始化 db.init_app(app) # TODO 注册蓝图对象到app应用中 return app
因为前面已经在settings中设置了数据库的配置信息,所以接下来,创建对应的数据库
create database stud charset=utf8mb4;
在项目根目录下`manage.py中设置项目启动程序并调用__init__.py的app
from application import init_app,db from flask_script import Manager from flask_migrate import Migrate, MigrateCommand app = init_app("dev") # 使用终端脚本工具启动和管理flask manager = Manager(app) # 启用数据迁移工具 Migrate(app, db) # 添加数据迁移的命令到终端脚本工具中 manager.add_command('db', MigrateCommand) @app.route("/") def index(): return "index" if __name__ == '__main__': manager.run()