[PYTHON] Erstellen einer Webanwendung mit Flask ④

Neue Registrierungsfunktion erstellen

Dieses Mal werden wir eine neue Benutzerregistrierungsfunktion hinzufügen.

Benutzermodelldefinition

Erstellen Sie ein Modell für den Benutzer, so wie Sie das letzte Mal ein Überprüfungsmodell erstellt haben.

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)

Passwortschutz

Es ist aus Sicherheitsgründen nicht sinnvoll, das Kennwort so zu speichern, wie es sich in der Datenbank befindet. Verschlüsseln Sie das Kennwort und speichern Sie es in der Datenbank. bcrypt Generieren Sie in ** users.py ** ein Salt mit self.salt = bcrypt.gensalt (). Decode () Die Sicherheit wird erhöht, indem das Hash-Passwort mit dem generierten Salt mit "self.password = bcrypt.hashpw (password.encode (), self.salt.encode ()). Decode ()" kombiniert wird. Ich werde.

Modelländerungen überprüfen

Fügen Sie models / reviews.py einen Prozess hinzu, um festzustellen, welcher Benutzer den Artikel geschrieben hat.

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)

Empfangen Sie das vom Benutzermodell generierte ID-Attribut als externen Schlüssel mit "user_id = db.Column (db.Integer, db.ForeignKey (" users.id "))" und "user = db.relationship" ("User", Foreign_keys). = user_id) `wird verarbeitet, damit das Review-Modell mit einem externen Schlüssel bedient werden kann.

Der Navigationsleiste wurde ein neuer Beitragslink hinzugefügt

Bearbeiten Sie theme.html und fügen Sie in der Navigationsleiste einen Link "Anmelden" für die neue Registrierung hinzu.

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

Neues Registrierungsformular erstellen

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">Nutzername</label>
      <input placeholder="username" type="text" name=username>
    </div>
    <div>
      <label for="Password">Passwort</label>
      <input placeholder="password" type="password" name=password>
    </div>
      <input type="submit" class="button" value="Anmelden">
  </form>
</div>
{% endblock %}
{% block footer %}
  <footer>
      <div class="wrapper">
          <p><small>&copy; Coffee House</small></p>
      </div>
  </footer>
{% endblock %}

Benutzerdaten speichern

Damit ist die Erstellung des neuen Registrierungsformulars abgeschlossen. Erstellen Sie als Nächstes eine Funktion zum Speichern der registrierten Benutzerdaten in der Datenbank mithilfe der zuvor erstellten Modellinstanz.

Erstellen Sie add_user

In users / new.html lautet das Post-Ziel des Formulars action =" {{url_for ('user.add_user')}} ". Erstellen Sie ** user.add_user ** und fügen Sie einen Prozess hinzu, um den veröffentlichten Inhalt zu empfangen und in der Datenbank zu speichern. Fügen Sie ** add_user ** zu views / users.py hinzu.

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('Die Registrierung neuer Benutzer ist abgeschlossen. Bitte loggen Sie sich ein.')
    return redirect(url_for('loging.login'))

Verwenden Sie das Benutzermodell, um eine Modellinstanz für den an Sie gesendeten Benutzernamen und das Kennwort zu erstellen und in Ihrer Datenbank zu speichern. Schauen wir uns nun das Gesamtbild von views / users.py an.

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('Die Registrierung neuer Benutzer ist abgeschlossen. Bitte loggen Sie sich ein.')
    return redirect(url_for('loging.login'))


@user.route('/users/new', methods=['GET'])
def new_user():
    return render_template('users/new.html', id='user')

Änderungen an 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('Der Benutzername ist unterschiedlich')
            return render_template('login.html')
        if request.form['username'] != user.username:
            flash('Der Benutzername ist unterschiedlich')
        elif bcrypt.hashpw(request.form['password'].encode(), user.salt.encode()).decode() != user.password:
            flash('Das Passwort ist anders')
        else:
            session['logged_in'] = True
            session['user_id'] = user.id
            flash('Sie sind jetzt angemeldet')
            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('abgemeldet')
    return redirect(url_for('review.show_reviews'))

@loging.app_errorhandler(404)
def non_existant_route(error):
    return redirect(url_for('loging.login'))

Aufbereitet, damit Sie sich mit den vom Benutzermodell gesendeten Benutzerdaten anmelden können.

Änderungen an cafe_site / __ init__.py

Nehmen Sie abschließend Änderungen an cafe_site / __ init__.py vor.

python:./cafe_site/__init__.py


from cafe_site.views.users import user
app.register_blueprint(user)

Die Webanwendung ist jetzt vollständig.

Beim nächsten Mal werde ich erklären, wie die Webanwendung, die dieses Mal in der Cloud erstellt wurde, mit Heroku gestartet wird.

Recommended Posts

Erstellen einer Webanwendung mit Flask ②
Erstellen einer Webanwendung mit Flask ①
Erstellen einer Webanwendung mit Flask ③
Erstellen einer Webanwendung mit Flask ④
Erstellen einer Web-App für die Sprachtranskription
Erstellen einer Datenanalyseanwendung mit Streamlit
Erstellen einer interaktiven Anwendung mithilfe eines Themenmodells
[GCP] Verfahren zum Erstellen einer Webanwendung mit Cloud-Funktionen (Python + Flask)
Ich möchte eine Webanwendung mit React und Python Flask erstellen
WEB-Anwendungsentwicklung mit Django-Entwicklung Teil 1-
Entwicklung von Webanwendungen mit Flask
Webanwendung mit Python + Flask ② ③
Webanwendung mit Python + Flask ④
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Entwicklung einer WEB-Anwendung mit Django [Django-Start]
Entwicklung einer WEB-Anwendung mit Django [Anwendungszusatz]
Erstellen eines Flask-Servers mit Docker
Erstellen Sie eine Webanwendung mit Django
Erstellen eines Lernmodells mit MNIST
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 1 erstellen
Webanwendung mit Python + Flask (unter Verwendung von VScode) # 1 - Aufbau einer virtuellen Umgebung-
Erstellen Sie mit Chalice eine flaschen- / flaschenähnliche Webanwendung auf AWS Lambda
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 3 erstellen
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 4 erstellen
Entwicklung einer WEB-Anwendung mit Django [Modelldefinition]
Entwicklung der WEB-Anwendung mit Django [Grundeinstellung]
WEB-Anwendungsentwicklung mit Django-Development Environment Construction-
Anzeigen von Matplotlib-Diagrammen in einer Webanwendung
Eindrücke von der Verwendung von Flask für einen Monat
Entwicklung einer WEB-Anwendung mit Django [Request Processing]
Entwicklung einer WEB-Anwendung mit Django [Zusätzliche Vorlage]
[Python] Eine schnelle Webanwendung mit Bottle!
Erstellen Sie eine einfache Web-App mit Flasche
Führen Sie eine Python-Webanwendung mit Docker aus
Erstellen Sie einen Webdienst mit Docker + Flask
Ich habe versucht, das Webanwendungs-Framework zu vergleichen
Ich habe eine WEB-Bewerbung bei Django gemacht
Erstellen Sie mit pyenv unter Ubuntu 12.04 schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Einstellungen der Kolbenanwendung
Starten Sie einen Webserver mit Bottle and Flask (ich habe auch versucht, Apache zu verwenden)
Implementieren Sie eine einfache Anwendung mit Python Full Scratch ohne Verwendung eines Webframeworks.
[Python] Teilen Sie eine große Flask-Datei mit Blueprint
Erstellen Sie eine Webmap mit Python und GDAL
Schritte zum Entwickeln einer Webanwendung in Python
Wovon ich beim Erstellen von Webanwendungen in einer Windows-Umgebung abhängig war
Lassen Sie uns mit Flask eine Webanwendung zur Konvertierung von A nach B erstellen! Von Grund auf neu ...
Anfänger haben versucht, eine Cloud-native Webanwendung mit Datastore / GAE zu erstellen
Erstellen Sie eine Web-App, die PDF mit Flask und PyPDF2 in Text konvertiert
Versuchen Sie, eine Webanwendung mit Vue.js und Django (Mac Edition) zu erstellen - (1) Umgebungskonstruktion, Anwendungserstellung
Erstellen Sie mit venv unter Ubuntu 14.04 LTS schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Der Tag, an dem ein Anfänger, der zweieinhalb Monate mit dem Programmieren begann, eine Webanwendung mit Flask erstellte
Veröffentlichung eines Webdienstes zum Bewerten handgeschriebener Zeichen mit DeepLearning
Versuchen Sie, eine komprimierte Datei mit Python und zlib zu erstellen
4. Erstellen eines strukturierten Programms