繁体   English   中英

key 存在时出现 KeyError

[英]KeyError when the key exists

我是python的新手,了解不多。 我的init .py 文件遇到问题。 我正在使用 flask 微博教程做一个 flask 应用程序,并尝试通过自动发送电子邮件来进行错误处理

Traceback (most recent call last):
File "C:\Users\Non-admin\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\Non-admin\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\Non-admin\Desktop\Vagrant\python\python learning folder\python_projects\microblog\venv\Scripts\flask.exe\__main__.py", line 7, in <module>
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 990, in main
cli.main(args=sys.argv[1:])
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 596, in main
return super().main(*args, **kwargs)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\click\core.py", line 1062, in main
rv = self.invoke(ctx)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\click\core.py", line 1668, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))     
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\click\core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\click\core.py", line 763, in invoke
return __callback(*args, **kwargs)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\click\decorators.py", line 84, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\click\core.py", line 763, in invoke
return __callback(*args, **kwargs)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 845, in run_command
app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 321, in __init__
self._load_unlocked()
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 346, in _load_unlocked
self._app = rv = self.loader()
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 402, in load_app
app = locate_app(self, import_name, name)
File "c:\users\non-admin\desktop\vagrant\python\python learning folder\python_projects\microblog\venv\lib\site-packages\flask\cli.py", line 256, in locate_app
__import__(module_name)
File "C:\Users\Non-admin\Desktop\Vagrant\python\python learning folder\python_projects\microblog\app\__init__.py", line 18, in <module>
if app.config['MAIL_SERVER']:
   KeyError: 'MAIL_SERVER'

据我所知,密钥存在是因为在 config.py 文件中我使用 get() 方法指定了密钥。 我知道我可能做错了请协助。 下面是配置.py

import os

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

class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', '').replace or \
        'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    MAIL_SERVER = os.environ.get('MAIL_SERVER')
    MAIL_PORT = int(os.environ.get('MAIL_PORT') or 25)
    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS') is not None
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    ADMINS = ['admin@example.com']

下面是init .py,我在 windows 命令行中运行 flask 后出现错误。 如果我需要澄清更多,请告诉我!

import logging
from logging.handlers import SMTPHandler, RotatingFileHandler
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from config import Config

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
login = LoginManager(app)
login.login_view = 'login'

**if not app.debug:
    if app.config['MAIL_SERVER']:**
    auth = None
    if app.config['MAIL_USERNAME'] or app.config['MAIL_PASSWORD']:
        auth = (app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD'])
    secure = None
    if app.config['MAIL_USE_TLS']:
        secure = ()
    mail_handler = SMTPHandler(
        mailhost=(app.config['MAIL_SERVER'], app.config['MAIL_PORT']),
        fromaddr='no-reply@' + app.config['MAIL_SERVER'],
        toaddrs=app.config['ADMINS'], subject='Microblog Failure',
        credentials=auth, secure=secure)
    mail_handler.setLevel(logging.ERROR)
    app.logger.addHandler(mail_handler)
MAIL_SERVER = os.environ.get('MAIL_SERVER')

执行上述行后, MAIL_SERVER可以为None

结果上面一行

app.config['MAIL_SERVER']

会抛出KeyError

解决方案

  • 使用get并处理返回None的情况
  • 使用具有适当默认值的get (如果有一个..)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM