一、 先写框架
先在一个py文件里将信息写好,然后再进行项目拆分。
manage.py 里写上主框架
from flask import Flask
app = Flask(__name__)
@app.route('/index')
def index():
return 'hello'
if __name__ == '__main__':
app.run()
在往里面填充内容
manage.py
#__init__
# coding:utf-8
from flask import Flask
from config import config_map #导入配置信息
from flask_sqlalchemy import SQLAlchemy #数据库
import redis # 连接redis库
# from flask_wtf import CSRFProtect # csrf 防护
"""
flask有个自带的session 就是import session 还有一个扩展包session 就是这个Session
用这个扩展包Session是因为 自带的session会将数据依存于cookie,在前端页面就能看到session数据,这也是flask和Django不一样点
而扩展的Session有很大的自主权,我们可以规定将session信息存储在哪里,所以,我们用扩展的Session将session数据存在redis里面
"""
from flask_session import Session
from ihomeinner.api_1_0.demo import api
# 数据库
db = SQLAlchemy()
# 创建redis连接对象
redis_store = None
# 工厂模式
def create_app(config_name): #配置文件里面的config_map包含了配置信息、开发环境配置信息等,在启动入口的地方(manager.py),会写明具体需要什么配置信息
"""
创建flask的应用对象
:param param: 配置模式的模式名字(‘develop’ , ‘product’)
:return:
"""
app = Flask(__name__)
# 根据配置模式的名字获取配置参数的类
config_class = config_map.get(config_name)
app.config.from_object(config_class) #导入配置信息
# 使用app初始化db
db.init_app(app)
# 初始化redis工具
global redis_store
redis_store = redis.StrictRedis(host=config_class.REDIS_HOST,port=config_class.REDIS_PORT)
# 利用flask——session 将session数据保存到redis中
Session(app)
# 为flask 补充csrf防护 如果不做这个防护的话 有人就会通过post请求 利用漏洞对代码产生威胁
# CSRFProtect(app)
# 注册蓝图
# app.register_blueprint(api,url_prefix='/api/v1.0')
app.register_blueprint(blueprint=api)
return app
有感:
写代码,要写一步运行一步!!!!,不然等写很多代码了,再运行,出现报错时,真的不知道是哪里的错误。就像上面manage.py的代码,我写完代码后,没有运行,直接将代码拆分在很多文件里,然后运行拆分代码的时候发现报错,然后,,,,就开启了找代码的茫茫之路中,,,,从导包到找配置,,,最后还是一步步注释--放开原来的代码,然后重新一步步运行,才找到的。。。。。报错的时候真的很折磨啊!!!!!
---------------运行的时候要开启redis 因为我们配置了redis 不开启的话会报错-----------------------------
二、拆分项目
配置文件
#config.py
# coding:utf-8
import redis
from datetime import timedelta
class Config(object):
""" 配置信息 """
# 加密
SECRET_KEY = 'XHSOI*y9dfsck'
# 连接mysql数据库
SQLALCHEMY_DATABASE_URI ='mysql+pymysql://用户名:密码@localhost:3306/数据库名'
# 动态追踪修改设置,如未设置只会提示警告
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 查询时会显示原始SQL语句
SQLALCHEMY_ECHO = True
# redis配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# flask_session 配置
SESSION_TYPE='redis'
# 实际上flask_session连接的redis不是本机的redis,是另一台的服务器,它的host和port应该是另一台服务器的host和port,但是因为现在没有,所以就先存在本机上了
SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT)
SESSION_USE_SIGNER = False #是否对cookie中的session_id进行隐藏处理
# 如果设置SESSION_USE_SIGNER = True的话 启动前端会出现TypeError: cannot use a string pattern on a bytes-like object 报错
PERMANENT_SESSION_LIFETIME = timedelta(days=1) # 设置签名过期时间
PERMANENT_SESSION_LIFETIME = 3600*24 #设置session数据的有效期,单位为秒
class DevelopmentConfig(Config):
"""开发模式的配置信息"""
DEBUG=True
pass
class ProductionConfig(Config):
"""生产环境配置信息"""
pass
config_map ={
'develop':DevelopmentConfig,
'product':ProductionConfig
}
视图文件
# demo.py
from ..exts import db
from . import api
import logging
from flask import current_app
from ..models import * #必须得将models这个文件导进来 不然的话迁移就会报错 因为models没有和其他py文件有关联,只有它自己知道自己存在,所以会报错
@api.route("/index")
def index():
# logging.error('error info') #记录错误信息
# logging.warn('warn') #警告
# logging.info('massage') #信息
# logging.debug('') #调试
current_app.logger.error('error infp')
current_app.logger.warn('warn')
current_app.logger.info('')
current_app.logger.debug('')
return 'test'
初始化文件
# coding:utf-8
from flask import Flask
from config import config_map #导入配置信息
import redis # 连接redis库
from flask_wtf import CSRFProtect # csrf 防护
"""
flask有个自带的session 就是import session 还有一个扩展包session 就是这个Session
用这个扩展包Session是因为 自带的session会将数据依存于cookie,在前端页面就能看到session数据,这也是flask和Django不一样点
而扩展的Session有很大的自主权,我们可以规定将session信息存储在哪里,所以,我们用扩展的Session将session数据存在redis里面
"""
from flask_session import Session
from .exts import init_exts
import logging
from logging.handlers import RotatingFileHandler
# 创建redis连接对象
redis_store = None
# 配置日志信息
# 设置日志的记录等级
# 这个是INFO级别
logging.basicConfig(level=logging.INFO)
# 这个是WARNING级别
# logging.basicConfig(level=logging.WARNING)
# 创建日志记录器,指明日志保存的路径,每个日志文件的最大大小。保存的日志文件个数上线
file_log_handler = RotatingFileHandler('logs/log',maxBytes=1024*1024*100,backupCount=10)
# 创建日志记录的格式 日志等级 输入日志细腻系的文件名 行数 日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志对象(flask app使用的) 添加日志记录器
logging.getLogger().addHandler(file_log_handler)
# 工厂模式
def create_app(config_name): #配置文件里面的config_map包含了配置信息、开发环境配置信息等,在启动入口的地方(manager.py),会写明具体需要什么配置信息
"""
创建flask的应用对象
:param param: 配置模式的模式名字(‘develop’ , ‘product’)
:return:
"""
app = Flask(__name__)
# 根据配置模式的名字获取配置参数的类
config_class = config_map.get(config_name)
app.config.from_object(config_class) #导入配置信息
# 第三方插件初始化
init_exts(app)
# 初始化redis工具
global redis_store
redis_store = redis.StrictRedis(host=config_class.REDIS_HOST,port=config_class.REDIS_PORT)
# 利用flask——session 将session数据保存到redis中
Session(app)
# 为flask 补充csrf防护 如果不做这个防护的话 有人就会通过post请求 利用漏洞对代码产生威胁
CSRFProtect(app)
# 注册蓝图
# app.register_blueprint(api,url_prefix='/api/v1.0')
from .api_1_0 import api
app.register_blueprint(blueprint=api)
return app
第三方扩展
# 第三方插件
from flask_sqlalchemy import SQLAlchemy #数据库
from flask_migrate import Migrate,MigrateCommand #迁移文件
db = SQLAlchemy()
migrate = Migrate()
def init_exts(app):
db.init_app(app)
migrate.init_app(app,db)
启动文件
# coding:utf-8
from ihomeinner import create_app
from ihomeinner.exts import db
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
# 创建flask的应用对象
app = create_app('develop') #对应ihomeinner的__init__的配置信息导入 这个是用的开发环境信息配置
manager = Manager(app)
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()