我对烧瓶和蟒蛇都不熟悉。我有一个应用程序,我正在努力保存天气数据。我允许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中使用线程。我已经确定我的电话获取请求在帖子发出响应后才开始。我知道一个解决方法是使用睡眠来延迟我的回复,我宁愿理解为什么我的更新不是立即发生的。
答案 0 :(得分:0)
我相信你的问题是应用程序上下文。如上所述here:
根据需要创建和销毁应用程序上下文。它 永远不会在线程之间移动,也不会在线程之间共享 要求。因此,它是存储数据库连接的理想场所 信息和其他东西。调用内部堆栈对象 flask._app_ctx_stack。扩展可以免费存储额外的 最高级别的信息,假设他们选择了足够的 唯一的名称,应该把他们的信息放在那里,而不是在 flask.g为用户代码保留的对象。
虽然它说你可以在最顶层存储数据,"它不可靠,例如,如果你推断你的项目使用uWSGI工作进程,你就需要持久性来在线程之间共享数据,无论如何。每次改变数据时,您应该使用数据库,redis或至少更新.csv文件。