2016-02-26 107 views
2

瓶是否有任何內置的用戶登錄/註銷功能的支持?我發現this add-on project,但它似乎只提供了部分來建立自己的登錄系統。它似乎不是一個完整的系統。實現與瓶一個登錄頁面

我是新來的燒瓶中,我從Django的未來在那裏,這是全內置,所以我發現它有點莫名其妙,這個基本的功能缺失。

使用,我發現了一些不完整的例子,我想實現一個重定向到爲匿名用戶登錄頁面的索引頁,併成功登錄後,頁面重定向到索引頁面。這是我目前已經實現爲一個「Hello World」登錄/註銷例如:

#!/usr/bin/env python 

import flask 
from flask import Flask, Response, render_template 
from flask.ext.login import LoginManager, UserMixin, login_required, login_user, logout_user 


app = Flask(__name__) 
login_manager = LoginManager() 
login_manager.init_app(app) 


class User(UserMixin): 
    # proxy for a database of users 
    user_database = { 
     "JohnDoe": ("JohnDoe", "John"), 
     "JaneDoe": ("JaneDoe", "Jane"), 
    } 

    def __init__(self, username, password): 
     self.id = username 
     self.password = password 

    @property 
    def name(self): 
     return self.id 

    @classmethod 
    def get(cls, id): 
     ret = cls.user_database.get(id) 
     if ret is not None: 
      return cls(*ret) 

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

@login_manager.request_loader 
def load_user(request): 
    token = request.headers.get('Authorization') 
    if token is None: 
     token = request.args.get('token') 

    if token is not None: 
     username,password = token.split(":") # naive token 
     user_entry = User.get(username) 
     if (user_entry is not None): 
      user = User(user_entry[0],user_entry[1]) 
      if (user.password == password): 
       return user 
    return None 


@app.route("/",methods=["GET"]) 
@login_manager.request_loader 
def index(): 
    if load_user(flask.request): 
     return render_template('index.html') 
    else: 
     return flask.redirect(flask.url_for('login')) 
    #return Response(response="Hello World!",status=200) 

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    if flask.request.method == 'GET': 
     return ''' 
       <form action='login' method='POST'> 
       <input type='text' name='email' id='email' placeholder='email'></input> 
       <input type='password' name='pw' id='pw' placeholder='password'></input> 
       <input type='submit' name='submit'></input> 
       </form> 
       ''' 

    email = flask.request.form['email'] 
    user = User.get(email) 
    if user and flask.request.form['pw'] == user.password: 
     login_user(user) 
     return flask.redirect(flask.url_for('index')) 

    return 'Bad login' 

@app.route("/logout") 
@login_required 
def logout(): 
    logout_user() 
    return flask.redirect(flask.url_for('index')) 

if __name__ == '__main__': 
    app.config["SECRET_KEY"] = "ITSASECRET" 
    app.run(port=5000, debug=True) 

但是,這是行不通的,因爲即使它似乎成功登錄,當它重定向到索引頁面,它無法從會話中查找用戶並重定向回登錄頁面。我究竟做錯了什麼?

+0

您需要閱讀flask-login的文檔......您的用戶類缺少一些必需的東西(例如isAnonomous) –

+0

我不確定爲什麼您覺得Auth未包含在Flask中會讓您感到困惑。 [其網站](http://flask.pocoo.org/)明確指出「燒瓶是一種微型框架」。這並不意味着有太多的功能。另見http://flask.pocoo.org/docs/0.10/foreword/#what-does-micro-mean:「許多擴展提供數據庫集成,表單驗證,上傳處理,各種開放認證技術等等。「 – Chris

回答

2

燒瓶登錄是在與其他一些用戶管理框架建立了一個非常基本的登錄管理器。我一直在使用Flask-User在生產超過150年的30K左右的用戶,並沒有任何問題,它(使用燒瓶登錄引擎蓋下)。維護人員很積極,並及時回覆了我的問題。

它處理用戶登錄,註冊,丟失密碼,甚至電子郵件確認,如果需要的話。它帶有一些預先構建的表單,如果你不想搞砸那個,但是如果你喜歡,可以輕鬆定製。

+0

與Flask-User相比,vanilla Flask-Login的穩定性如何? – franklin

+0

Flask登錄被用於我的多個框架,並且穩定性似乎與我的經驗中的瓶用戶一致。 – pech0rin

0

聽起來也許當login_user被調用沒有被持久化的登錄。我會確保你在做你的會話實際上是存儲登錄。