【问题标题】:Data in Flask web app not updating [Python]Flask Web 应用程序中的数据未更新 [Python]
【发布时间】:2014-06-09 06:06:20
【问题描述】:

我有一个烧瓶应用程序,它使用从 static 文件夹中的 Pickle 文件中获取的数据填充 html 表。我有一个外部应用程序每分钟更新一次 Pickle 文件。

views.py 文件打开 Pickle 文件并加载数据,然后将其发送到 html 模板。

我让应用程序运行起来了,虽然无论我刷新多少次页面,数据都与我在终端中首次启动应用程序时的数据相同。

我通过uwsgi --socket 127.0.0.1:3031 --wsgi-file run_web.py --callable app --processes 4 --threads 2 --stats 127.0.0.1:9191screen 实例中启动它。

我忘记做什么才能正确刷新数据?

我正在使用 uswginginx 来托管 Flask 应用

views.py...

import all the things    

with open('/home/metheuser/webapps/ers_portal/app/static/' + ec.dd_filename) as f:
     data = pickle.load(f)

column_names = data.pop('__column_names__')
column_names.insert(2, 'Screen Viewer')
column_names.insert(3, 'Site Page')
sites = data.keys()

for sitename in data:
    data[sitename].insert(2, ec.unit_roster[sitename]['ip_address'])
    data[sitename].insert(3, 'doesn\'tgoanywhereyet...')

dbt = da.Database_Authenticator(admin=False)

#************************************************
lm = LoginManager()
lm.init_app(app)
lm.login_view = 'login'

def authenticate(un, typed_pw, remember=False):
    """login with database"""
    my_user = dbt.authenticate_user(un, typed_pw)
    if my_user: #  user is authenticated
        return my_user
    else:
        return False

@lm.user_loader
def load_user(userid):
    print 'user id:',userid
    try:
        return dbt.get_user_by_id(userid)
    except AttributeError:
        return None

@app.before_request
def before_request():
    g.user = current_user

@app.route('/')
@app.route('/index')
def index():
    return render_template("index.html",
                           title = 'Main',)

@app.route('/login', methods = ['GET', 'POST'])
def login():
    if g.user is not None:
        if g.user.is_authenticated():
            return redirect(request.args.get('next') or 'index')
    form = LoginForm()
    if form.validate_on_submit():
        authed_user = authenticate(form.username.data, form.typed_pw.data, form.remember_me.data)
        if authed_user:
            authed_user.authenticated = True
            u = login_user(authed_user, form.remember_me.data)
        return redirect(request.args.get('next') or 'index')
    return render_template('login.html',
        title = 'Sign In',
        form = form)

@app.route('/logout')
def logout():
    logout_user()
    return redirect('index')

@app.route('/my_table')
@login_required
def my_table():
    print 'trying to access data table...'
    return render_template("my_table.html",
                           title = "Rundata Viewer",
                           sts = sites,
                           cn = column_names,
                           data = data) #  dictionary of data

【问题讨论】:

  • 我的猜测是您在服务器启动时而不是在每次请求期间加载 Pickle 文件,但是如果没有看到您的 views.py 文件,很难确定。
  • @dirn: 抱歉,我猜视图文件很重要。包括在上面
  • 见下面@Daniel 的回答。您在进程启动时加载文件,但您希望在每次请求时加载它。

标签: python nginx flask uwsgi


【解决方案1】:

首先,请求是否到达了您的烧瓶服务器?如果是,您应该向我们展示您的views.py,如果不是,请尝试通过添加一些查询字符串来强制刷新:http://your/url.html?123

编辑:在您的view.py 内,您只需在服务器启动时加载一次data。 每次文件更改时,您都必须更新数据:

data_modification_time = None
data = None
def reload_data():
    global data_modification_time, data
    filename = '/home/metheuser/webapps/ers_portal/app/static/' + ec.dd_filename
    mtime = os.stat(filename).st_mtime
    if data_modification_time != mtime:
        data_modification_time = mtime
        with open(filename) as f:
            data = pickle.load(f)
    return data

【讨论】:

  • 我认为请求正在到达服务器。如果我在启动 uwsgi 服务器时可以从另一台计算机访问该页面并且数据是最新的,这是否意味着答案是肯定的?我在上面包含了我的 views.py 文件。
  • 如果我每次请求都重新加载数据,我会不会引入问题?或者这是否意味着每次有人打开页面时都会打开数据文件?我对你的函数在时间方面寻找什么感到有点困惑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多