【问题标题】: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'] 中的断点实际上中断了。它肯定会进入那里。

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


【解决方案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,可能很有用

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多