2013-10-21 9 views
1

플라스크 응용 프로그램에서 플라스크 메일을 구현하고 있지만 응용 프로그램에서 컨텍스트 오류가 없어지면 제거 할 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 구성 파일에 mail_server 매개 변수를 넣었습니다.Flask-mail (python) : 응용 프로그램 컨텍스트 오류가 발생했습니다.

/app.py - 응용 프로그램이 create_web_apis

def create_app(config): 
"""Creates an instance of the app according to `config` 

:param config: An instance of :class:`flask.config.Config` 

:returns: The configured application. This can be passed to a WSGI 
    container. 

""" 
app = create_web_apis() 

app.config.update(config) 
mail = Mail(app) 
... 

여기 /emails.py

from flask import current_app 
from flask.ext.mail import Mail, Message 


mail = Mail(current_app) 

def send_email(subject, sender, recipients, text_body, html_body): 
    msg = Message(subject, sender = sender, recipients = recipients) 
    msg.body = text_body 
    msg.html = html_body 
    mail.send(msg) 

에서 인스턴스화하면 내부 응용 프로그램 컨텍스트를 제공해야

Traceback (most recent call last): 
File "bin/run-tests", line 58, in <module> 
test_suite = test_loader.loadTestsFromNames(args.tests) 
File  "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 128, in loadTestsFromNames 
suites = [self.loadTestsFromName(name, module) for name in names] 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName 
module = __import__('.'.join(parts_copy)) 
File "/Users/tahsin/dev/restful_phollow/phollow/tests/test_external.py", line 16, in <module> 
from phollow.emails import send_email 
File "/Users/tahsin/dev/restful_phollow/phollow/emails.py", line 6, in <module> 
mail = Mail(current_app) 
File "/Users/tahsin/dev/venv/phollow/lib/python2.7/site-packages/flask_mail.py", line 461, in __init__ 
self.state = self.init_app(app) 
File "/Users/tahsin/dev/venv/phollow/lib/python2.7/site-packages/flask_mail.py", line 473, in init_app 
app.config.get('MAIL_SERVER', '127.0.0.1'), 
File "/Users/tahsin/dev/venv/phollow/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__ 
return getattr(self._get_current_object(), name) 
File "/Users/tahsin/dev/venv/phollow/lib/python2.7/site-packages/werkzeug/local.py", line 297, in _get_current_object 
return self.__local() 
File "/Users/tahsin/dev/venv/phollow/lib/python2.7/site-packages/flask/globals.py", line 26, in _find_app 
raise RuntimeError('working outside of application context') 
+0

당신이 시작할 수

app.py 들여 쓰기를 고정하고 전체 예제를 제공합니다. 'create_web_apis' 내부에서 무슨 일이 일어나고 있는지는 명확하지 않습니다. 또한 추적은 몇 가지 테스트를 실행하고 있다고 제안합니까? 그래서'test_external.py'는 어디에 있습니까? 답변을 얻으려면 [SSCCE] (http://www.sscce.org/)를 제공해야합니다. – zero323

+0

test_external의 테스트 케이스가 send_email의 매개 변수를 전달합니다. 죄송합니다. – user2216194

+0

문제를 일으킨 코드가 없으면 문제를 진단하기가 어렵습니다. 그럼에도 불구하고 당신은 내 대답을 읽을 수 있고 그것은 당신에게 해결책을 줄 것입니다. – zero323

답변

1

전체 추적을하다 예를 들어 app.test_request_context을 사용하여 테스트합니다. 당신은 더에서 official docs

당신은 시도 할 수 있습니다 읽을 수있는이 :

emails.py

from flask import current_app 
from flask.ext.mail import Mail, Message 

def send_email(subject, sender, recipients, text_body, html_body): 
    mail = Mail(current_app) 
    msg = Message(subject, sender = sender, recipients = recipients) 
    msg.body = text_body 
    msg.html = html_body 
    mail.send(msg) 

test.py

import unittest 
from app import create_app 
from flask.ext.mail import Message 
from emails import send_email 

class AppTestCase(unittest.TestCase): 
    def setUp(self): 
     self.app = create_app() 

    def test_mail(self): 
     with self.app.test_request_context('/'): 
      send_email("Hello", 
        sender="[email protected]", 
        recipients=["[email protected]"], 
        text_body='', 
        html_body='', 
      ) 

if __name__ == '__main__': 
    unittest.main() 

: 당신이 작성하는 경우

의3210 인스턴스는 emails.py에서 반복하지 마십시오. 아래처럼 뭔가 충분합니다 :

from flask import Flask 

def create_app(): 
    app = Flask(__name__) 
    return app 

당신은 DebuggingServer

으로 모두를 테스트 할 수 있습니다

import unittest 
from app import create_app 
from flask.ext.mail import Message 

class AppTestCase(unittest.TestCase): 
    def setUp(self): 
     self.app = create_app() 

    def test_mail(self): 
     with self.app.test_request_context('/'): 
      self.app.mail.send(Message("Hello", 
        sender="[email protected]", 
        recipients=["[email protected]"])) 

if __name__ == '__main__': 
    unittest.main() 

test.py

python -m smtpd -n -c DebuggingServer localhost:1025

+0

귀하의 의견을 많이 주셔서 감사합니다! 불행히도 여전히 오류가 발생합니다. 나는 그것이 current_app.mail.send (msg)라고 생각한다. 네, 저는 메일을 앱의 회원으로 만들었습니다. – user2216194

+0

내 API에서 Mail의 하위 클래스를 만들거나 메일 개체를 매개 변수로 전달할 수 있는지 궁금합니다. 나는 플라스크와 파이썬에 매우 익숙하다. 그래서 나는 내 무지를 용서해 준다. – user2216194

+0

지금 당신의'send_email'조차도 불필요한 것처럼 보입니다. 간단한 원 - 라이너로는 처리 할 수없는 것이 없으므로 간단하게 유지합니다. – zero323

관련 문제