序章

ユーザーがアプリにログインできるようにすることは、Webアプリケーションに追加する最も一般的な機能の1つです。 Flask-Login パッケージを使用して、Flaskアプリに認証を追加できます。

このチュートリアルでは、次のことを行います。

  • セッション管理にFlask-Loginライブラリを使用する
  • パスワードのハッシュには、組み込みのFlaskユーティリティを使用します
  • ログインしたユーザーのみの保護されたページをアプリに追加します
  • Flask-SQLAlchemyを使用して User モデル
  • ユーザーがアカウントを作成してログインするためのサインアップおよびログインフォームを作成します
  • 何か問題が発生したときにエラーメッセージをフラッシュしてユーザーに返す
  • ユーザーのアカウントからの情報を使用して、プロファイルページに表示します

サインアップとログインページを作成して、ユーザーがログインして保護されたページにアクセスできるようにします。 からの情報を使用します User プロファイルがどのように見えるかをシミュレートするために、ユーザーがログインしたときにモデル化して保護されたページに表示します。

注:このチュートリアルは範囲が限定されており、セッションの高度な永続化については説明していません。 さらに、主キーのデータ型を変更したり、別のデータベースシステムに移行する際の考慮事項も、この入門チュートリアルの範囲外です。

このプロジェクトのソースコードはGitHubで入手できます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

チュートリアルを完了すると、プロジェクトのファイル構造がどのようになるかを示す図を次に示します。

.
└── flask_auth_app
    └── project
        ├── __init__.py       # setup the app
        ├── auth.py           # the auth routes for the app
        ├── db.sqlite         # the database
        ├── main.py           # the non-auth routes for the app
        ├── models.py         # the user model
        └── templates
            ├── base.html     # contains common layout and links
            ├── index.html    # show the home page
            ├── login.html    # show the login form
            ├── profile.html  # show the profile page
            └── signup.html   # show the signup form

チュートリアルを進めるにつれて、これらのディレクトリとファイルを作成します。

このチュートリアルはで検証されました sqlite3 v3.36.0、 python v3.9.8、 flask v2.0.2、 flask-login v0.5.0、および flask-sqlachemy v2.5.1。

ステップ1—パッケージのインストール

プロジェクトに必要な3つの主要なパッケージがあります。

  • フラスコ
  • Flask-ログイン:認証後にユーザーセッションを処理します
  • Flask-SQLAlchemy:ユーザーモデルとデータベースとのインターフェースを表す

データベースに余分な依存関係をインストールする必要がないように、SQLiteを使用します。

まず、プロジェクトディレクトリの作成から始めます。

  1. mkdir flask_auth_app

次に、プロジェクトディレクトリに移動します。

  1. cd flask_auth_app

Python環境がない場合は、Python環境を作成することをお勧めします。

注:設定については、ローカル環境に関連するチュートリアルを参照してください。 venv.

Pythonがマシンにどのようにインストールされたかに応じて、コマンドは次のようになります。

  1. python3 -m venv auth

The -m フラグは module-name. このコマンドはモジュールを実行します venv 名前の付いた新しい仮想環境を作成するには auth. これにより、を含む新しいディレクトリが作成されます bin, include、 と lib サブディレクトリ。 そして、 pyvenv.cfg ファイル。

次に、次のコマンドを実行します。

  1. source auth/bin/activate

このコマンドは、仮想環境をアクティブにします。

仮想環境から次のコマンドを実行して、必要なパッケージをインストールします。

  1. pip install flask flask-sqlalchemy flask-login

パッケージをインストールしたので、メインのアプリファイルを作成する準備が整いました。

ステップ2—メインアプリファイルを作成する

作成することから始めましょう project ディレクトリ:

  1. mkdir project

最初のファイルは __init__.py プロジェクトのファイル:

  1. nano project/__init__.py

このアプリは、青写真付きのFlaskアプリファクトリパターンを使用します。 1つのブループリントは、インデックスと保護されたプロファイルページを含む通常のルートを処理します。 別の青写真は、認証関連のすべてを処理します。 実際のアプリでは、機能を好きなように分解できますが、ここで説明するソリューションは、このチュートリアルでうまく機能します。

このファイルには、データベースを初期化してブループリントを登録するアプリを作成する機能があります。 現時点では、これはあまり効果がありませんが、アプリの残りの部分で必要になります。

SQLAlchemyを初期化し、いくつかの構成値を設定し、ブループリントをここに登録する必要があります。

