Cette fois, nous ajouterons une nouvelle fonction d'enregistrement des utilisateurs.
Créez un modèle pour l'utilisateur, comme vous avez créé un modèle de révision la dernière fois.
python:./cafesite/models/users.py
from cafe_site import db
from datetime import datetime
import bcrypt
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50))
password = db.Column(db.String(50))
salt = db.Column(db.String(50))
created_at = db.Column(db.DateTime)
def __init__(self, username=None, password=None):
self.username = username
self.salt = bcrypt.gensalt().decode()
self.password = bcrypt.hashpw(password.encode(), self.salt.encode()).decode()
self.created_at = datetime.utcnow()
def __repr__(self):
return '<Entry id:{} username:{}>'.format(self.id, self.username)
Il n'est pas bon d'enregistrer le mot de passe tel qu'il est dans la base de données du point de vue de la sécurité, donc cryptez le mot de passe et enregistrez-le dans la base de données.
bcrypt
** users.py ** génère du sel avec self.salt = bcrypt.gensalt (). Decode ()
La sécurité est améliorée en combinant le mot de passe haché avec le sel généré avec self.password = bcrypt.hashpw (password.encode (), self.salt.encode ()). Decode ()
. Je vais.
Ajoutez un processus à models / reviews.py pour déterminer quel utilisateur a écrit l'article.
python:./cafesite/models/reviews.py
from cafe_site import db
from datetime import datetime
class Review(db.Model):
from cafe_site.models.users import User
__tablename__ = 'Reviews'
id = db.Column(db.Integer, primary_key=True)
star = db.Column(db.Integer)
title = db.Column(db.String(50), unique=True)
text = db.Column(db.Text)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
user = db.relationship('User', foreign_keys=user_id)
created_at = db.Column(db.DateTime)
def __init__(self, star=None, title=None, text=None, user_id=None):
self.star = star
self.title = title
self.text = text
self.user_id = user_id
self.created_at = datetime.utcnow()
def __repr__(self):
return '<Review id:{} star:{} title:{} text:{} user_id:{}>'.format(self.id, self.star, self.title, self.text, self.user_id)
Recevez l'attribut id généré par le modèle User en tant que clé externe avec ʻuser_id = db.Column (db.Integer, db.ForeignKey ('users.id')) `et ʻuser = db.relationship ('User', Foreign_keys) = user_id) ʻest traité de manière à ce que le modèle Review puisse être utilisé à l'aide d'une clé externe.
Modifiez theme.html et ajoutez un lien «Inscription» pour une nouvelle inscription dans la barre de navigation.
html:./cafe_site/templates/theme.html
<ul class="main-nav">
{% if not session.logged_in %}
<li><a href="{{ url_for('user.new_user') }}">Signup</a></li>
{% else %}
{% endif %}
</ul>
python:./cafesite/views/users.py
@user.route('/users/new', methods=['GET'])
def new_user():
return render_template('users/new.html', id='user')
html:./cafe_site/templates/users/new.html
{% extends "theme.html" %}
{% block title %}Coffee House{% endblock %}
{% block head %}
{{ super() }}
{% endblock %}
{% block content %}
<div class="wrapper">
<h2 class="page-title">Signup</h2>
</div>
<div class="login-content wrapper">
<form action="{{ url_for('user.add_user') }}" method=post>
<div>
<label for="name">Nom d'utilisateur</label>
<input placeholder="username" type="text" name=username>
</div>
<div>
<label for="Password">mot de passe</label>
<input placeholder="password" type="password" name=password>
</div>
<input type="submit" class="button" value="s'inscrire">
</form>
</div>
{% endblock %}
{% block footer %}
<footer>
<div class="wrapper">
<p><small>© Coffee House</small></p>
</div>
</footer>
{% endblock %}
Ceci termine la création du nouveau formulaire d'inscription. Ensuite, créez une fonction pour enregistrer les données utilisateur enregistrées dans la base de données à l'aide de l'instance de modèle créée précédemment.
Dans users / new.html, la destination de publication du formulaire est ʻAction = "{{url_for ('user.add_user')}}" `. Créez ** user.add_user ** et ajoutez un processus pour recevoir le contenu publié et l'enregistrer dans la base de données. Ajoutez ** add_user ** à views / users.py.
python:./cafesite/views/users.py
@user.route('/users', methods=['POST'])
def add_user():
user = User(
username=request.form['username'],
password=request.form['password']
)
db.session.add(user)
db.session.commit()
flash('L'enregistrement d'un nouvel utilisateur est terminé. Veuillez vous connecter.')
return redirect(url_for('loging.login'))
Utilisez le modèle User pour créer une instance de modèle pour le nom d'utilisateur et le mot de passe qui vous ont été envoyés et le stocker dans votre base de données. Jetons maintenant un œil à la vue d'ensemble de views / users.py.
python:./cafesite/views/users.py
from flask import request, redirect, url_for, render_template, flash, session
from cafe_site import app
from cafe_site import db
from cafe_site.models.users import User
from cafe_site.views.loging import login_required
from flask import Blueprint
user = Blueprint('user', __name__)
@user.route('/users', methods=['POST'])
def add_user():
user = User(
username=request.form['username'],
password=request.form['password']
)
db.session.add(user)
db.session.commit()
flash('L'enregistrement d'un nouvel utilisateur est terminé. Veuillez vous connecter.')
return redirect(url_for('loging.login'))
@user.route('/users/new', methods=['GET'])
def new_user():
return render_template('users/new.html', id='user')
python:./cafesite/views/loging.py
from flask import request, redirect, url_for, render_template, flash, session
from cafe_site import app
from functools import wraps
from cafe_site.models.users import User
import bcrypt
from flask import Blueprint
loging = Blueprint('loging', __name__)
def login_required(loging):
@wraps(loging)
def inner(*args, **kwargs):
if not session.get('logged_in'):
return redirect(url_for('loging.login'))
return loging(*args, **kwargs)
return inner
@loging.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
try:
user = User.query.filter_by(username=request.form['username']).first()
except:
flash('Le nom d'utilisateur est différent')
return render_template('login.html')
if request.form['username'] != user.username:
flash('Le nom d'utilisateur est différent')
elif bcrypt.hashpw(request.form['password'].encode(), user.salt.encode()).decode() != user.password:
flash('Le mot de passe est différent')
else:
session['logged_in'] = True
session['user_id'] = user.id
flash('Vous êtes maintenant connecté')
return redirect(url_for('review.show_reviews'))
return render_template('login.html', id="login")
@loging.route('/logout')
def logout():
session.pop('logged_in', None)
flash('déconnecté')
return redirect(url_for('review.show_reviews'))
@loging.app_errorhandler(404)
def non_existant_route(error):
return redirect(url_for('loging.login'))
Retraité afin que vous puissiez vous connecter avec les données utilisateur envoyées à partir du modèle utilisateur.
Enfin, apportez des modifications à cafe_site / __ init__.py.
python:./cafe_site/__init__.py
from cafe_site.views.users import user
app.register_blueprint(user)
L'application Web est maintenant terminée.
La prochaine fois, j'expliquerai comment lancer l'application web créée cette fois sur le cloud en utilisant heroku.
Recommended Posts