4

我即将在 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了上一次调用的对象?!

请问我错过了什么?

4

2 回答 2

4

尝试:

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

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

正如 marcadian 指出的那样,taskqueuePOST默认使用,因此您可能需要request.form访问 POST 变量。

于 2014-07-02T23:15:00.347 回答
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'})

重要的是添加headerspayloadkwargs

在接收端,你得到了:

@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,这可能很有用

于 2017-12-12T14:07:21.817 回答