2014-07-02 25 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可以是有用的

相關問題