プロジェクト/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# init SQLAlchemy so we can use it later in our models
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    app.config['SECRET_KEY'] = 'secret-key-goes-here'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'

    db.init_app(app)

    # blueprint for auth routes in our app
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    # blueprint for non-auth parts of app
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

メインのアプリファイルができたので、ルートの追加を開始します。

ステップ3—ルートを追加する

ルートには、2つの設計図を使用します。

のために main_blueprint、ホームページがあります(/)とプロフィールページ(/profile).

まず、作成します main.py:

  1. nano project/main.py

次に、 main_blueprint:

project / main.py
from flask import Blueprint
from . import db

main = Blueprint('main', __name__)

@main.route('/')
def index():
    return 'Index'

@main.route('/profile')
def profile():
    return 'Profile'

のために auth_blueprint、両方のログインページを取得するためのルートがあります(/login)およびサインアップページ(/signup). 最後に、ログアウトルートがあります(/logout)アクティブユーザーをログアウトします。

次に、作成します auth.py:

  1. nano project/auth.py

次に、 auth_blueprint:

project / auth.py
from flask import Blueprint
from . import db

auth = Blueprint('auth', __name__)

@auth.route('/login')
def login():
    return 'Login'

@auth.route('/signup')
def signup():
    return 'Signup'

@auth.route('/logout')
def logout():
    return 'Logout'

とりあえず、定義する login, signup、 と logout テキストを返します。 からのPOSTリクエストを処理するためのルートもあります loginsignup. 後でこのコードに再度アクセスして、必要な機能で更新します。

ターミナルでは、 FLASK_APPFLASK_DEBUG 値:

  1. export FLASK_APP=project
  2. export FLASK_DEBUG=1

The FLASK_APP 環境変数は、アプリのロード方法をFlaskに指示します。 あなたはこれがどこを指すようにしたいでしょう create_app 位置しています。 このチュートリアルでは、 project ディレクトリ。

The FLASK_DEBUG 環境変数は、に設定することで有効になります 1. これにより、ブラウザにアプリケーションエラーを表示するデバッガが有効になります。

あなたがにいることを確認してください flask_auth_app ディレクトリを作成してから、プロジェクトを実行します。

  1. flask run

これで、Webブラウザーで、5つの可能なURLに移動して、で定義された返されるテキストを確認できます。 auth.pymain.py.

たとえば、 localhost:5000/profile 表示: Profile:

ルートが期待どおりに動作していることを確認したら、テンプレートを作成できます。

ステップ4—テンプレートの作成

次に、アプリで使用するテンプレートを作成します。 これは、実際のログイン機能を実装する前の最初のステップです。

アプリは4つのテンプレートを使用します。

  • index.html
  • profile.html
  • login.html
  • signup.html

また、各ページに共通のコードを持つ基本テンプレートもあります。 この場合、基本テンプレートにはナビゲーションリンクとページの一般的なレイアウトが含まれます。

まず、作成します templates 下のディレクトリ project ディレクトリ:

  1. mkdir -p project/templates

次に作成します base.html:

  1. nano project/templates/base.html

次に、次のコードをに追加します base.html ファイル:

project/templates/base.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Flask Auth Example</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css" />
</head>

<body>
    <section class="hero is-primary is-fullheight">

        <div class="hero-head">
            <nav class="navbar">
                <div class="container">
                    <div id="navbarMenuHeroA" class="navbar-menu">
                        <div class="navbar-end">
                            <a href="{{ url_for('main.index') }}" class="navbar-item">
                                Home
                            </a>
                            <a href="{{ url_for('main.profile') }}" class="navbar-item">
                                Profile
                            </a>
                            <a href="{{ url_for('auth.login') }}" class="navbar-item">
                                Login
                            </a>
                            <a href="{{ url_for('auth.signup') }}" class="navbar-item">
                                Sign Up
                            </a>
                            <a href="{{ url_for('auth.logout') }}" class="navbar-item">
                                Logout
                            </a>
                        </div>
                    </div>
                </div>
            </nav>
        </div>

        <div class="hero-body">
            <div class="container has-text-centered">
               {% block content %}
               {% endblock %}
            </div>
        </div>
    </section>
</body>

</html>

このコードは、アプリケーションの各ページへの一連のメニューリンクを作成します。 また、ブロックを確立します content 子テンプレートで上書きできます。

