2017-05-28 13 views
0

データベースに値を格納するFlaskアプリケーションがあります。これらはHTML形式のものです。これらのいくつかは、次のコードを使用して、フラスコのセッションに追加されます。Flaskセッションから値を取得する際のKeyError

session['userID']=str(cur_var.getvalue())

私は現在のセッションのみに格納されているものを示してデバッグHTMLページを持っています。次のようにこのページをレンダリングするためのコードは次のとおりです。私は、このページを開いて私が理解するために

<securecookiesession {'usercoord': 7.0,'userid': '53.0'}></securecookiesession> 

@app.route('/debug/') 
def debug(): 
    return str(session) 

たら、私のセッションは間違いuseridキーを持っています。 new_address.append(float(session['userid']))

私は次のエラーを取得:さらに

<title>KeyError: 'userid' // Werkzeug Debugger</title> 

を、私は私のフラスコアプリケーションは、現在のセッションからユーザーIDを取得しようと、別の(レンダリングされていない)URLにあるしかし

session['userID']を印刷するだけの非常に簡単なWebページを作成しました。私はすでにこれを試してみました

builtins.KeyError 
KeyError: 'userid' 

:私は私のフラスコのアプリケーションで次のコードを使用します。

@app.route('/print/') 
def printing(): 
    return render_template('print.html', printing=session['userid']) 

をそして、これはprint.htmlテンプレートです:これは、次のエラーが生成さ

{% extends "layout.html" %} 
{% block content %} 
{{ printing }} 
{% endblock %} 

はるかに小さなアプリケーションで同じロジックを使用していて、うまくいきました。私のエラーはどこにありますか?

ご協力いただきありがとうございます。

P.S. これは、私のウェブページとFlaskアプリケーションとのやりとりをjQueryで処理し、AJAXを使用してデータを投稿する処理です。

UPDATE

1非常に簡単にそれを軽減するためのプロジェクトをリメイクした後、私は時々フラスコセッションに新しい値を追加し、(私は理解していない理由のために)動作しませんことを発見しました。私はこのコード行含まれている場合たとえば、:

session['coordid']=float(cur_var.getvalue())

をそして、私のprint.htmlページにstr(session)の値をチェックし、私はキーcoordidが表示されません。

答えて

0

この問題は、AJAXがどのように非同期であるかに関係しています。 AJAX呼び出しを持つ2つの異なるjQuery関数を呼び出すと、処理されていないデータが要求されます。

この場合、PythonがキャッチするAJAX呼び出しを行う関数があります。 Pythonアプリケーションは、呼び出しからデータを取り出してデータベースに格納します。同時に、Pythonも処理する別のAJAX呼び出しがあります。ただし、すべての情報が最初の通話で処理されたわけではないため、KeyErrorが得られます。

私はこの問題を解決するには、いくつかのことを試みた:コールバックを使用して

  • を。しかし、Lazaris(2012)の投稿Callback Functions in JavaScriptにあるように、「関数がAjax呼び出しやアニメーションのような何らかの非同期実行を含んでいれば、非同期アクションの開始後にコールバックが実行されますが、終了する前に実行されます。 "

  • AJAX成功コールバックで2番目の関数を呼び出すが、これは機能しませんでした。

  • 最後に、解決策はPythonアプリケーションで次のコードを追加することでした。セッションに追加される値に依存して機能を実行する前に、この値が存在することを確認:

    count = 1000 while not session['coordid'] and count: count -= 1