Flask-Login マネージャーを設定する一般的な機能と、必要なカスタム ログイン ビュー/機能を単純な Flask 拡張パッケージに抽出します。このパッケージをpip
各プロジェクトの環境にインストールし、そのプロジェクトの Flask アプリを作成するときに使用します。
company_auth/company_auth.py
from flask import Blueprint, redirect, url_for, render_template
from flask_login import LoginManager
from flask_wtf import Form
bp = Blueprint('auth', __name__)
class LoginForm(Form):
# define your login form
@bp.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
# do custom login stuff
return redirect(url_for('index'))
return render_template('auth/login.html', form=form)
def init_app(app, user_model):
# have to pass in the user model since it's different between apps
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
@login_manager.user_loader
def company_user_loader(id):
user = user_model.query.get(id)
# do custom user loading stuff
return user
app.register_blueprint(bp, url_prefix='/auth')
company_auth/setup.py
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(
name='company_auth',
version='1.0',
py_modules=['company_auth'],
url='http://davidism.com/',
license='BSD',
author='davidism',
author_email='davidism@gmail.com',
description='Flask extension for company auth',
requires=['flask']
)
他のプロジェクトにインストールするパッケージのディストリビューションを作成します。
$ python setup.py sdist
プロジェクトごとに、パッケージをインストールし、init_app
関数をインポートして実行し、認証テンプレートを提供します。(拡張機能にはデフォルトのテンプレートも含まれる可能性がありますが、そのパスを下ると、この回答は巨大になります。デフォルトのテンプレートの例については、Flask-Securityを参照してください。)
$ project_env/bin/activate
$ pip install /path/to/company_auth/dist/company_auth-1.0.tar.gz
認証テンプレートを作成します。
project/
templates/
auth/
login.html
app.py
カスタム認証を使用してアプリをセットアップします。
import company_auth
company_auth.init_app()