注:このチュートリアルでは、ブルマを使用してスタイリングとレイアウトを処理します。 Bulmaの詳細については、公式のBulmaドキュメントを読むことを検討してください。

次に、作成します templates/index.html:

  1. nano project/templates/index.html

新しく作成したファイルに次のコードを追加して、ページにコンテンツを追加します。

project/templates/index.html
{% extends "base.html" %}

{% block content %}
<h1 class="title">
  Flask Login Example
</h1>
<h2 class="subtitle">
  Easy authentication and authorization in Flask.
</h2>
{% endblock %}

このコードは、タイトルとサブタイトルを持つ基本的なインデックスページを作成します。

次に、作成します templates/login.html:

  1. nano project/templates/login.html

このコードは、EmailおよびPasswordのフィールドを持つログインページを生成します。 ログインしたセッションを「記憶」するためのチェックボックスもあります。

project/templates/login.html
{% extends "base.html" %}

{% block content %}
<div class="column is-4 is-offset-4">
    <h3 class="title">Login</h3>
    <div class="box">
        <form method="POST" action="/login">
            <div class="field">
                <div class="control">
                    <input class="input is-large" type="email" name="email" placeholder="Your Email" autofocus="">
                </div>
            </div>

            <div class="field">
                <div class="control">
                    <input class="input is-large" type="password" name="password" placeholder="Your Password">
                </div>
            </div>
            <div class="field">
                <label class="checkbox">
                    <input type="checkbox" name="remember">
                    Remember me
                </label>
            </div>
            <button class="button is-block is-info is-large is-fullwidth">Login</button>
        </form>
    </div>
</div>
{% endblock %}

次に、作成します templates/signup.html:

  1. nano project/templates/signup.html

次のコードを追加して、次のフィールドを含むサインアップページを作成します email, name、 と password:

project/templates/signup.html
{% extends "base.html" %}

{% block content %}
<div class="column is-4 is-offset-4">
    <h3 class="title">Sign Up</h3>
    <div class="box">
        <form method="POST" action="/signup">
            <div class="field">
                <div class="control">
                    <input class="input is-large" type="email" name="email" placeholder="Email" autofocus="">
                </div>
            </div>

            <div class="field">
                <div class="control">
                    <input class="input is-large" type="text" name="name" placeholder="Name" autofocus="">
                </div>
            </div>

            <div class="field">
                <div class="control">
                    <input class="input is-large" type="password" name="password" placeholder="Password">
                </div>
            </div>

            <button class="button is-block is-info is-large is-fullwidth">Sign Up</button>
        </form>
    </div>
</div>
{% endblock %}

次に、作成します templates/profile.html:

  1. nano project/templates/profile.html

このコードを追加して、Anthonyを歓迎するようにハードコードされたタイトルのページを作成します。

project/templates/profile.html
{% extends "base.html" %}

{% block content %}
<h1 class="title">
  Welcome, Anthony!
</h1>
{% endblock %}

後でこのコードに再度アクセスして、ユーザーに動的に挨拶します。

テンプレートを追加したら、各ルートのreturnステートメントを更新して、テキストの代わりにテンプレートを返すことができます。

次に、更新します main.py のインポート行とルートを変更する indexprofile:

project / main.py
from flask import Blueprint, render_template
...
@main.route('/')
def index():
    return render_template('index.html')

@main.route('/profile')
def profile():
    return render_template('profile.html')

今、あなたは更新します auth.py のインポートラインとルートを変更する loginsignup:

project / auth.py
from flask import Blueprint, render_template
...
@auth.route('/login')
def login():
    return render_template('login.html')

@auth.route('/signup')
def signup():
    return render_template('signup.html')

これらの変更を行った後、次の場所に移動すると、サインアップページは次のようになります。 /signup:

次のページに移動できます /, /login、 と /profile 同じように。

離れる /logout 後でテンプレートを表示しないため、今のところ単独で。

ステップ5—ユーザーモデルの作成

ユーザーモデルは、アプリがユーザーを持つことの意味を表します。 このチュートリアルでは、 email 住所、 password、 と name. 将来のアプリケーションでは、ユーザーごとにはるかに多くの情報を保存することを決定する可能性があります。 誕生日、プロフィール写真、場所、または任意のユーザー設定などを追加できます。

Flask-SQLAlchemyで作成されたモデルは、データベース内のテーブルに変換されるクラスによって表されます。 これらのクラスの属性は、これらのテーブルの列に変わります。

