如何将参数传递给任务队列?

4 投票
2 回答
2861 浏览
提问于 2025-04-18 11:56

我准备在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'})

这里面重要的是要加上 headerspayload 这两个参数

在接收数据的一方,你会得到:

@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请求中的变量。

撰写回答