将通用的自定义身份验证功能应用于多个 Flask 项目
Apply common custom authentication functionality to multiple Flask projects
我创建了一个class,它根据我们公司的用户服务器对用户进行身份验证。我想将它应用于我们使用 Flask-Login 的任何 Flask 应用程序,而不是在每个项目中重复代码。我不确定正确的模式是什么,或者如何实现它。
我想到了几个选项:
- Python 模块 - 简单的身份验证,模块会进行登录,然后 return 一些东西(可能是凭据或令牌)。
- Flask 'app' - 进行身份验证,包括登录和注销屏幕,并以某种方式与
@login_manager.user_loader
链接。我看到的问题是加载的用户可能有任何应用程序的用户模式。
为多个项目实施这种通用身份验证的良好模式是什么?
抽取设置Flask-Login管理器和自定义登录的常用功能views/functions您需要一个简单的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()
我创建了一个class,它根据我们公司的用户服务器对用户进行身份验证。我想将它应用于我们使用 Flask-Login 的任何 Flask 应用程序,而不是在每个项目中重复代码。我不确定正确的模式是什么,或者如何实现它。
我想到了几个选项:
- Python 模块 - 简单的身份验证,模块会进行登录,然后 return 一些东西(可能是凭据或令牌)。
- Flask 'app' - 进行身份验证,包括登录和注销屏幕,并以某种方式与
@login_manager.user_loader
链接。我看到的问题是加载的用户可能有任何应用程序的用户模式。
为多个项目实施这种通用身份验证的良好模式是什么?
抽取设置Flask-Login管理器和自定义登录的常用功能views/functions您需要一个简单的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()