Python Flask:RQ Worker由于环境变量而引发KeyError
我正在尝试设置一个redis队列和一个worker,用我的flask应用程序处理队列。我实现这个是为了处理发送电子邮件的任务。我有点困惑,因为堆栈跟踪似乎表明我的“APP\u SETTINGS”环境变量在实际设置时没有设置 在启动应用程序、redis或worker之前,我设置了应用程序设置:Python Flask:RQ Worker由于环境变量而引发KeyError,python,python-2.7,flask,python-rq,Python,Python 2.7,Flask,Python Rq,我正在尝试设置一个redis队列和一个worker,用我的flask应用程序处理队列。我实现这个是为了处理发送电子邮件的任务。我有点困惑,因为堆栈跟踪似乎表明我的“APP\u SETTINGS”环境变量在实际设置时没有设置 在启动应用程序、redis或worker之前,我设置了应用程序设置: export APP_SETTINGS="project.config.DevelopmentConfig" 但是,当项目添加到队列中时,堆栈跟踪如下: 17:00:00 *** Listening on
export APP_SETTINGS="project.config.DevelopmentConfig"
但是,当项目添加到队列中时,堆栈跟踪如下:
17:00:00 *** Listening on default...
17:00:59 default: project.email.sendMailInBG(<flask_mail.Message object at 0x7fc930e1c3d0>) (aacf9546-5558-4db8-9232-5f36c25d521b)
17:01:00 KeyError: 'APP_SETTINGS'
Traceback (most recent call last):
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/worker.py", line 588, in perform_job
rv = job.perform()
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/job.py", line 498, in perform
self._result = self.func(*self.args, **self.kwargs)
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/job.py", line 206, in func
return import_attribute(self.func_name)
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/utils.py", line 150, in import_attribute
module = importlib.import_module(module_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/tony/pyp-launch/project/__init__.py", line 24, in <module>
app.config.from_object(os.environ['APP_SETTINGS'])
File "/home/tony/pyp-launch/venv/lib/python2.7/UserDict.py", line 40, in __getitem__
raise KeyError(key)
KeyError: 'APP_SETTINGS'
Traceback (most recent call last):
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/worker.py", line 588, in perform_job
rv = job.perform()
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/job.py", line 498, in perform
self._result = self.func(*self.args, **self.kwargs)
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/job.py", line 206, in func
return import_attribute(self.func_name)
File "/home/tony/pyp-launch/venv/local/lib/python2.7/site-packages/rq/utils.py", line 150, in import_attribute
module = importlib.import_module(module_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/tony/pyp-launch/project/__init__.py", line 24, in <module>
app.config.from_object(os.environ['APP_SETTINGS'])
File "/home/tony/pyp-launch/venv/lib/python2.7/UserDict.py", line 40, in __getitem__
raise KeyError(key)
KeyError: 'APP_SETTINGS'
17:01:00 Moving job to u'failed' queue
17:01:00
17:01:00 *** Listening on default...
worker.py
from flask.ext.mail import Message
from project import app, mail
from redis import Redis
from rq import use_connection, Queue
q = Queue(connection=Redis())
def send_email(to, subject, template, emailable):
if emailable==True:
msg = Message(
subject,
recipients=[to],
html=template,
sender=app.config['MAIL_DEFAULT_SENDER']
)
q.enqueue(sendMailInBG, msg)
else:
print("no email sent, emailable set to: " + str(emailable))
def sendMailInBG(msgContent):
with app.test_request_context():
mail.send(msgContent)
import os
import redis
from rq import Worker, Queue, Connection
listen = ['default']
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
if __name__ == '__main__':
with Connection(conn):
worker = Worker(list(map(Queue, listen)))
worker.work()
我真的很想再多看一眼。我一辈子都搞不清楚这里发生了什么。多亏了@danidee的提示,我发现每个终端都需要定义环境变量。因此,已为实际应用程序定义了应用程序设置,但未为工作程序定义
解决方案是在工作者终端中设置APP_设置 在我定义的终端中,
echo$APP\u设置的输出是什么?(venv)tony@tony-VirtualBox:~/pyp launch$echo$APP\u SETTINGS project.config.DevelopmentConfig。在另一个终端中,它为空,不确定原因。这是否需要在每个终端中定义?