2017-10-13 88 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

这是建议为安全瓶,因为它负责所有的用户登录管理。我不想做的是构建已经存在的功能。 –