KeyError: «По умолчанию».Это ошибка, которую я получаю, когда пытаюсь запустить приложение - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в Python и фреймворке, это может показаться тривиальным, но я в тупике.Когда я пытаюсь запустить приложение фляги, оно выдает ошибку keyError: 'default' .

Вот мой код, разделенный на три различных .py модуля

manage.py

import os

from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
from app.models import User, Role
from app import create_app, db

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

manager = Manager(app)
migrate = Migrate(app, db)


@app.shell_context_processor
def make_shell_context():
    return dict(db=db, User=User, Role=Role)

manager.add_command('shell', Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)




if __name__ == '__main__':
    manager.run()

config.py

import os 

basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = 'SECRET_KEY' or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
    FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Config):
    DEBUG = True

    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')



class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')

config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,

    'default': DevelopmentConfig
}

app / __ init __. Py


from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail, Message
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy

from config import config


bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    app.config[config_name].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

А вот информация о трассировке, которую я получаю

Traceback (most recent call last):
  File "/home/charlson/Vscode/flasky/venv/bin/flask", line 11, in <module>
    sys.exit(main())
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 513, in main
    cli.main(args=args, prog_name=name)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 380, in main
    return AppGroup.main(self, *args, **kwargs)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args[1:], **kwargs)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 423, in run_command
    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 152, in __init__
    self._load_unlocked()
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 176, in _load_unlocked
    self._app = rv = self.loader()
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 237, in load_app
    rv = locate_app(self.app_import_path)
  File "/home/charlson/Vscode/flasky/venv/lib/python3.6/site-packages/flask/cli.py", line 90, in locate_app
    __import__(module)
  File "/home/charlson/Vscode/flasky/flasky.py", line 8, in <module>
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
  File "/home/charlson/Vscode/flasky/app/__init__.py", line 19, in create_app
    app.config[config_name].init_app(app)
KeyError: 'default'

Ожидается, что это простая веб-страница вдоль порта http://localhost:5000, на моей локальной машине

Любая помощь будет гордоцениться

1 Ответ

0 голосов
/ 06 февраля 2019

Удалить код app.config[config_name].init_app(app) после загрузки конфигурации, т. Е. app.config.from_object(config[config_name])

Вы успешно загрузили данные конфигурации в свое приложение и затем можете получить доступ к значениям конфигурации, указанным в классе конфигурации.Это так же, как доступ к обычному dict, поэтому у него не было никаких атрибутов, таких как default, вызывающее ошибку.

попробуйте запустить приложение после удаления кода app.config[config_name].init_app(app), оно будет работать нормально.

ref this страница для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...