Dieses Mal werden wir eine neue Benutzerregistrierungsfunktion hinzufügen.
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)
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.
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.
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')
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>© Coffee House</small></p>
</div>
</footer>
{% endblock %}
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.
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')
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.
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