2017-02-14 2 views
1

나는이 매우 간단 플라스크/셀러리 응용 프로그램을 실행하려고 :flask_mail 메시지 인스턴스가 직렬화 JSON없는

@celery.task 
    def send_async_email(msg): 
     with app.app_context(): 
      mail.send(msg) 

    @celery.task(bind=True) 

    @app.route('/', methods=['GET', 'POST']) 

    def index(): 
     if request.method == 'GET': 
      return render_template('index.html', email=session.get('email', '')) 
     email = request.form['email'] 
     session['email'] = email 

     msg = Message('Hello from Flask', 
         recipients=[request.form['email']]) 
     msg.body = 'This is a test email sent from a background Celery task.' 
     print type(msg) 
     print dir(msg) 
     print 'msg.send' 
     print msg.send 
     print 'msg' 
     print msg 

     if request.form['submit'] == 'Send': 

      send_async_email.delay(msg) 
      flash('Sending email to {0}'.format(email)) 
     else: 

     return redirect(url_for('index')) 

을하지만,이 메시지 클래스의 인스턴스가하지 않는, 직렬화 JSON되지 않기 때문에이 작동하지 않습니다

msg.send 
    <bound method Message.send of <flask_mail.Message object at 0x7ffa94cd0290>> 
    msg 
    Content-Type: text/plain; charset="utf-8" 
    MIME-Version: 1.0 
    Content-Transfer-Encoding: 7bit 
    Subject: Hello from Flask 
    From: [email protected] 

    EncodeError: <flask_mail.Message object at 0x7ffa94cd0290> is not JSON serializable 

답변

-1

당신이 0.9.0로 플라스크 메일 버전을 다운 그레이드를 시도 할 수 있습니다 : 경우 것 같다.

이 명령을 수행 할 수 있습니다

pip uninstall Flask-Mail 
pip install Flask-Mail==0.9.0 
4

셀러리는 브로커를 통해 전달 된 개체를 똑 바르게 직렬화 가능해야합니다. flask_mail.Message 개체가 아닙니다. 간단한 JSON 호환 객체를 허용하도록 send_async_email(msg)의 메소드 서명을 변경해야합니다. 즉, 원시 문자열, int, 그 사전 또는 유사한 것입니다. 그런 다음 해당 메소드 내에서 Message에 대한 모든 로직을 (인스턴스화에서 송신으로) 이동해야합니다. 예를 들어

:

내가 찾은
@celery.task 
def send_async_email(message_details): 
    with app.app_context(): 
     msg = Message(message_details['subject'], 
         message_details['recipients']) 
     msg.body = message_details['body'] 
     print type(msg) 
     print dir(msg) 
     print 'msg.send' 
     print msg.send 
     print 'msg' 
     print msg 
     mail.send(msg) 
0

단순히 직렬화를 설정하고 매력과 같은 기본 작업을 변경 추가하여. 다음

app.config.update(
accept_content=['json','pickle'] 
) 

,

@celery.task(serializer='pickle') 
def send_async_email(msg): 
관련 문제