を作成します User モデル:

  1. nano project/models.py

を定義する User モデル:

project / models.py
from . import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True) # primary keys are required by SQLAlchemy
    email = db.Column(db.String(100), unique=True)
    password = db.Column(db.String(100))
    name = db.Column(db.String(1000))

このコードは User の列 id, email, password、 と name.

これで、 User モデルの場合、データベースの構成に進むことができます。

ステップ6—データベースの構成

SQLiteデータベースを使用します。 自分でSQLiteデータベースを作成することもできますが、Flask-SQLAlchemyに作成してもらいましょう。 で指定されたデータベースのパスがすでにあります __init__.py したがって、 PythonREPLでデータベースを作成するようにFlask-SQLAlchemyに指示する必要があります。

まだ仮想環境にいて、 flask_auth_app ディレクトリ。

アプリを停止してPythonREPLを開くと、データベースを使用してデータベースを作成できます。 create_all 上のメソッド db 物体:

  1. from project import db, create_app, models
  2. db.create_all(app=create_app()) # pass the create_app result so Flask-SQLAlchemy gets the configuration.

注: Pythonインタープリターを初めて使用する場合は、公式ドキュメントを参照してください。

これで、 db.sqlite プロジェクトディレクトリ内のファイル。 このデータベースには、ユーザーテーブルが含まれます。

ステップ7—認証機能の設定

サインアップ機能では、ユーザーがフォームに送信したデータを取得してデータベースに追加します。 同じ電子メールアドレスを持つユーザーがデータベースにまだ存在していないことを確認する必要があります。 存在しない場合は、データベースに配置する前に、パスワードをハッシュ化する必要があります。

注:パスワードをプレーンテキストで保存することは、セキュリティ対策としては不十分と見なされます。 通常、パスワードを安全に保つために、複雑なハッシュアルゴリズムとソルトが必要になります。

POSTフォームデータを処理するための2番目の関数を追加することから始めましょう。 ユーザーから渡されたデータを収集します。

アップデート auth.py インポート行を変更して実装する signup_post:

project / auth.py
from flask import Blueprint, render_template, redirect, url_for
...
@auth.route('/signup')
def signup():
    return render_template('signup.html')

@auth.route('/signup', methods=['POST'])
def signup_post():
    # code to validate and add user to database goes here
    return redirect(url_for('auth.login'))

関数を作成し、リダイレクトを追加します。 これにより、サインアップが成功し、ログインページに移動するユーザーエクスペリエンスが提供されます。

次に、ユーザーのサインアップに必要な残りのコードを追加しましょう。 リクエストオブジェクトを使用してフォームデータを取得します。

更新を続ける auth.py インポートを追加して実装する signup_post:

auth.py
from flask import Blueprint, render_template, redirect, url_for, request
from werkzeug.security import generate_password_hash, check_password_hash
from .models import User
from . import db
...
@auth.route('/signup', methods=['POST'])
def signup_post():
    # code to validate and add user to database goes here
    email = request.form.get('email')
    name = request.form.get('name')
    password = request.form.get('password')

    user = User.query.filter_by(email=email).first() # if this returns a user, then the email already exists in database

    if user: # if a user is found, we want to redirect back to signup page so user can try again
        return redirect(url_for('auth.signup'))

    # create a new user with the form data. Hash the password so the plaintext version isn't saved.
    new_user = User(email=email, name=name, password=generate_password_hash(password, method='sha256'))

    # add the new user to the database
    db.session.add(new_user)
    db.session.commit()

    return redirect(url_for('auth.login'))

このコードは、同じ電子メールアドレスを持つユーザーがデータベースに存在するかどうかを確認します。

ステップ8—サインアップ方法のテスト

サインアップ方法が完了したので、新しいユーザーを作成できるようになります。 フォームをテストしてユーザーを作成しましょう。

サインアップが成功したかどうかを確認する方法は2つあります。

  • データベースビューアを使用して、テーブルに追加された行を確認できます。
  • または、同じメールアドレスで再度登録してみてください。エラーが発生した場合は、最初のメールが正しく保存されていることがわかります。

メールがすでに存在することをユーザーに知らせ、ログインページに移動するようにユーザーに指示するコードを追加しましょう。 を呼び出すことによって flash 関数を使用すると、次のリクエスト(この場合はリダイレクト)にメッセージを送信できます。 ユーザーがリダイレクトされるページは、テンプレート内のそのメッセージにアクセスできるようになります。

