0

这是这个问题的延续

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

然后,在sendFollowUp()处理程序中,第二个 cron 作业在数据存储中查询这些值,然后使用推送任务队列将这些值作为参数发送,这些参数最终在 REST API 调用中使用到另一个发送人员(实体)的服务数据存储区中的电子邮件。

我不知道如何在不通过表单提交发布请求的情况下在同一个处理程序中使用发布请求来跟进获取请求。这需要在 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)
4

1 回答 1

0

我不确定我是否真的理解你的问题,但你不能用requests模块创建一个 POST 请求吗?

发布请求

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

也为了方便任务使用,你见过延迟库吗?

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

关联

于 2013-03-06T09:39:12.330 回答