2016-08-18 6 views
2

나는 이것을 작동 시키려고 노력했지만 더 좋은 방법이 있어야한다. 모든 입력을 환영한다.pyramid_mailer 및 apscheduler로 예정된 전자 메일 보내기

pyramid_mailer (.ini 파일에 저장된 설정)를 사용하여 Python 피라미드 앱에서 예정된 이메일을 보내려고하고 있으며 apscheduler가 일정을 설정하려고합니다.

또한 응용 프로그램이 다시 시작되면 작업을 다시 시작할 수 있도록 SQLAlchemyJobStore를 사용합니다.

jobstores = { 
    'default': SQLAlchemyJobStore(url='mysql://localhost/lgmim') 
} 
scheduler = BackgroundScheduler(jobstores=jobstores) 

@view_config(route_name='start_email_schedule') 
def start_email_schedule(request): 
    # add the job and start the scheduler 
    scheduler.add_job(send_scheduled_email, 'interval', [request], weeks=1) 
    scheduler.start() 

    return HTTPOk() 

def send_scheduled_email(request): 

    # compile message and recipients 
    # send mail 
    send_mail(request, subject, recipients, message) 

def send_mail(request, subject, recipients, body): 

    mailer = request.registry['mailer'] 
    message = Message(subject=subject, 
        recipients=recipients, 
        body=body) 

    mailer.send_immediately(message, fail_silently=False) 

이것은 지금까지 제가 얻은 것입니다. 요청을 피할 수 없기 때문에 아마도 오류가 발생했을 것입니다. 메일러를 얻을 수 pyramid.threadlocal.get_current_registry().settings를 사용

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

처음 작동하지만 이후 오류가 발생합니다. 나는 그것을 어떤 경우에도 사용하지 말 것을 권고합니다.

그 밖의 무엇을 할 수 있습니까?

답변

2

일반적으로 열린 소켓 및 기타 생생한 객체에 대한 참조가 포함되어 있기 때문에 request 객체를 피할 수 없습니다. 여기

몇 가지 유용한 패턴은

  • 당신 사전에 생성 이메일 데이터베이스의 ID와 스케줄러를 통해 아이디 (INT, UUID)를 통과한다는 것이다

  • 당신은 템플릿 컨텍스트 (JSON의 DICT)를 생성하고 스케쥴러를 통해 그것을 전달하고 작업자의 템플릿을 렌더링하십시오.

  • 모든 데이터베이스를 가져 와서 스케쥴러 내부에서 관련 짓고 아무런 인수도 전달하지 마십시오.

특히, 스케줄러 안에 가짜 request 객체를 생성하는 방법에 문제가 다음과 같이 해결할 수 있습니다

from pyramid import scripting 
from pyramid.paster import bootstrap 

def make_standalone_request(): 
    bootstrap_env = bootstrap("your-pyramid-config.ini") 
    app = bootstrap_env["app"] 
    pyramid_env = scripting.prepare(registry=bootstrap_env["registry"]) 
    request = pyramid_env["request"] 

    # Note that request.url will be always dummy, 
    # so if your email refers to site URL, you need to 
    # resolve request.route_url() calls before calling the scheduler 
    # or read the URLs from settings 

    return request 

Some more inspiration can be found here (disclaimer: I am the author).

+0

감사합니다, 이건 정말 도움이되었다. 귀하의 링크가 깨진 것 같습니다. – Niel

+0

링크가 수정되었습니다. 브라우저 자동 완성에 물렸어. –