2014-06-09 136 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

如果我每次請求重新加載數據,我是否會引入問題?或者這意味着每次有人打開頁面時數據文件都會打開?我對你的功能在時間上尋找什麼感到困惑 –

相關問題