Flask获取请求不使用全局变量的更新版本

时间:2017-03-14 04:41:11

标签: python flask global

我对烧瓶和蟒蛇都不熟悉。我有一个应用程序,我正在努力保存天气数据。我允许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 个答案:

答案 0 :(得分:0)

我相信你的问题是应用程序上下文。如上所述here

  

根据需要创建和销毁应用程序上下文。它   永远不会在线程之间移动,也不会在线程之间共享   要求。因此,它是存储数据库连接的理想场所   信息和其他东西。调用内部堆栈对象   flask._app_ctx_stack。扩展可以免费存储额外的   最高级别的信息,假设他们选择了足够的   唯一的名称,应该把他们的信息放在那里,而不是在   flask.g为用户代码保留的对象。

虽然它说你可以在最顶层存储数据,"它不可靠,例如,如果你推断你的项目使用uWSGI工作进程,你就需要持久性来在线程之间共享数据,无论如何。每次改变数据时,您应该使用数据库,redis或至少更新.csv文件。