No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de Flask

Curso de Flask

Bernardo Cassina

Bernardo Cassina

Autenticaci贸n de usuarios: Logout

30/36
Recursos

Aportes 15

Preguntas 9

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Podemos agregar estas lineas en la funcion de login para devolver al usuario a hello si ya esta logueado para que no puede ingresar de nuevo a la pagina de login una vez logueado

    if current_user.is_authenticated:
        return redirect(url_for('index'))```

Cuesta llegar hasta aqu铆. La vaina funciona, no s茅 muy bien como, pero funciona.

Que tal cambiar

if user_dic.to_dict() is not None:

por

if user_dic.to_dict():

Sanes si tendr铆a alguna implicaci贸n?

Tuve que actualizar dos tests.
El get de hello:

    def test_hello_get(self):
        response = self.client.get(url_for('hello'))

        self.assert200(response)

Lo cambi茅 para que se asegur茅 que me devuelve un status_code de redirecci贸n:

  def test_hello_login_required(self):
        response = self.client.get(url_for('hello'))

        self.assertEquals(response.status_code, 302)

Y el de POST sobre la ruta del login:

    def test_auth_login_post(self):
        fake_form = {
            'username': 'fake',
            'password': 'fake-pass'
        }
        
        response = self.client.post(url_for('auth.login'), data=fake_form)
        self.assertRedirects(response, url_for('index'))

Lo cambi茅 por este:

    def test_auth_login_post(self):
        fake_form = {
            'username': 'emmanuel',
            'password': '12345678'
        }
        
        response = self.client.post(url_for('auth.login'), data=fake_form)
        self.assertRedirects(response, url_for('hello'))
        response = self.client.get(url_for('hello'))        
        self.assert200(response)

Que se asegura que redirija a hello y que se puede entrar a hello una vez logeado. Lo malo es que ahora depende de que exista ese usuario en la base de datos que utilizo. Supongo que si se configura un ambiente de CI/CD tambi茅n se tiene que crear una base de datos para desarrollo en la nube.

me encanta flask, de verdad jajaja

Ahora, al crear un usuario nuevo, hacer logout y poner la misma clave ya no te permite ingresar, esto es porque compruebas un password hasheado con el que mandas el cual no es hasheado, para solucionar esto importas donde werkzeug. security el check password y queda as铆

from werkzeug.security import generate_password_hash, check_password_hash #para comprobar los hashes

#En login cambiar铆a password == password_from_db
@auth.route('/login', methods=['GET', 'POST'])
def login():
    login_form = LoginForm()
    context = {
        'login_form': login_form
    }

    if login_form.validate_on_submit():
        username = login_form.username.data
        password = login_form.password.data

        user_doc = get_user(username)

        if user_doc.to_dict() is not None:
            password_from_db = user_doc.to_dict()['password']

            #if password == password_from_db:
	      if check_password_hash(password_from_db, password):
                user_data = UserData(username, password)
                user = UserModel(user_data)

                login_user(user)

                flash('Bienvenido de nuevo')

                redirect(url_for('hello'))
            else:
                flash('La informaici贸n no coincide')
        else:
            flash('El usario no existe')

        return redirect(url_for('index'))

    return render_template('login.html', **context)

Y ahora si cuando el nuevo usuario quiere ingresar ya le permite, aunque los primeros que guardamos sin los hashes ya no ser铆an accesibles

Hasta lo unico que no me ha gustado tanto de los entornos virtuales, es que a veces se hay que reiniciar el entorno para que funcione o se reflejen los cambios

por a alguien le sirve, ya que vi que muchos les pasa lo mismo, a mi me mandaba a la pagina de login despu茅s haber puesto el usuario y password, lo que estuve revisando es que tenia un c贸digo repetido en **init**.py de app, en concreto el @login\_manager.userloader, no s茅 en que momento lo hice dos veces, al quitarlo ya pude entrar sin problema

Despues de hacer el login no me redirige a Hello, simplemente me pone:
鈥淏ienvenido de nuev鈥
鈥淧lease login in to access this page鈥

Y me aparece de nuevo el login_form

me ayudan por favor? mi codigo es diferente al del profesor porque estoy siguiendo con base de datos sql

@auth.route('/login', methods=['GET', 'POST'])
def login():
    login_form = Form()
    context = {
        'login_form' : login_form
    }
    if login_form.validate_on_submit():
        username = login_form.username.data
        password = login_form.password.data
        user_db = Users.query.filter_by(username=username).first()

        if user_db is not None:
            if password == user_db.password:
                session['id_user'] = user_db.id_user
                session['name'] = user_db.name

                flash('Bienvenido de nuevo!')

                redirect(url_for('hello'))
            else: 
Alguien tiene este error: Traceback (most recent call last): File "C:\Users\rguti\Desktop\Python\flask\main.py", line 5, in \<module> from flask\_login import login\_required, current\_user File "C:\Users\rguti\Desktop\Python\flask\venv\Lib\site-packages\flask\_login\\\_\_init\_\_.py", line 12, in \<module> from .login\_manager import LoginManager File "C:\Users\rguti\Desktop\Python\flask\venv\Lib\site-packages\flask\_login\login\_manager.py", line 33, in \<module> from .utils import \_create\_identifier File "C:\Users\rguti\Desktop\Python\flask\venv\Lib\site-packages\flask\_login\utils.py", line 14, in \<module> from werkzeug.urls import url\_decode ImportError: cannot import name 'url\_decode' from 'werkzeug.urls' (C:\Users\rguti\Desktop\Python\flask\venv\Lib\site-packages\werkzeug\urls.py) No encuentro la soluci贸n

Tuve problemas con la verificaci贸n del user en el login, por lo que busque en la documentaci贸n firebase y encontr茅 otra sintaxis, al momento de escribir esto estoy usando Python 3.10, espero les sirva por si tienen el mismo problema. Este seria el c贸digo a modificar en views en el m茅todo login():

if login_form.validate_on_submit():
        username = login_form.username.data 
        password = login_form.password.data

        user_ref = get_user(username)
        user_doc = user_ref.get()
        if user_doc.exists:
            password_from_db = user_doc.to_dict()['password']
            
#el resto es igual
'Flask' object has no attribute 'login_manager'```

interesante馃槄

Dentro del modelo de usuario que creamos, el que usamos con el decorador @login_manager.user_loader para cargar el current_user, podemos guardar atributos y metodos para ser usados solamente cuando tenemos un usuario logueado correctamente.

Tuve muchos errores con import c铆clicos de Python. Al fina lo solucion茅 inicializando mi base de datos en mi archivo db_service desde el init del m贸dulo. As铆 no requer铆a que se iniciara antes.