如何将params传递给任务队列?

时间:2014-07-02 22:58:59

标签: python google-app-engine flask task-queue flask-restful

我即将在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对象?!

我错过了什么?

2 个答案:

答案 0 :(得分:4)

尝试:

taskqueue.add(url='/worker', params={'user': user}, method="POST")

user = request.form.get('user')

正如marcadian指出的那样,taskqueue默认使用POST,所以也许你需要request.form才能访问POST变量。

答案 1 :(得分: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'})

要添加headerspayload 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']

如果您想手动测试帖子路线,我在评论中添加了curl,可能很有用