头发掉光也成不了大佬 2021-01-14 15:33 采纳率: 0%
浏览 49

Flask python models.py db init error

__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)错误,有大佬讲解一下吗?

  • 写回答

1条回答 默认 最新

  • boc007 2024-03-05 16:06
    关注

    你怎么启动这个应用实例的?看一下flask官网的example,在init中创建app并做db建立,然后flask --app 应用目录名 --debug启动

    评论 编辑记录

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建