Google app engine GAE-python:Get和post请求在不通过表单提交post请求的情况下工作

Google app engine GAE-python:Get和post请求在不通过表单提交post请求的情况下工作,google-app-engine,python-2.7,request,httphandler,task-queue,Google App Engine,Python 2.7,Request,Httphandler,Task Queue,这是本书的延续 下面是原始代码的缩写版本。我试图包含最相关的部分,而忽略了cron作业使用的脚本部分,该脚本使用值更新数据存储 然后,在sendFollowUp()处理程序中,第二个cron作业查询数据存储中的这些值,然后使用推送任务队列将这些值作为参数发送给REST API调用中最终使用的另一个服务,该服务向数据存储中的人员(实体)发送电子邮件 我不明白的是,如何在同一处理程序中跟踪get请求和post请求,而不通过表单提交post请求。这需要在sendFollowUp处理程序中进行。我发现的

这是本书的延续

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

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

我不明白的是,如何在同一处理程序中跟踪get请求和post请求,而不通过表单提交post请求。这需要在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)
导入webapp2
导入日期时间
从google.appengine.ext导入数据库
从google.appengine.api导入用户
从google.appengine.api导入任务队列
进口金玉2
导入操作系统
jinja_environment=jinja2.environment(loader=jinja2.FileSystemLoader(os.path.dirname(\uu file\uuuu)))
类电子邮件作业(db.Model):
“”“为每个用户的电子邮件作业列表建模”“”
triggerid=db.StringProperty()#Trig id
recipientid_po=db.StringProperty()#id
recipientlang=db.StringProperty()#语言
fu_email_sent=db.DateTimeProperty()
fuperiod=db.IntegerProperty()#(0-13)
fu1=db.DateTimeProperty()
fu2=db.DateTimeProperty()
@类方法
def更新信息(cls、密钥名称、发送日期):
“”“更新GAE数据存储中发送的fu消息的类方法”“”
emailsjobs=cls.get_by_key_name(key_name)
如果emailsjobs为无:
emailsjobs=cls(key\u name=key\u name)
emailsjobs.fu_email_sent=发送日期
emailsjobs.put()
def时间戳FM(现在):
d=now.date()
年=年
月=d.month
天=天
t=now.time()
小时=t小时
分钟=t.分钟+5
秒=t秒
datetime=datetime.datetime(年、月、日、小时、分钟、秒)
今天返回日期时间
类主页(webapp2.RequestHandler):
“”“主管理员登录页”“”
def get(自我):
if users.get_current_user():
url=users.create\u logout\u url(self.request.uri)
url\u linktext='Logout'
urla='/'
url_admin=“”
如果users.is_current_user_admin():
url=users.create\u logout\u url(self.request.uri)
urla=“_-ah/admin/”
url_admin='转到管理员页面'
url\u linktext='Logout'
其他:
url=users.create\u login\u url(self.request.uri)
url\u linktext='Login'
模板_值={
“url”:url,
“url\u linktext”:url\u linktext,
“url\u admin”:url\u admin,
“urla”:urla,
}
template=jinja_环境。获取_模板('index.html'))
self.response.out.write(template.render(template_值))
类sendFollowUp(webapp2.RequestHandler):
“”“查询数据存储中与今天日期匹配的fu日期,然后将其添加到任务队列”“”
def get(自我):
now=datetime.datetime.now()
now_dt=now.date()#今天的日期与fu日期比较
q=emailJobs.all()
q、 筛选器('fuperiod>',0)

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

同样为了便于任务使用,您见过延迟库吗

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


我不明白您为什么喜欢使用一种内部post。为什么不调用一种方法或函数。嗨,谢谢!我认为延迟听起来是一种方式,但我不太明白如何将其与我当前的代码集成。
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)