2016-10-14 36 views
-1

我試圖設置一個redis隊列和一個工人來處理我的燒瓶應用程序的隊列。我正在實現這個來處理髮送電子郵件的任務。我有點困惑,因爲它似乎堆棧跟蹤說,我的'APP_SETTINGS'環境變量沒有設置,當它實際上設置。Python燒瓶:RQ由於環境變量引發KeyError的工人

此前啓動的應用程序,Redis的還是工人,我設置APP_SETTINGS:

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... 

email.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) 

worker.py

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() 

我會很感激另一組看中了這一點。我不能爲我的生活弄清楚這裏發生了什麼。

+0

'echo $ APP_SETTINGS'的輸出是什麼? – danidee

+0

在我定義的終端中: (venv)tony @ tony-VirtualBox:〜/ pyp-launch $ echo $ APP_SETTINGS project.config.DevelopmentConfig。 在另一個終端中,它是空的,不確定原因。這是否需要在每個終端中定義? – orangeandgrey

+0

環境變量在終端會話中不是永久的。 – davidism

回答

0

感謝@danidee的提示,我發現需要在每個終端中定義環境變量。因此,APP_SETTINGS是針對實際應用程序定義的,但不適用於該工作人員。

解決方案是在工人終端中設置APP_SETTINGS。