2014-07-02 47 views
4

我即将在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 

工人被定义为在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中进行调试时,在请求对象中没有任何地方是用户ob的任何跟踪我发送给/worker的项目。但是我在那里发现了前一个电话中的records对象?!

我错过了什么?

+0

你确定它要进入taskqueue.add行吗?任务是否被创建?也许你的网址应该是/ worker而不是/ worker /? – marcadian

+0

是的,我在'TaskView' - >'user = request.json ['user']'中的断点实际上会中断。它绝对会进入那里。 – Houman

回答

3

尝试:

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

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

由于marcadian指出,任务队列使用POST默认情况下,所以也许你需要的request.form访问POST变量。

+0

默认情况下它使用POST – marcadian

+0

我只在调试器中检查过,'request.form'是一个空字典。 – Houman

+0

我遇到了一个有趣的案例。在我的Eclipse /调试中,我得到了如上所述的行为。但是,如果正确部署,我实际上在'request.form'中看到'user'。多么奇怪。 – Houman

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

的重要位被添加headers和​​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'] 

我在评论中添加卷曲,如果你想测试你的发布会te可以是有用的

相关问题