まず、を追加します flash サインアップページにリダイレクトする前に。

project / auth.py
from flask import Blueprint, render_template, redirect, url_for, request, flash
...
@auth.route('/signup', methods=['POST'])
def signup_post():
    ...
    if user: # if a user is found, we want to redirect back to signup page so user can try again
        flash('Email address already exists')
        return redirect(url_for('auth.signup'))

テンプレートでフラッシュされたメッセージを取得するには、フォームの前にこのコードを追加します。

project/templates/signup.html
...
{% with messages = get_flashed_messages() %}
{% if messages %}
    <div class="notification is-danger">
        {{ messages[0] }}. Go to <a href="{{ url_for('auth.login') }}">login page</a>.
    </div>
{% endif %}
{% endwith %}
<form method="POST" action="/signup">

このコードはメッセージを表示します "Email address already exists. Go to login page." 電子メールアドレスがすでにデータベースにある場合。

この時点で、アプリケーションを実行して、既存の電子メールアドレスでサインアップを試みることができます。

ステップ9—ログイン方法の追加

ログイン方法は、サインアップ機能に似ています。 この場合、比較します email データベースにあるかどうかを確認するために入力されたアドレス。 もしそうなら、あなたはテストします password ハッシュによって提供されたユーザー password ユーザーがパスして、ハッシュされたものと比較します password データベース内。 ユーザーが正しい入力をしたことがわかります password 両方がハッシュされたとき passwords一致。

ユーザーがパスワードチェックに合格すると、ユーザーが正しい資格情報を持っていることがわかり、Flask-Loginを使用してログインできます。 電話で login_user、Flask-ログインは、ユーザーがログインしたままでいる間持続するそのユーザーのセッションを作成します。これにより、ユーザーは保護されたページを表示できます。

POSTで送信されたデータを処理するための新しいルートから始めることができます。 そして、ユーザーが正常にログインしたら、プロファイルページにリダイレクトします。

project / auth.py
...
@auth.route('/login')
def login():
    return render_template('login.html')

@auth.route('/login', methods=['POST'])
def login_post():
    # login code goes here
    return redirect(url_for('main.profile'))

次に、ユーザーが正しい資格情報を持っているかどうかを確認する必要があります。

project / auth.py
...
@auth.route('/login', methods=['POST'])
def login_post():
    # login code goes here
    email = request.form.get('email')
    password = request.form.get('password')
    remember = True if request.form.get('remember') else False

    user = User.query.filter_by(email=email).first()

    # check if the user actually exists
    # take the user-supplied password, hash it, and compare it to the hashed password in the database
    if not user or not check_password_hash(user.password, password):
        flash('Please check your login details and try again.')
        return redirect(url_for('auth.login')) # if the user doesn't exist or password is wrong, reload the page

    # if the above check passes, then we know the user has the right credentials
    return redirect(url_for('main.profile'))

テンプレートにブロックを追加して、ユーザーがフラッシュされたメッセージを確認できるようにします。

project/templates/login.html
...
{% with messages = get_flashed_messages() %}
{% if messages %}
    <div class="notification is-danger">
        {{ messages[0] }}
    </div>
{% endif %}
{% endwith %}
<form method="POST" action="/login">

これで、ユーザーが正常にログインしたと言うことができますが、ユーザーをログインさせるものは何もありません。

Flask-ログインはユーザーセッションを管理できます。 を追加することから始めます UserMixin ユーザーモデルに。 The UserMixin モデルにFlask-Login属性を追加して、Flask-Loginがモデルを操作できるようにします。

models.py
from flask_login import UserMixin
from . import db

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True) # primary keys are required by SQLAlchemy
    email = db.Column(db.String(100), unique=True)
    password = db.Column(db.String(100))
    name = db.Column(db.String(1000))

次に、ユーザーローダーを指定する必要があります。 ユーザーローダーは、セッションCookieに保存されているIDから特定のユーザーを見つける方法をFlask-Loginに指示します。 これをに追加します create_app と一緒に機能する init Flaskのコード-ログイン:

プロジェクト/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
...
def create_app():
    ...
    db.init_app(app)

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    from .models import User

    @login_manager.user_loader
    def load_user(user_id):
        # since the user_id is just the primary key of our user table, use it in the query for the user
        return User.query.get(int(user_id))

