如何将参数传递给任务队列?
Posted
技术标签:
【中文标题】如何将参数传递给任务队列?【英文标题】:How to pass params to Task Queue? 【发布时间】:2014-08-23 21:51:54 【问题描述】:我即将在 Flask/Google App Engine 中实现推送任务队列。 本质上,我想 POST 到 API 并在任务队列中执行底层工作。
初始入口点是一个 REST API (flask_restful)
class FTRecordsAPI(Resource):
def post(self):
arguments = self.reqparser.parse_args()
json_records = arguments.get('records')
user = User.query(...).get()
if user:
taskqueue.add(url='/worker/', params='user': user)
return '', 201
else:
return '', 401
worker在url.py中定义为一个视图:
app.add_url_rule('/worker', 'worker',
view_func=csrf_protect.exempt(TaskView.as_view('taskView')))
TaskView 是:
from flask.globals import request
class TaskView(MethodView):
def post(self):
user = request.json['user']
return "OK"
奇怪的是,当我在TaskView
中调试时,请求对象中没有任何我发送到/worker
的用户对象的痕迹。但是我在那里找到了来自上一次调用的records
对象?!
请问我错过了什么?
【问题讨论】:
你确定它会进入 taskqueue.add 行吗?任务是否被创建?也许您的网址应该是 /worker 而不是 /worker/ ? 是的,我在TaskView
-> user = request.json['user']
中的断点实际上中断了。它肯定会进入那里。
【参考方案1】:
试试:
taskqueue.add(url='/worker', params='user': user, method="POST")
和
user = request.form.get('user')
正如 marcadian 指出的那样,taskqueue 默认使用 POST
,因此您可能需要 request.form
才能访问 POST 变量。
【讨论】:
默认使用 POST 我刚刚在调试器中检查,request.form
是一个空字典。
我遇到了一个有趣的案例。在我的 Eclipse/debug 中,我得到了如上所述的行为。但是,如果部署得当,我实际上在request.form
中看到了user
。多么奇怪。
您确定生产和开发中都存在同一个用户吗?尝试在每个步骤中记录user
,从FTRecordsAPI
开始。我假设您有正在开发的任务队列?【参考方案2】:
很抱歉线程复活,但如果您想直接使用 json,您可以执行以下操作:
taskstop = taskqueue.add(url='/stop_std_watcher',
target='worker',
payload=json.dumps('watcherjson': client.client_watcher),
method='POST',
headers='Content-Type': 'application/json')
重要的一点是添加headers
和payload
kwargs
在接收端,你得到了:
@app.route('/stop_std_watcher', methods=['POST'])
def stop_std_watcher():
# curl -i -H "Content-Type: application/json" -X POST -d @stop.json http://localhost:8081/stop_std_watcher
watcherjson = request.json['watcherjson']
如果您想手动测试您的发布路线,我在 cmets 中添加了 curl,可能很有用
【讨论】:
以上是关于如何将参数传递给任务队列?的主要内容,如果未能解决你的问题,请参考以下文章
如何将参数传递给使用 Heroku Scheduler 调用的 rake 任务?