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

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')

重要的一点是添加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']

如果您想手动测试您的发布路线,我在 cmets 中添加了 curl,可能很有用

【讨论】:

以上是关于如何将参数传递给任务队列?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给使用 Heroku Scheduler 调用的 rake 任务?

将参数传递给 Gulp 任务

如何使用 Laravel 任务调度将参数传递给命令

将参数传递给windows计划任务

如何在 Rails 中使用环境将参数传递给 Rake 任务? [复制]

将参数传递给 Rake 任务中的方法 [重复]