__init__.py
import logging
from datetime import timedelta
from logging.handlers import RotatingFileHandler
from flask import Flask
from flask_session import Session
import redis
from config import config_dict, Config
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
redis_store = None
def create_app(env):
# env 可能是develop 或者 product
app = Flask(__name__)
app.jinja_env.auto_reload = True
app.config["SEND_FILE_MAX_AGE_DEFAULT"] = timedelta(seconds=1)
# app.secret_key = Config.SECRET_KEY
app.config['SECRET_KEY'] = Config.SECRET_KEY
config_classname = config_dict[env] # DevelopmentConfig 或者 ProductionConfig
# 加载配置信息
app.config.from_object(config_classname) # 不再写Config,而是写 DevelopmentConfig 或者 ProductionConfig
from flask_wtf.csrf import CSRFProtect
CSRFProtect(app)
# log_file(类名.LOG_LV)
log_file(config_classname.LEVEL_NAME)
# 创建SQLAlchemy对象
# db = SQLAlchemy(app)
db.init_app(app)
# 创建redis仓库
global redis_store
redis_store = redis.StrictRedis(host=config_classname.REDIS_HOST, port=config_classname.REDIS_PORT, db=0)
from flask_wtf import CSRFProtect
CSRFProtect(app) # 仅仅做了对比校验
from flask_wtf.csrf import generate_csrf
@app.after_request
def after_request(response):
# 生成 csrf_token 随机值
csrf_token = generate_csrf()
# 将 csrf_token 的值传给前端浏览器(通过设置cookie)
response.set_cookie("csrf_token", csrf_token)
return response
# 注册Users_blu蓝图对象
from apps.modules.Users import users_blu
app.register_blueprint(users_blu)
# 注册recording_blu蓝图对象
from apps.modules.RecordingLists import recording_blu
app.register_blueprint(recording_blu)
# # 注册news_detail_blu蓝图对象
# from info.modules.news_detail import news_detail_blu
# app.register_blueprint(news_detail_blu)
# # 注册profile_blu蓝图对象
# from info.modules.profile import profile_blu
# app.register_blueprint(profile_blu)
# 注册admin_blu蓝图对象
from apps.modules.Admin import admin_blu
app.register_blueprint(admin_blu)
# 创建Session对象
Session(app)
# 添加过滤器
# from info.utils.common import do_index_class
# app.add_template_filter(do_index_class, "to_classname")
#
# from info.utils.common import user_login_data
# @app.errorhandler(404)
# @user_login_data
# def page_not_found(_):
# user = g.user
# data = {
# "user_info": user.to_dict() if user else None
# }
# return render_template("news/404.html", data=data)
# 返回app
return app
def log_file(lv):
# 设置哪些日志信息等级要被记录
logging.basicConfig(level=lv) # 调试debug级
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
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)
manage.py
"""
这个文件是项目的入口文件
"""
from apps import create_app, db,models
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = create_app("develop") # 需求:创建app的时候可以传参数决定要加载哪些配置项(DevelopmentConfig,或者ProductionConfig)
# 传develop的时候,加载DevelopmentConfig类里面的配置
# 传product的时候,加载ProductionConfig类里面的配置
manager = Manager(app)
Migrate(app, db)
manager.add_command("db", MigrateCommand)
from apps.models import User
@manager.option("-n", dest="name")
@manager.option("-p", dest="password")
def createsuperuser(name, password):
if not all([name, password]):
print("参数不全")
return
user = User()
user.nick_name = name
user.mobile = name
user.password = password
user.is_admin = True
try:
db.session.add(user)
db.session.commit()
print("创建成功")
return
except Exception as e:
print("创建失败: %s" % e)
db.session.rollback()
from apps.utils.common import login_required
from apps.modules.Users.views import user_list
@app.route("/")
@login_required
def indexs():
return user_list()
app.add_url_rule("/", view_func=indexs)
if __name__ == "__main__":
# print(app.url_map)
# login_manager = LoginManager()
# login_manager.init_app(app)
# login_manager.login_view = 'login'
manager.run()
数据迁移的时候出ImportError: cannot import name 'db' from '__main__' (models.py)错误,有大佬讲解一下吗?