ユーザーが現在ログオンしていない場合は「ログイン」、ユーザーがログインしている場合は「ログアウト」を表示するダイナミック ナビゲーション メニューが必要です。
次のようなコードを使用しています。
import flask
import flask_nav
import flask_nav.elements as fne
frontend = flask.Blueprint('frontend', __name__)
application = flask.Flask(__name__)
mySess = flask_session.Session()
flask_appconfig.AppConfig(application)
flask_bootstrap.Bootstrap(application)
application.register_blueprint(frontend)
application.config['BOOTSTRAP_SERVE_LOCAL'] = True
application.config['SSL'] = True
application.secret_key = SECRET_KEY
application.config['SESSION_TYPE'] = SESSION_TYPE
mySess.init_app(application)
nav = flask_nav.Nav()
class CustomRenderer(flask_bootstrap.nav.BootstrapRenderer):
def visit_Navbar(self, node):
nav_tag = super(CustomRenderer, self).visit_Navbar(node)
nav_tag['class'] = 'navbar navbar-default navbar-fixed-top'
return nav_tag
flask_nav.register_renderer(application, 'custom', CustomRenderer)
nav.init_app(application)
@nav.navigation()
def top_nav():
items = [ fne.View('Home', '.index') ]
if 'google_token' in flask.session:
items.append(fne.View('Logout', '.logout'))
elif 'auth_url' in flask.session:
items.append(fne.View('Login', flask.session['auth_url']))
else:
items.append(fne.View('Login', '.login'))
items.append(fne.View('About', '.about'))
items.append(fne.View('Contact', '.contact'))
items.append(fne.View('Shop', '.shop'))
items.append(fne.View('Help & Feedback', '.help'))
return fne.Navbar('', *items)
nav.register_element('frontend_top', top_nav())
残念ながら、Flask セッション変数は nav オブジェクトの範囲外であるため、top_nav 内からflask.session にアクセスできません。
たとえば、アプリケーションの外部でフラスコセッションにアクセスするためのスタンドアロン関数を作成するときも、同じ問題があります。
def user_is_logged_in():
if 'google_token' in flask.session:
return True
else:
return False
return False
これらの関数は、予想されるエラー「RuntimeError: Working outside of request context.」を返します。
セキュリティ上の理由から、ユーザーの application.py コードでグローバル変数を使用したくないため、複数の人がエラーなしで同時にアプリケーションにアクセスできます。ユーザーが現在ログインしているかどうかに関係なく、SESSIONは保存する必要があると思います。
アプリケーションのflask.sessionを表示するためにflask_nav.Nav()を取得するにはどうすればよいですか?