0

这将文章提交申请时,就是这种questionGAE的Python:GET和POST请求,而不通过表单

延续以下是原代码的缩写版本。我试图包含最相关的部分,并省略了使用值更新数据存储的cron作业使用的脚本部分。

然后,在sendFollowUp()处理程序,第二计划作业查询这些值的数据存储区,然后使用推送任务队列来发送这些值作为最终的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

我不明白你为什么喜欢用一种内部的职位。为什么不调用方法或函数。 – voscausa 2013-03-06 09:43:54

回答

0

我不知道我真正明白你的问题,但你不能只创建一个requests模块POST请求?

Post Requests

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

也为简单的任务使用你见过延迟库?

延迟库允许您绕过设置专用任务处理程序的所有工作,并通过公开一个简单函数deferred.defer()来序列化和反序列化您的参数。以后要调用一个函数,简单的传递函数及其参数deferred.defer的

Link

+0

嗨。谢谢!我认为推迟听起来像是要走的路,但我不太明白如何将它与我当前的代码集成。 – 655321 2013-03-06 19:25:22