Créer une application Web avec Flask ④

Créer une nouvelle fonction d'enregistrement

Cette fois, nous ajouterons une nouvelle fonction d'enregistrement des utilisateurs.

Définition du modèle utilisateur

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)

Mot de passe de protection

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.

Examiner les changements de modèle

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.

Ajout d'un nouveau lien de publication dans la barre de navigation

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

Créer un nouveau formulaire d'inscription

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>&copy; Coffee House</small></p>
      </div>
  </footer>
{% endblock %}

Sauvegarde des données utilisateur

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.

Créer add_user

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

Modifications apportées à views / logging.py

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.

Modifications apportées à cafe_site / __ init__.py

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

Créer une application Web avec Flask ②
Créer une application Web avec Flask ①
Créer une application Web avec Flask ③
Créer une application Web avec Flask ④
Créer une application Web pour la transcription vocale
Création d'une application d'analyse de données à l'aide de Streamlit
Création d'une application interactive à l'aide d'un modèle de rubrique
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
Je souhaite créer une application Web en utilisant React et Python flask
Développement d'applications WEB à l'aide de django-development partie 1-
Développement d'applications Web avec Flask
Application Web avec Python + Flask ② ③
Application Web avec Python + Flask ④
(Python) Essayez de développer une application Web en utilisant Django
Développement d'une application WEB avec Django [Django startup]
Développement d'une application WEB avec Django [Ajout d'application]
Créer un serveur Flask avec Docker
Créer une application Web avec Django
Créer un modèle d'apprentissage à l'aide de MNIST
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 1
Application Web réalisée avec Python + Flask (en utilisant VScode) # 1-Construction d'environnement virtuel-
Créer une application Web de type Flask / Bottle sur AWS Lambda avec Chalice
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 3
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 4
Développement d'une application WEB avec Django [Définition de modèle]
Développement d'une application WEB avec Django [Paramètre initial]
Développement d'applications WEB à l'aide de django-Construction d'environnement de développement-
Afficher les diagrammes matplotlib dans une application Web
Impressions d'utilisation de Flask pendant un mois
Développement d'une application WEB avec Django [Traitement des requêtes]
Développement d'une application WEB avec Django [modèle supplémentaire]
[Python] Une application web rapide avec Bottle!
Créez une application Web simple avec Flask
Exécutez une application Web Python avec Docker
Créer un service Web avec Docker + Flask
J'ai essayé de comparer le cadre d'application Web
J'ai fait une application WEB avec Django
Créez rapidement un environnement d'exécution d'application Web Python3.4 + Nginx + uWSGI + Flask en utilisant pyenv sur Ubuntu 12.04
Paramètres de l'application Flask
Démarrez un serveur Web en utilisant Bottle et Flask (j'ai également essayé d'utiliser Apache)
Implémentez une application simple avec Python full scratch sans utiliser de framework web.
[Python] Fractionner un gros fichier Flask en utilisant Blueprint
Créer une carte Web en utilisant Python et GDAL
Étapes pour développer une application Web en Python
Ce à quoi j'étais accro lors de la création d'applications Web dans un environnement Windows
Créons une application Web de conversion A vers B avec Flask! De zéro ...
Les débutants ont essayé de créer une application Web native pour le cloud à l'aide de Datastore / GAE
Créez une application Web qui convertit le PDF en texte à l'aide de Flask et PyPDF2
Essayez de créer une application Web avec Vue.js et Django (édition Mac) - (1) Construction d'environnement, création d'application
Créez rapidement un environnement d'exécution d'application Web Python3.4 + Nginx + uWSGI + Flask en utilisant venv sur Ubuntu 14.04 LTS
Le jour où un débutant qui a commencé à programmer pendant deux mois et demi a créé une application web avec Flask
Lancement d'un service Web pour noter les caractères manuscrits à l'aide de DeepLearning
Essayez de créer un fichier compressé en utilisant Python et zlib
4. Création d'un programme structuré