2014-02-20 86 views
3

我寫了這個,這似乎只是很好地工作:按角色限制對瓶子視圖功能某些區域的訪問?

@app.route('/admin', methods=['GET','POST']) 
@login_required 
def admin(): 
    if not current_user.role == ROLE_ADMIN: 
     flash('You do not have access to view this page.') 
     return redirect(url_for('index')) 
...the rest of my code... 

雖然試圖把事情簡單化,因爲我不希望這3個行添加到我只想管理員可以看到每一個領域,我試圖把它在像這樣的功能:

def admin_only(): 
    if not current_user.role == ROLE_ADMIN: 
     flash('You do not have access to view this page.') 
     return redirect(url_for('index')) 

,然後把我的視圖功能:

@app.route('/admin', methods=['GET','POST']) 
@login_required 
def admin(): 
    admin_only() 
...the rest of my code.... 

但是如我所料,這並不工作。我得到了閃過的消息,但它並沒有像我想的那樣重定向。

於是,兩個問題:

  1. 爲什麼不返回重定向的工作?
  2. 有沒有更好的方法來實現這個功能?

回答

3

要真正回答你的問題。您應該使admin_only函數成爲裝飾器並裝飾admin視圖方法。它現在不重定向的原因是因爲你沒有從視圖返回重定向。

def admin(): 
    ret = admin_only() 
    if(not ret): 
     return ret 
.... 

這應該可以解決您目前的問題,但它並不理想,您希望的功能應該移到修飾器。

我還提出以下建議:

Flask-Principal看看它提供了角色分配給用戶,然後限制基於這些角色你的意見訪問的能力。

與Flask-Principal一起看看Flask-Security,因爲它提供了許多有用的與安全有關的Flask擴展,並且使它更易於使用。

使用例:

@roles_required("admin") 
def website_control_panel(): 
    return "Only Admin's can see this." 

ONLY允許用戶連接到他們的帳戶的角色admin。另一種使用情況是,以允許用戶具有能夠與roles_accepted指定,並且可被用作下列許多角色之一:

@roles_accepted("journalist", "editor") 
def edit_paper(): 
    return render_template("paper_editor.html", ...) 

將只允許具有所述journalisteditor角色中的至少一個用戶綁定到他們的帳戶。

+0

感謝您的幫助!我會檢查這些軟件包。 – Chockomonkey

+0

第一部分代碼中的否定應該被刪除,因爲它反正顯示了受限制的視圖 – Jarzyn

相關問題