烧瓶登录:不明白它是如何工作烧瓶登录:不明白它是如何工作(flask-login: can'

2019-05-12 23:11发布

I'm trying to understand how Flask-Login works.

I see in their documentation that they use a pre-populated list of users. I want to play with a database-stored users list.

However, I don't understand some things in this Flask-Login module.

@login_manager.user_loader
def load_user(userid):
    #print 'this is executed',userid
    return user(userid, 'asdf')

This code will be called at every request? This is used to load all the details of my user object?

For now, I have this code:

@app.route('/make-login')
def make_login():
    username = 'asdf'
    password = 'asdf'
    user_data = authenticate(username, password)
    user_obj = user(user_data[0], user_data[1])
    login_user(user_obj)
    return render_template('make-login.html')

When I access /make-login, I want to log in.

My user class:

class user(object):
    def __init__(self, id, username, active=True):
        self.username = username
        self.id = id
        #self.active = active
    def is_authenticated(self):
        return True  

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return 5

Also, I wrote another two functions for authenticate/register

def authenticate(username, password):

    cursor = db.cursor()
    password = md5.md5(password).hexdigest()
    try:
        query = "SELECT * FROM `users` WHERE `username` = %s AND `password` = %s"
        cursor.execute(query, (username, password))
        results = cursor.fetchall()
        #print results[0][0]
        #print "here i am"
        if not results:
            return False
        else:
            user_data = [results[0][0], results[0][1]]
            return user_data
            #self.authenticated = True
            #self.user_id = results[0][0]
            #session['username']  = results['username']
            #print type(results)
    except db.Error, e:
        return 'There was a mysql error'    

def register(username, password, email, *args):
    cursor = db.cursor()
    password = md5.md5(password).hexdigest()
    try:
        #query = "INSERT INTO `users` (`username`, `password`, `email`) VALUES ('%s', '%s', '%s')" % (username, password, email)
        query = "INSERT INTO `users` (`username`, `password`, `email`) VALUES (%s, %s, %s)"
        cursor.execute(query, (username, password, email))
        db.commit()
        return True
    except db.Error, e:
        print 'An error has been passed. %s' %e
        db.rollback()
        return False

I don't know how to make this Flask-Login work with MySQL. Also, I don't know if the user are logged-in. How can I get the user ID or the username?

Anyone can explain me in some rows how this Flask-Login works?

Answer 1:

瓶登录实际上并没有一个用户后端,它只是处理的会话机制,以帮助您登录并注销用户。 你有(按装饰方法)来告诉它,什么代表一个用户,它也是由你来弄清楚如何知道用户是“主动”还是没有(因为是“有效”,意味着在不同应用不同的事情)。

你应该阅读的文档 ,并确保它做什么和不做 。 在这里,我只打算专注于与DB后端布线起来。

刚开始时,定义一个用户对象; 它代表了你的用户属性。 那么这个对象可以查询数据库,或LDAP,或任何与它的登录机制与后台数据库连接钩。

我将使用登录示例脚本用于这一目的。

class User(UserMixin):
    def __init__(self, name, id, active=True):
        self.name = name
        self.id = id
        self.active = active

    def is_active(self):
        # Here you should write whatever the code is
        # that checks the database if your user is active
        return self.active

    def is_anonymous(self):
        return False

    def is_authenticated(self):
        return True

一旦你的用户创建的对象,你需要编写装入(基本上,创建实例的用户的方法User从上面的类)。 这种方法被称为与用户ID。

@login_manager.user_loader
def load_user(id):
     # 1. Fetch against the database a user by `id` 
     # 2. Create a new object of `User` class and return it.
     u = DBUsers.query.get(id)
    return User(u.name,u.id,u.active)

一旦你有这些步骤后,你的登录方法做到这一点:

  1. 检查是否用户名和密码匹配(在你的数据库) - 你需要自己编写代码。

  2. 如果认证成功,得到了用户的ID,并把它传递给login_user()



Answer 2:

烧瓶登录将尝试加载用户之前的每个请求。 所以,是的,你在下面的示例代码将在每个请求之前调用。 它是用来检查是在当前会话什么用户名和将加载用户对象为ID。

@login_manager.user_loader
def load_user(userid):
    #print 'this is executed',userid
    return user(userid, 'asdf')        

如果你看一下在GitHub上瓶登录源代码,还有下功能init_app一行其中有云:

app.before_request(self._load_user)

所以每个请求前,_load_user函数被调用。 该_load_user功能实际上是调用基于条件的另一个功能“reload_user()”。 最后,reload_user()函数(在你的例子load_user())调用回调函数,你写的。

此外,烧瓶登录只提供机制,以登录/注销的用户。 如果你正在使用MySQL数据库它并不关心。



Answer 3:

按照从烧瓶登录的文档的用户对象必须退还,如果用户ID没有找到它应该返回None,而不是例外。

@login_manager.user_loader
def load_user(userid):
    try:
        #: Flask Peewee used here to return the user object
        return User.get(User.id==userid)
    except User.DoesNotExist:
        return None


Answer 4:

您可能需要使用瓶,安全 ,结合瓶,登录与SQLAlchemy的数据库访问和自动化大部分的用户记录的后端处理。

该快速入门教程将让你开始。 设置的app.config [“SQLALCHEMY_DATABASE_URI”]你的MySQL数据库连接字符串。



Answer 5:

下面是使用登录的瓶例如: https://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.py您需要使用@login_required为每一个需要登录的方法。 例如,

@app.route('/make-login')
@login_required
def make_login():
    ...


文章来源: flask-login: can't understand how it works