尝试将所有表放入Flask中,RuntimeError:找不到应用程序。在视图函数内部工作或推送应用程序上下文

时间:2020-06-14 18:39:48

标签: python flask flask-sqlalchemy

我是不熟悉Flask从事一个项目一个月的。我已经将所有代码分为文件和蓝图,并且我想通过在cmd中执行db.drop_all()来删除所有表。因此,我可以从头开始创建数据库条目,但是我得到了RuntimeError: No application found. Either work inside a view function or push an application context. 这是我的代码的一部分

整个 __ init __。py:

   from flask import Flask
   from flask_sqlalchemy import SQLAlchemy
   from flask_bcrypt import Bcrypt
   from flask_login import LoginManager
   from flask_mail import Mail
   from testapp.config import Config

   db=SQLAlchemy()
   bcrypt = Bcrypt()
   login_manager = LoginManager()
   login_manager.login_view = 'users.login'
   login_manager.login_message_category = 'info'
   mail = Mail()

    def create_app(config_class=Config):
       app = Flask(__name__)
       app.config.from_object(Config)

       db.init_app(app)
       bcrypt.init_app(app)
l      login_manager.init_app(app)
       mail.init_app(app)

       from testapp.users.routes import users
       from testapp.posts.routes import posts
       app.register_blueprint(users)
       app.register_blueprint(posts)
       return app

我的 config.py:

    import os

    class Config:
      SECRET_KEY = os.environ.get('SECRET_KEY')
      SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
      MAIL_SERVER = 'smtp.gmail.com'
      MAIL_PORT = 587
      MAIL_USE_TLS = True
      MAIL_USERNAME = os.environ.get('EMAIL_USERNAME')
      MAIL_PASSWORD = os.environ.get('EMAIL_PASSWORD')

我在 models.py:

中的所有表格
    from datetime import datetime
    from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
    from flask import current_app
    from testapp import db, login_manager
    from flask_login import UserMixin

    @login_manager.user_loader
    def load_user(user_id):
      return User.query.get(int(user_id))

    class User(db.Model, UserMixin):
      id = db.Column(db.Integer, primary_key=True)
      username = db.Column(db.String(20), unique=True, nullable=False)
      email = db.Column(db.String(120), unique=True, nullable=False)
      image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
      password = db.Column(db.String(60), nullable=False)
      posts = db.relationship('Post', backref='author', lazy=True)

    def __repr__(self):
      return f"User('{self.username}', '{self.email}', '{self.image_file}')"

    class Post(db.Model, UserMixin):
      id = db.Column(db.Integer, primary_key=True)
      title = db.Column(db.String(100), nullable=False)
      date_posted = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
      content = db.Column(db.Text, nullable=False)
      user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
      return f"User('{self.title}', '{self.date_posted}')"

1 个答案:

答案 0 :(得分:0)

仅是继续解决该问题,我只是愚蠢地运行了db.drop_all()函数,而没有在命令行中插入应用上下文,我要做的就是导入app_context()函数并将其添加到{{ 1}}。 在这里我以为我的代码有问题,所以对于有相同问题的人,请不要参考我的代码,而只能参考此答案。

谢谢@Adrian Klaver的帮助。