使用任务队列发送邮件
我用Google任务队列的Python接口写了我的第一段代码。这个代码应该是在每次输入网址到地址栏时发送一封邮件。虽然在我的仪表盘上显示有一个任务在default
任务队列里,但我不知道为什么启动一个小时后它还是没有执行。
queue-mail.py:-
class sendMail(webapp.RequestHandler):
def post(self):
mail.send_mail(
'X@gmail.com',
self.request.get('to'),
self.request.get('subject'),
self.request.get('body'))
taskqueue.add(url='/sendMail',params=dict(
to='Y@hotmail.com',
subject = 'Testing task queues',
body = 'this is a message!'))
app.yaml:-
handlers:
- url: /mail
script: queue-mail.py
我调用这个代码的方式是:appid.appspot.com/mail
3 个回答
我觉得 send_mail
这个函数是把发送邮件的任务交给邮件服务,然后邮件服务会把这个任务放到一个队列里去处理。所以我不太确定 taskqueue.add()
会不会比 send_mail()
更快。(假设你的发送邮件任务没有做其他的远程调用之类的事情)。
请查看文档中关于如何使用webapp框架的部分。你已经定义了一个处理器类,但还没有为它定义一个WSGI应用,也没有在你的脚本中调用它。因此,你的处理器代码根本不会被执行。
因为你把任务添加到队列的代码放在了模块的顶层,并且没有定义一个main()
函数,所以每次有请求发送到这个模块时,它都会执行那段代码——这样你的代码只是不断地添加相同的任务到队列,而没有真正执行任何操作。你需要把添加任务到队列的代码和执行任务的代码分开,并把添加任务的代码放在另一个处理器中,通过不同的URL来调用它。
既然你的问题已经解决了,我就来给大家写个官方的回答。post
能用,而get
不行,是因为任务队列默认使用的是post
方法。如果你查看一下这个函数的文档,你会发现有一个叫做method的参数,你可以在这里指定使用get
、post
等方法,但因为你在代码中没有指定,所以它默认用了post
。另外,你可能没有看到404错误(表示找不到处理程序),而是看到了405错误(表示“方法不被允许”),这是因为任务队列试图向一个没有定义post
函数的处理程序发送post
请求。