2012-08-22 20 views
53

Estoy tratando de entender cómo funciona Flask-Login.flask-login: no puedo entender cómo funciona

Veo en su documentación que usan una lista de usuarios previamente poblada. Quiero jugar con una lista de usuarios almacenados en la base de datos.

Sin embargo, no entiendo algunas cosas en este módulo Flask-Login.

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

¿Se llamará a este código en cada solicitud? Esto se usa para cargar todos los detalles de mi objeto de usuario?

Por ahora, tengo este código:

@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') 

Cuando acceder/maquillaje de inicio de sesión, quiero que entrar

Mi clase de usuario:.

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 

Además, Escribí otras dos funciones para autenticar/registrar

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 

No sé cómo hacer que este Flask-Login funcione con MySQL. Además, no sé si el usuario ha iniciado sesión. ¿Cómo puedo obtener la identificación de usuario o el nombre de usuario?

Cualquiera me puede explicar en algunas filas cómo funciona este Flask-Login?

Respuesta

49

matraz de inicio de sesión no tiene realmente un motor de usuario, que sólo se ocupa de la maquinaria de sesión para ayudar a que inicie sesión y cierre de sesión de los usuarios. Tienes que decirlo (decorando métodos), lo que representa a un usuario y también depende de ti averiguar cómo saber si un usuario está "activo" o no (ya que estar "activo" puede significar cosas diferentes en diferentes aplicaciones)

Debe leer el documentation y asegúrese de lo que hace y no lo hace. Aquí solo me concentraré en conectarlo con el back-end de db.

Para comenzar, defina un objeto de usuario; que representa propiedades para sus usuarios. Este objeto puede consultar bases de datos, o LDAP, o lo que sea, y es el enlace que conecta el mecanismo de inicio de sesión con el back-end de la base de datos.

Voy a utilizar el script login example para este fin.

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 

Una vez que haya creado el objeto de usuario, es necesario escribir un método que carga el usuario (básicamente, crea una instancia de la clase User desde arriba). Este método se llama con la identificación del usuario.

@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) 

Una vez que tenga estos pasos, su método de inicio de sesión hace esto:

  1. Comprueba si el partido de usuario y contraseña (en contra de su base de datos) - tiene que escribir el código mismo.

  2. Si la autenticación tuvo éxito, obtener la ID del usuario y pasarlo a login_user()

+12

+1 Esto fue súper útil --- No entendí la documentación oficial de inicio de sesión de Flask. – Raj

+0

La esencia a la que se vincula es particularmente útil si no desea configurar necesariamente un back-end de base de datos para probar esto https://gist.github.com/bkdinoop/6698956 – dino

+0

@Burhan Khalid, en la función de ejemplo, def login(): ... login_user (usuario). ¿De dónde viene el usuario? – chfw

0

Aquí hay un ejemplo de Flask para usar el inicio de sesión: https://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.py Necesita utilizar @login_required para cada método que requiera iniciar sesión. Por ejemplo,

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

Sé lo que es login_required, necesito saber qué es con user_loader. Sin embargo, conozco este ejemplo, pero no administran usuarios desde una base de datos ... –

+3

y el enlace es denegado, al menos para mí. – volvox

10

matraz de inicio de sesión a tratar de cargar un usuario antes de cada petición. Entonces sí, se llamará a su código de ejemplo a continuación antes de cada solicitud. Se usa para verificar qué ID de usuario está en la sesión actual y cargará el objeto de usuario para esa ID.

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

Si nos fijamos en el código fuente matraz de inicio de sesión en github, hay una línea de bajo init_app función que va:

app.before_request(self._load_user) 

Así que antes de cada petición, la función se llama _load_user. Las funciones _load_user realmente llaman a otra función "reload_user()" en función de las condiciones. Y finalmente, la función reload_user() llama a su función de devolución de llamada que usted escribió (load_user() en su ejemplo).

Además, el inicio de sesión del matraz solo proporciona el mecanismo para iniciar/cerrar sesión en un usuario. No importa si estás usando la base de datos mysql.

3

De acuerdo con el documento Flask-Login, se debe devolver un objeto de usuario y si no se encuentra el ID de usuario, debe devolver None en lugar de Exception.

@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 
4

Es posible que desee utilizar Flask-Security, que combina matraz de Entrar con SQLAlchemy para el acceso a bases de datos y automatiza gran parte del manejo de back-end de registros de usuario.

El tutorial Quick Start lo ayudará a comenzar. Establezca app.config ['SQLALCHEMY_DATABASE_URI'] en su cadena de conexión de base de datos MySQL.

Cuestiones relacionadas