如何将参数传递给任务队列?
我准备在Flask/Google App Engine中实现一个推送任务队列。简单来说,我想通过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
对象?!
我到底漏掉了什么呢?
2 个回答
0
抱歉打扰大家,但如果你想直接使用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
这两个参数
在接收数据的一方,你会得到:
@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']
我在评论里加了curl的用法,如果你想手动测试你的post接口,这会很有用
4
试试这个:
taskqueue.add(url='/worker', params={'user': user}, method="POST")
还有这个:
user = request.form.get('user')
正如marcadian提到的,taskqueue默认使用POST
方法,所以你可能需要用request.form
来获取POST请求中的变量。