0

이를 통해 POST 요청을 제출하지 않고 작업 후 요청이 무엇 다음 것은 원래 코드의 축약 버전이 questionGAE 파이썬 : 가서 형태

의 연속이다. 가장 관련성이 높은 부분을 포함 시키려고 시도하고 Datastore를 값으로 업데이트하는 cron 작업에 사용되는 스크립트 부분을 생략했습니다.

다음, sendFollowUp() 핸들러에서, 두 번째 cron 작업이 값에 대한 데이터 저장소를 조회 한 후 궁극적으로 다른 서비스에 REST API 호출에 사용되는 매개 변수로이 값을 전송하는 푸시 작업 큐를 사용 Datastore의 사용자 (엔티티)에게 이메일을 보냅니다.

내가 알아낼 수없는 것은 양식을 통해 게시물 요청을 제출하지 않고 같은 처리기에서 게시물 요청과 함께 요청을 처리하는 방법입니다. 이것은 sendFollowUp 핸들러 내에서 발생해야합니다. 내가 찾은 사례의 대부분은 양식을 제출하는 것을 포함합니다. 그러나, 나는 그것을하고 싶지 않다. 난 그냥 cron 작업 및 작업 대기열과 함께 자동으로 작동 싶어요.

import webapp2 
import datetime 
from google.appengine.ext import db 
from google.appengine.api import users 
from google.appengine.api import taskqueue 
import jinja2 
import os 

jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__))) 

class emailJobs(db.Model): 
    """ Models an a list of email jobs for each user """ 
    triggerid = db.StringProperty() #Trig id 
    recipientid_po = db.StringProperty() # id 
    recipientlang = db.StringProperty() #Language 
    fu_email_sent = db.DateTimeProperty() 
    fuperiod = db.IntegerProperty() # (0 - 13) 
    fu1 = db.DateTimeProperty() 
    fu2 = db.DateTimeProperty() 

    @classmethod 
    def update_fusent(cls, key_name, senddate): 
     """ Class method that updates fu messages sent in the GAE Datastore """ 
     emailsjobs = cls.get_by_key_name(key_name) 
     if emailsjobs is None: 
      emailsjobs = cls(key_name=key_name) 
     emailsjobs.fu_email_sent = senddate 
     emailsjobs.put() 

def timeStampFM(now): 
    d = now.date() 
    year = d.year 
    month = d.month 
    day = d.day 
    t = now.time() 
    hour = t.hour 
    minute = t.minute + 5 
    second = t.second 
    today_datetime = datetime.datetime(year, month, day, hour, minute, second) 
    return today_datetime 


class MainPage(webapp2.RequestHandler): 
    """ Main admin login page """ 
    def get(self): 
     if users.get_current_user(): 
      url = users.create_logout_url(self.request.uri) 
      url_linktext = 'Logout' 
      urla = '/' 
      url_admin = "" 
      if users.is_current_user_admin(): 
       url = users.create_logout_url(self.request.uri) 
       urla = "_ah/admin/" 
       url_admin = 'Go to admin pages' 
       url_linktext = 'Logout' 

     else: 
      url = users.create_login_url(self.request.uri) 
      url_linktext = 'Login' 

     template_values = { 
      'url': url, 
      'url_linktext': url_linktext, 
      'url_admin': url_admin, 
      'urla': urla, 
      } 

     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 


class sendFollowUp(webapp2.RequestHandler): 
    """ Queries Datastore for fu dates that match today's date, then adds them to a task queue """ 
    def get(self): 

     now = datetime.datetime.now() 
     now_dt = now.date() #today's date to compare with fu dates 

     q = emailJobs.all() 
     q.filter('fuperiod >', 0) 
     q.filter('fuperiod <', 99) 

     for part in q: 
      guid = str(part.recipientid_po) 
      lang = str(part.recipientlang) 
      trigid = str(part.triggerid) 

      if part.fuperiod == 1: 
       fu1rawdt = part.fu1 
       fu1dt = fu1rawdt.date() 
       if fu1dt == now_dt: 
        follow_up = '1' 

      if part.fuperiod == 2: # the values go up to 12 in the original code 
       fu2rawdt = part.fu2 
       fu2dt = fu2rawdt.date() 
       if fu2dt == now_dt: 
        follow_up = '2' 

     if follow_up != None: 
      taskqueue.add(queue_name='emailworker', url='/emailworker', params={'guid': guid, 
                      'fu': follow_up, 
                      'lang': lang, 
                      'trigid': trigid, 
                      }) 
     self.redirect('/emailworker') 


class pushQueue(webapp2.RequestHandler): 
    """ Sends fu emails, updates the Datastore with datetime sent """ 

    def store_emails(self, trigid, senddate): 
     db.run_in_transaction(emailJobs.update_fusent, trigid, senddate) 

    def get(self): 
     fu_messages = {'1': 'MS_x01', 
         '2': 'MS_x02', 
         # the values go up to 12 in the original code 
         } 
     langs = {'EN': 'English subject', 
       'ES': 'Spanish subject', 
       } 

     fu = str(self.request.get('fu')) 
     messageid = fu_messages[fu] 

     lang = str(self.request.get('lang')) 
     subject = langs[lang] 

     now = datetime.datetime.now() 
     senddate = timeStampFM(now) 

     guid = str(self.request.get('guid')) 
     trigid = str(self.request.get('trigid')) 

     data = {} 
     data['Subject'] = subject 
     data['MessageID'] = messageid 
     data['SendDate'] = senddate 
     data['RecipientID'] = guid 
     # Here I do something with data = {} 

     self.store_emails(trigid, senddate) 

    app = webapp2.WSGIApplication([('/', MainPage), 
         ('/cron/sendfu', sendFollowUp), 
         ('/emailworker', pushQueue)], 
         debug=True) 
+0

을 이해하지 못하는 deferred.defer 할 수 있습니다. 왜 메서드 나 함수를 호출하지 않는가? – voscausa

답변

0

난 정말 당신의 질문을 이해 모르겠지만, 당신은 단지 requests 모듈에 POST 요청을 만들 수없는 이유는 무엇입니까? 쉬운 일이 사용을위한

또한

Post Requests

>>> payload = {'key1': 'value1', 'key2': 'value2'} 
>>> r = requests.post("http://httpbin.org/post", data=payload) 

당신은 이연 라이브러리를 보았는가?

이연 라이브러리는() 전용 작업 핸들러를 설정하고 직렬화하고, deferred.defer을 간단한 함수를 노출하여 매개 변수를 직렬화 복원의 모든 작업을 우회 할 수 있습니다. 나중에 함수를 호출하려면 기능을 전달하고 그 인수는 내부 포스트의 종류를 사용하려는 이유는

Link

+0

안녕하세요. 감사! 지연된 사운드는 이동하는 방법과 같지만 현재 코드와 통합하는 방법을 이해하지 못합니다. – 655321