python - 密钥存在时出现 KeyError
问题描述
我是python新手,不太了解。我的init .py 文件遇到问题。我正在使用烧瓶微博教程做一个烧瓶应用程序,并尝试通过自动发送电子邮件来进行错误处理
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 命令行中运行烧瓶后收到错误消息。如果我需要进一步澄清,请告诉我!
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
。
解决方案
- a返回时的使用
get
和处理情况None
- 使用
get
适当的默认值(如果有的话..)
推荐阅读
- ruby-on-rails - Rails 中许多逻辑的最佳实现方式是什么?
- java - 为什么我的方法总是引用它收到的第一个参数
- php - 致命错误:未捕获的 ArgumentCountError:函数 eregi() 的参数太少,传入 2
- python - 如何在plotly中为图表创建带有换行符的标题
- node.js - 如何更快地检测到与 Firestore 的断开连接?
- java - 在 IntelliJ IDEA 中移动包
- php - 在一个信封中同时举行签字仪式
- c++ - 如何获得全局互斥锁?
- python - 从 CSV 列到字典的匹配值 - python
- python - 从由 pandas.cut() 分箱的 pandas 列中过滤行