2014-07-23 20 views
0

我正在學習瓶子和圖紙,直到藍圖部分。首先,我具有由base.html文件包括了header.html,以及用於索引的路線下面是:瓶子顯示用戶註冊,或者已經在每個模塊的每個模板中登錄

@app.route('/') 
def index(): 
    return render_template("index.html", is_auth=session[is_authenticated], username=session[username]) 

header.html中:

{% if is_auth %} 
    Welcome {{ username }}</font>, 
{% else %} 
    <a href="{{ url_for('users.register') }}"> Register/Login</a></li> 
{% endif %} 

base.html文件是簡單的:

{% block header %} 
{% include 'header.html' %} 
{% endblock %} 

{% block content %} 
{% endblock %} 

{% block footer %} 
{% include 'footer.html' %} 
{% endblock %} 

一切工作正常,頭將要求註冊,如果沒有登錄,否則顯示「歡迎...」。

我的問題是,我使用的藍圖2個模塊分別是「用戶」和「書」,所以他們有2個以下子目錄:/用戶//書籍/。對於每個模塊,它將擴展base.html的內容塊

然而,事情是,如果我有一個配置文件,排名,註銷等路線......然後我需要發出會話[ is_authenticated]和會話[用戶名]添加到模板以正確顯示標題。我的意思是:

@mod.route('/profile/') 
@requires_login 
def profile(): 
    # do something here 
    return render_template("users/profile.html", is_auth=session[is_authenticated], username=session[username]) 

@mod.route('/rank/') 
@requires_login 
def rank(): 
    # do something here 
    return render_template("users/rank.html", is_auth=session[is_authenticated], username=session[username]) 

@mod.route('/register/') 
def register(): 
    # do something here 
    return render_template("users/register.html", form=forms, is_auth=session[is_authenticated], username=session[username]) 

該代碼是非常多餘的,因爲我必須一遍又一遍發送相同的東西。有沒有有效的方法或更好的方法來處理這個問題?

非常感謝你,祝你有個美好的回憶!

+0

您使用的認證系統是什麼?您應該只需在模板中執行'{%if user.is_authenticated%}',而無需向'render_template'添加任何內容。 – Blender

+0

我不使用任何,我只是基本上保存到數據庫的信息,並保持會話 – Kiddo

+2

使用像[燒瓶登錄](https://flask-login.readthedocs。org/en/latest /)會更安全和簡單。 – Blender

回答

1

聽起來像你應該使用flask-login讓你的生活更輕鬆。如果你看一下在GitHub上,你會看到他們做你想要做的已經什麼

:param add_context_processor: Whether to add a context processor to 
    the app that adds a `current_user` variable to the template. 
    Defaults to ``True``. 

得到它設置你的目的的快速版本:

開始通過初始化燒瓶登錄在您的應用程序

from flask.ext.login import LoginManager 
login_manager = LoginManager() 

def create_app(config=None): 
    # ... 
    login_manager.init_app(app) 
    return app 

然後,在你的模型中添加user_loader,或任何你的用戶的模型是

@login_manager.user_loader 
def load_user(user_id): 
    return User.query.get(int(user_id)) 

然後,在您的登錄視圖中,您可以簡單地添加幾行來抓取用戶並使用flask-loginlogin_user函數。此示例假定它來自WTForm並使用表單的數據和SQLAlchemy。 User是我的模特。非常基本的例子。

from ..models import User 
# ... 
u = User.query.filter_by(email=form.name.data).first() 
if u is not None: 
    login_user(u) 

在您的模板上,會有一個全球性的current_user與flask-login。你可以簡單地使用{{ current_user.is_authenticated }}來檢查當前用戶是否在那裏。

{% if current_user.is_authenticated %} 
    <h1>Hi, {{ current_user.username }}</h1> 
{% else %} 
    <a href="{{ url_for(user.login) }}">why aren't you logged in?</a> 
{% endif %} 
+0

感謝您的回答,爲了學習的目的,我只是想知道一種替代方法來解決它:D thnks再次 – Kiddo