En esta unidad vamos a estudiar como un usuario se puede registrar en nuestra aplicación, y una vez registrado podrá cambiar los datos de su perfil. En realidad lo que estamos haciendo es creando y modificando registros en la tabla de usuarios.
En la plantilla base.html
hemos introducido un enlace para el registro de nuevos usuarios (si no hay un usuario logueado) y para acceder al perfil (si el usuario está logueado):
{% if session["id"] %}
<a class="navbar-brand " href="/perfil/{{ session["username"]}}"> Perfil</a>
<a class="navbar-brand " href="/logout"> {{ session["username"]}} (Salir)</a>
{% else %}
<a class="navbar-brand " href="/login">Login</a>
<a class="navbar-brand " href="/registro">Registro</a>
{% endif %}
En el programa principal hemos creado una ruta registro
que nos permite mostrar el formulario de registro, si los datos introducidos son válidos (el usuario indicado no existe en la base de datos) se crea un nuevo usuario:
@app.route("/registro",methods=["get","post"])
def registro():
form=formUsuario()
if form.validate_on_submit():
existe_usuario=Usuarios.query.filter_by(username=form.username.data).first()
if existe_usuario==None:
user=Usuarios()
form.populate_obj(user)
user.admin=False
db.session.add(user)
db.session.commit()
return redirect(url_for("inicio"))
form.username.errors.append("Nombre de usuario ya existe.")
return render_template("usuarios_new.html",form=form)
El formulario utilizado para crear el nuevo usuario se llama formUsuario
y lo puedes ver en el fichero forms.py
.
El usuario puede modificar sus datos accediendo a la ruta perfil
. Utilizamos el mismo formulario formUsuario
, pero la plantilla que lo visualiza (usuarios_new.html
) muestra elementos diferentes según sea el registro o el perfil:
-
Si estamos registrando un nuevo usuario muestra un cuadro de texto para introducir el nombre de usuario, si estamos en el perfil muestra el mismo cuadro de texto pero en modo sólo lectura, para simplificar el proceso:
{% if not perfil %} {{form.username.label() }}{{form.username(size="100",class="form-control")}}<br/> {% else %} {{form.username.label() }}{{form.username(readonly="readonly",size="100",class="form-control")}}<br/> {% endif %}
-
Si estamos registrando un nuevo usuario muestra un cuadro de texto para introducir la contraseña, si estamos en el perfil muestra un enlace para cambiar la contraseña:
{% if not perfil %} {{form.password.label() }}{{form.password(size="100",class="form-control")}}<br/> {% else %} <a href="/changepassword/{{session["username"]}}">Cambiar contraseña</a><br/> {% endif %}
La ruta perfil
muetra el formulario y cambia los datos que modifiquemos, menos la contraseña:
@app.route('/perfil/<username>', methods=["get","post"])
def perfil(username):
user=Usuarios.query.filter_by(username=username).first()
if user is None:
abort(404)
form=formUsuario(request.form,obj=user)
del form.password
if form.validate_on_submit():
form.populate_obj(user)
db.session.commit()
return redirect(url_for("inicio"))
return render_template("usuarios_new.html",form=form,perfil=True)
Un usuario registrado también puede cambiar su contraseña, pero lo hemos realizado en una plantilla independiente (changepassword.html
) y un formulario formChangePassword
. Para realizar el cambio de contraseña hemos creado la ruta changepassword
:
@app.route('/changepassword/<username>', methods=["get","post"])
def changepassword(username):
user=Usuarios.query.filter_by(username=username).first()
if user is None:
abort(404)
form=formChangePassword()
if form.validate_on_submit():
form.populate_obj(user)
db.session.commit()
return redirect(url_for("inicio"))
return render_template("changepassword.html",form=form)