2014-06-09 106 views
0

我有一个烧瓶应用程序,它使用文件中的static文件夹中的数据填充html表格。我有一个外部应用程序,每分钟更新一次Pickle文件。Flask web应用程序中的数据没有更新[Python]

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主办的烧瓶中的应用

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 
+0

我的猜测是,当服务器启动而不是每个请求期间您加载'Pickle'文件,但没有看到你的'views.py'文件很难确定。 – dirn

+0

@dirn:对不起,我猜这个视图文件非常重要。包含上面 –

+0

请参阅@ Daniel的答案在下面。您在进程启动时加载文件,但您希望在每次请求时加载它。 – dirn

回答

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 
+0

我认为请求正在到达服务器。如果我在启动uwsgi服务器并且数据是最新的时候可以从另一台计算机访问该页面,那么这是否意味着答案是肯定的?我在上面包含了我的views.py文件。 –

+0

如果我每次请求重新加载数据,我是否会引入问题?或者这意味着每次有人打开页面时数据文件都会打开?我对你的功能在时间上寻找什么感到困惑 –

相关问题