2017-10-13 56 views
1

我正在使用Flask-Security爲我的應用程序設置用戶身份驗證,但我正在努力獲取當前登錄用戶的電子郵件地址或ID,以便我可以查詢具有該特定用戶詳細信息的表格。我剛剛使用標準代碼。如何在實現Python Flask-Security時獲取當前用戶?

另一個問題here建議如下,但它沒有工作:

my_user = current_user.get_id() 

標準代碼:

from flask import Flask, render_template 
from flask_sqlalchemy import SQLAlchemy 
from flask_security import Security, SQLAlchemyUserDatastore, \ 
    UserMixin, RoleMixin, login_required 

# Create app 
app = Flask(__name__) 
app.config['DEBUG'] = True 
app.config['SECRET_KEY'] = 'super-secret' 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' 

# Create database connection object 
db = SQLAlchemy(app) 

# Define models 
roles_users = db.Table('roles_users', 
     db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), 
     db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))) 

class Role(db.Model, RoleMixin): 
    id = db.Column(db.Integer(), primary_key=True) 
    name = db.Column(db.String(80), unique=True) 
    description = db.Column(db.String(255)) 

class User(db.Model, UserMixin): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(255), unique=True) 
    password = db.Column(db.String(255)) 
    active = db.Column(db.Boolean()) 
    confirmed_at = db.Column(db.DateTime()) 
    roles = db.relationship('Role', secondary=roles_users, 
          backref=db.backref('users', lazy='dynamic')) 

# Setup Flask-Security 
user_datastore = SQLAlchemyUserDatastore(db, User, Role) 
security = Security(app, user_datastore) 

# Create a user to test with 
@app.before_first_request 
def create_user(): 
    db.create_all() 
    user_datastore.create_user(email='[email protected]', password='password') 
    db.session.commit() 

# Views 
@app.route('/') 
@login_required 
def home(): 
    return render_template('index.html') 

if __name__ == '__main__': 
    app.run() 

回答

2

Michael是一半的權利,問題是標準代碼示例不會導入會話,而flask-security會在後端設置會話,但它不適用於燒瓶應用程序。這從邁克爾代碼:

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    if request.method == 'POST': 
     session['username'] = request.form['username'] 
     session['email'] = request.form['email'] 

雖然正確在一個標準的應用程序可能會與燒瓶安全斷裂或至少是不必要的,因爲燒瓶安全完全取/登錄路由的控制和安全地處理的形式。需要到該燒瓶中的示例應用的僅有的兩個變化是:

更改燒瓶進口行:

from flask import Flask, render_template, session 

這是從會話得到的用戶ID的一個例子:

@app.route('/dashboard') 
@login_required 
def dashboard(): 
    user_id = session["user_id"] 
    return name 

希望這可以幫助別人,因爲它花了我一段時間纔得到我的頭。

1

恕我直言,你可以實現從瓶sessions

from flask import Flask, session, redirect, url_for, escape, request 

app = Flask(__name__) 

@app.route('/') 
def index(): 
    if 'username' in session: 
     print("Currents user's ID is %s" % session['id'] 
     return 'Logged in as %s' % escape(session['username']) 
    return 'You are not logged in' 

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    if request.method == 'POST': 
     session['username'] = request.form['username'] 
     session['email'] = request.form['email'] 
     session['id'] = request.form['id'] 
     return redirect(url_for('index')) 
    return ''' 
     <form method="post"> 
      <p><input type=text name=username> 
      <p><input type=submit value=Login> 
     </form> 
    ''' 

@app.route('/logout') 
def logout(): 
    # remove the username from the session if it's there 
    session.pop('username', None) 
    session.pop('email', None) 
    session.pop('id', None) 
    return redirect(url_for('index')) 

# set the secret key. keep this really secret: 
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' 

參見:http://flask.pocoo.org/docs/0.12/quickstart/#sessions

0

其更好地使用會話這一點。您可以將信息存儲在會話中,然後在任何地方使用。

在您的登錄函數中,只需存儲如下值: 首先從flask中導入會話,然後像這樣使用。

session['username'] = login_form.username.data 

然後在你的模板中使用它像{{ session['username'] }}

+0

這是建議爲安全瓶,因爲它負責所有的用戶登錄管理。我不想做的是構建已經存在的功能。 –