【问题标题】:Storing and accessing dictionary data in Flask [duplicate]在 Flask 中存储和访问字典数据 [重复]
【发布时间】:2020-08-21 22:11:57
【问题描述】:

我有一个 Flask RESTful 服务,我想在初始化期间将 JSON 文件作为字典读取,然后在某些 GET 请求期间从中读取数据。字典必须每天更新一次。

这是我尝试使用 Flask 全局变量 -

app.py

import json

from flask import Flask
from flask import g

from api import api


def create_app(config_file='settings.py'):
    app = Flask(__name__)
    app.config.from_pyfile(config_file)
    api.init_app(app)
    with app.app_context():
        f = open('data.json')
        g.data = json.loads(f.read())
    return app


app = create_app()

feat_api.py

from flask_restplus import Resource, reqparse, fields, Model
from flask import g

from extensions.restplus import api

ns = api.namespace('feat', description='Feature')


parser = reqparse.RequestParser()
parser.add_argument('id', type=str, required=True)


@ns.route('/')
class Feature(Resource):
    @api.expect(parser)
    def get(self):
        args = parser.parse_args()
        return {"data": g.data[args['id']]}

我在调用 API 时收到以下错误 - AttributeError: '_AppCtxGlobals' object has no attribute 'data'

【问题讨论】:

  • This 可能无法回答您的问题,但这种方法会引发另一个问题?

标签: python flask flask-restplus


【解决方案1】:

最简单的方法是将字典保存为 pickle 文件,并在每次需要时加载:

import pickle

a = {'hello': 'world'}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(a, handle)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)

更新:

或者,您可以像在创建应用程序时所做的那样保存它,并在每次更新时保存变量:

def create_app(config_file='settings.py'):
app = Flask(__name__)
app.config.from_pyfile(config_file)
api.init_app(app)
with app.app_context():
    f = open('data.json')
    app.config['data'] = json.loads(f.read())
return app

feat_api.py

import current_app
@ns.route('/')
class Feature(Resource):
    @api.expect(parser)
    def get(self):
        args = parser.parse_args()
        return {"data": current_app.config['data']}

【讨论】:

  • 这行得通。但唯一的问题是在每个请求上读取和解析 json 文件似乎是一项昂贵的操作
  • 检查我的更新,这也适用于我的烧瓶测试应用程序没有app.app_context():
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 2020-10-03
  • 2019-04-27
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多