2017-03-14 19 views
0

我是燒瓶和python的新手。我正在準備一個應用程序來保存天氣數據。我允許get和post命令進入我的燒瓶應用程序。不幸的是,我的API的自動調用並不總是會返回正確的結果。當我調用post命令時,我正在將數據存儲在全局變量中,新數據將附加到我現有的數據中。不幸的是,有時候get被調用時,它並沒有接收到我的全局數據變量的最新版本。我相信問題在於,在調用get之前,並沒有從post函數傳遞給全局變量,因爲我可以運行get並返回正確的結果。燒瓶獲取請求不使用全局變量的更新版本

weatherData = [filed with data read from csv on initialization] 

class FullHistory(Resource): 
    def get(self): 
     ret = []; 
     for row in weatherData: 
      val = row['DATE'] 
      ret.append({"DATE":str(val)}) 
     return ret 

    def post(self): 
     global weatherData 
     newWeatherData = weatherData 
     args = parser.parse_args() 
     newVal = int(args['DATE']) 
     newWeatherData.append({'DATE':int(args['DATE']),'TMAX':float(args['TMAX']),'TMIN':float(args['TMIN'])}) 
     weatherData = newWeatherData 
     #time.sleep(5) 
     return {"DATE":str(newVal)},201 

class SelectHistory(Resource): 
    def get(self, date_id): 
     val = int(date_id) 
     bVal = False 
     #time.sleep(5) 
     global weatherData 
     for row in weatherData: 
      if(row['DATE'] == val): 
       wd = row 
       bVal = True 
       break 
     if bVal: 
      return {"DATE":str(wd['DATE']),"TMAX":float(wd['TMAX']),"TMIN":float(wd['TMIN'])} 
     else: 
      return "HTTP Error code 404",404 
    def delete(self, date_id): 
     val = int(date_id) 
     wdIter = None 
     for row in weatherData: 
      if(row['DATE'] == val): 
       wdIter = row 
       break 
     if wdIter != None: 
      weatherData.remove(wdIter) 
      return {"DATE":str(val)},204 
     else: 
      return "HTTP Error code 404",404 

有什麼辦法,我可以保證,我的全局變量是最新的,或者讓我的API等待返回,直到我敢肯定,更新已經傳承下去?這應該是一個簡單的應用程序。我真的寧願不必學習如何在python中使用線程。我確定我的電話獲得請求不會在郵件發出響應之後纔開始。我知道一個解決方法是使用睡眠來延遲我的反應,我寧願明白爲什麼我的更新不是立即發生。

+1

每當你在Python中使用一個全局變量時,一隻小貓就會死亡。在燒瓶他們甚至不工作。 –

+0

[在燒瓶應用程序中保留全局狀態]的可能重複(http://stackoverflow.com/questions/19277280/preserving-global-state-in-a-flask-application) –

回答

0

我相信你的問題是應用程序上下文。如上所述here

根據需要創建和銷燬應用程序上下文。它 永遠不會在線程之間移動,它將不會在 請求之間共享。因此它是存儲數據庫連接信息和其他東西的理想場所。內部堆棧對象被稱爲 flask._app_ctx_stack。擴展可以自由地在頂層存儲額外的 信息,前提是他們選擇了足夠的 唯一名稱,並且應該將他們的信息放在那裏,而不是保留給用戶代碼的flask.g對象。

雖然它說,你可以在存儲數據的「最高級別」,這是不可靠的,如果你推斷項目中使用的工作進程與uWSGI,例如,你需要持久性線程之間共享數據而不管。您應該使用數據庫,redis,或者每次更改數據時至少更新.csv文件。