In diesem Abschnitt werden die anwendungsbezogenen Einstellungen von Flask beschrieben.
Hier wird als Beispiel die Benutzerauthentifizierungsfunktion als Beispiel beschrieben.
auth.py
import functools
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from werkzeug.security import check_password_hash, generate_password_hash
from todo.db import get_db
bp = Blueprint('auth', __name__, url_prefix='/auth')
@bp.route('/signup', methods=('GET', 'POST'))
def signup():
error = {}
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
password_re = request.form['password-re']
db = get_db()
if not username:
error['username'] = 'Bitte geben Sie Ihren Benutzernamen ein.'
if not password:
error['password'] = 'Bitte geben Sie Ihr Passwort ein.'
if not password_re:
error['password_re'] = 'Bitte geben Sie das Passwort ein (zur Bestätigung).'
if username and password and password_re:
if password == password_re:
registered_user = db.execute(
'SELECT id FROM user WHERE username=?', (username,)
).fetchone()
if registered_user is not None:
error['username'] = 'Der Benutzername ist bereits registriert.'
else:
error['password_re'] = 'Die Passwörter stimmen nicht überein.'
if error == {}:
db.execute(
'INSERT INTO user (username, password) VALUES (?, ?)',
(username, generate_password_hash(password))
)
db.commit()
return redirect(url_for('auth.login'))
return render_template(
'auth/form.html',
type='signup',
error=error
)
@bp.route('/login', methods=('GET', 'POST'))
def login():
error = None
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
user = db.execute(
'SELECT * FROM user WHERE username = ?', (username,)
).fetchone()
if user is None or not check_password_hash(user['password'], password):
error = 'Der Benutzername oder das Passwort ist falsch.'
if error is None:
session.clear()
session['user_id'] = user['id']
return redirect(url_for('index'))
return render_template(
'auth/form.html',
type='login',
error=error
)
@bp.before_app_request
def load_logged_in_user():
user_id = session.get('user_id')
if user_id is None:
g.user = None
else:
g.user = get_db().execute(
'SELECT * FROM user WHERE id = ?', (user_id,)
).fetchone()
@bp.route('/logout')
def logout():
session.clear()
return redirect(url_for('auth.login'))
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.user is None:
return redirect(url_for('auth.login'))
return view(**kwargs)
return wrapped_view
Hier haben wir die Grundlagen zum Einrichten von Kolbenanwendungen erläutert. Nächstes Mal werde ich HTML-Vorlagen behandeln.
Recommended Posts