最後に、 login_user プロファイルページにリダイレクトしてセッションを作成する前に機能します。

project / auth.py
from flask_login import login_user
from .models import User
from . import db
...
@auth.route('/login', methods=['POST'])
def login_post():
    ...
    # if the above check passes, then we know the user has the right credentials
    login_user(user, remember=remember)
    return redirect(url_for('main.profile'))

Flask-Loginセットアップでは、 /login ルート。 すべてが整ったら、プロフィールページが表示されます。

この時点で、アプリケーションを実行してログインを試みることができます。

ステップ10—ページを保護する

あなたの名前がAnthonyでない場合は、プロフィールページにあなたの名前が間違っていることがわかります。 目標は、プロファイルがデータベースに名前を表示することです。 ページを保護してからユーザーのデータにアクセスして、 name.

Flask-Loginを使用するときにページを保護するには、 @login_requried ルートと関数の間のデコレータ。 これにより、ログインしていないユーザーにはルートが表示されなくなります。 ユーザーがログインしていない場合、Flask-Login構成に従って、ユーザーはログインページにリダイレクトされます。

で飾られたルートで @login_required デコレータ、使用できます current_user 関数内のオブジェクト。 これ current_user データベースからのユーザーを表し、ドット表記を使用してそのユーザーのすべての属性へのアクセスを提供します。 例えば、 current_user.email, current_user.password、 と current_user.name、 と current_user.id ログインしたユーザーのデータベースに保存されている実際の値を返します。

を使ってみましょう namecurrent_user テンプレートに送信します。

project / main.py
from flask import Blueprint, render_template
from flask_login import login_required, current_user
from . import db
...
@main.route('/profile')
@login_required
def profile():
    return render_template('profile.html', name=current_user.name)

その後、 profile.html ファイル、ページを更新して表示します name 価値:

project/templates/profile.html
...
<h1 class="title">
  Welcome, {{ name }}!
</h1>

ユーザーがプロフィールページにアクセスすると、ユーザーが挨拶します name.

ログアウトビューを更新するには、 logout_user ログアウトするためのルートで機能する:

project / auth.py
from flask_login import login_user, login_required, logout_user
...
@auth.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('main.index'))

使用 @login_required そもそもログインしていないユーザーをログアウトしても意味がないため、デコレータ。

ユーザーがログアウトしてプロファイルページを再度表示しようとすると、次のエラーメッセージが表示されます。

これは、ユーザーがページへのアクセスを許可されていない場合に、Flask-Loginがメッセージをフラッシュするためです。

最後にやるべきことは if ユーザーに関連するリンクのみを表示するためのテンプレートのステートメント:

テンプレート/base.html
...
<div class="navbar-end">
    <a href="{{ url_for('main.index') }}" class="navbar-item">
        Home
    </a>
    {% if current_user.is_authenticated %}
    <a href="{{ url_for('main.profile') }}" class="navbar-item">
        Profile
    </a>
    {% endif %}
    {% if not current_user.is_authenticated %}
    <a href="{{ url_for('auth.login') }}" class="navbar-item">
        Login
    </a>
    <a href="{{ url_for('auth.signup') }}" class="navbar-item">
        Sign Up
    </a>
    {% endif %}
    {% if current_user.is_authenticated %}
    <a href="{{ url_for('auth.logout') }}" class="navbar-item">
        Logout
    </a>
    {% endif %}
</div>

ユーザーがログインする前に、ログインまたはサインアップするオプションがあります。 ログイン後、自分のプロファイルに移動するか、ログアウトすることができます。

これで、認証を使用してアプリを正常に構築できました。

結論

このチュートリアルでは、Flask-LoginとFlask-SQLAlchemyを使用して、アプリのログインシステムを構築しました。 最初にユーザーモデルを作成し、ユーザー情報を保存することで、ユーザーを認証する方法について説明しました。 次に、フォームからパスワードをハッシュし、データベースに保存されているパスワードと比較して、ユーザーのパスワードが正しいことを確認する必要がありました。 最後に、を使用してアプリに認証を追加しました @login_required プロファイルページのデコレータ。ログインしているユーザーだけがそのページを見ることができます。

このチュートリアルで作成したものは小さなアプリには十分ですが、最初からより多くの機能が必要な場合は、Flask-UserライブラリまたはFlask-Securityライブラリのいずれかを使用することを検討してください。 Flask-ログインライブラリ。