python-flask-security is incompatible with other current packages

Description:

python-flask-security is incompatible with the current python-flask, python-werkzeug and python-sqlalchemy. It is nonmaintained and upstream's suggested replacement python-flask-security-too is already packaged. python-flask-security has no reverse dependencies. Its removal would also help in the removal of python-flask-babelex.

Additional info:

  • python-flask-security 3.0.0-7
  • python-flask 2.3.3-1
  • python-sqlalchemy 1.4.44-2
  • python-werkzeug 2.3.8-1

Steps to reproduce:

quickstartflask-security-quickstart.py

$ cat flask-security-quickstart.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, \
    UserMixin, RoleMixin, login_required

# Create app
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'

# Create database connection object
db = SQLAlchemy(app)

# Define models
roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

# Create a user to test with
@app.before_first_request
def create_user():
    db.create_all()
    user_datastore.create_user(email='matt@nobien.net', password='password')
    db.session.commit()

# Views
@app.route('/')
@login_required
def home():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()
# pacman -S python-flask-security python-flask-sqlalchemy python-pytz
$ python flask-security-quickstart.py 
/usr/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py:872: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  warnings.warn(FSADeprecationWarning(
Traceback (most recent call last):
  File "/tmp/test/flask-security-quickstart.py", line 36, in <module>
    security = Security(app, user_datastore)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/flask_security/core.py", line 469, in __init__
    self._state = self.init_app(app, datastore, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/flask_security/core.py", line 510, in init_app
    @app.before_first_request
     ^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Flask' object has no attribute 'before_first_request'. Did you mean: '_got_first_request'?

Check flask-security-quickstart.py is valid in a venv:

$ python3 -m venv flask-security-venv
$ source flask-security-venv/bin/activate
(flask-security-venv) $ pip install flask==2.1.3 flask-security werkzeug==2.2.2 sqlalchemy==1.4.51 flask-sqlalchemy pytz
Collecting flask==2.1.3
  Using cached Flask-2.1.3-py3-none-any.whl (95 kB)
Collecting flask-security
  Using cached Flask_Security-3.0.0-py2.py3-none-any.whl (68 kB)
Collecting werkzeug==2.2.2
  Using cached Werkzeug-2.2.2-py3-none-any.whl (232 kB)
Collecting sqlalchemy==1.4.51
  Obtaining dependency information for sqlalchemy==1.4.51 from https://files.pythonhosted.org/packages/8c/72/8706c1508e3218dc8ddfff6f10df8bba122f4e22499fd48337dd67ad11cc/SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata
  Using cached SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (10 kB)
Collecting flask-sqlalchemy
  Obtaining dependency information for flask-sqlalchemy from https://files.pythonhosted.org/packages/1d/6a/89963a5c6ecf166e8be29e0d1bf6806051ee8fe6c82e232842e3aeac9204/flask_sqlalchemy-3.1.1-py3-none-any.whl.metadata
  Using cached flask_sqlalchemy-3.1.1-py3-none-any.whl.metadata (3.4 kB)
Collecting pytz
  Obtaining dependency information for pytz from https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl.metadata
  Using cached pytz-2024.1-py2.py3-none-any.whl.metadata (22 kB)
Collecting Jinja2>=3.0 (from flask==2.1.3)
  Obtaining dependency information for Jinja2>=3.0 from https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl.metadata
  Using cached Jinja2-3.1.3-py3-none-any.whl.metadata (3.3 kB)
Collecting itsdangerous>=2.0 (from flask==2.1.3)
  Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting click>=8.0 (from flask==2.1.3)
  Obtaining dependency information for click>=8.0 from https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl.metadata
  Using cached click-8.1.7-py3-none-any.whl.metadata (3.0 kB)
Collecting MarkupSafe>=2.1.1 (from werkzeug==2.2.2)
  Obtaining dependency information for MarkupSafe>=2.1.1 from https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata
  Using cached MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)
Collecting greenlet!=0.4.17 (from sqlalchemy==1.4.51)
  Obtaining dependency information for greenlet!=0.4.17 from https://files.pythonhosted.org/packages/c6/1f/12d5a6cc26e8b483c2e7975f9c22e088ac735c0d8dcb8a8f72d31a4e5f04/greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata
  Using cached greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB)
Collecting Flask-Login>=0.3.0 (from flask-security)
  Obtaining dependency information for Flask-Login>=0.3.0 from https://files.pythonhosted.org/packages/59/f5/67e9cc5c2036f58115f9fe0f00d203cf6780c3ff8ae0e705e7a9d9e8ff9e/Flask_Login-0.6.3-py3-none-any.whl.metadata
  Using cached Flask_Login-0.6.3-py3-none-any.whl.metadata (5.8 kB)
Collecting Flask-Mail>=0.7.3 (from flask-security)
  Using cached Flask_Mail-0.9.1-py3-none-any.whl
Collecting Flask-Principal>=0.3.3 (from flask-security)
  Using cached Flask_Principal-0.4.0-py3-none-any.whl
Collecting Flask-WTF>=0.13.1 (from flask-security)
  Obtaining dependency information for Flask-WTF>=0.13.1 from https://files.pythonhosted.org/packages/02/2b/0f0cf68a2f052ea3dbb8b6c8c2a7e8aea5e6df7410f5e289437fefbeb461/flask_wtf-1.2.1-py3-none-any.whl.metadata
  Using cached flask_wtf-1.2.1-py3-none-any.whl.metadata (3.4 kB)
Collecting Flask-BabelEx>=0.9.3 (from flask-security)
  Using cached Flask_BabelEx-0.9.4-py3-none-any.whl (8.7 kB)
Collecting passlib>=1.7 (from flask-security)
  Using cached passlib-1.7.4-py2.py3-none-any.whl (525 kB)
INFO: pip is looking at multiple versions of flask-sqlalchemy to determine which version is compatible with other requirements. This could take a while.
Collecting flask-sqlalchemy
  Obtaining dependency information for flask-sqlalchemy from https://files.pythonhosted.org/packages/f2/43/41158f14ebf519f1f0edda4c0bd2ff983cdee8777d541621cc41c9192cec/flask_sqlalchemy-3.1.0-py3-none-any.whl.metadata
  Using cached flask_sqlalchemy-3.1.0-py3-none-any.whl.metadata (3.4 kB)
  Obtaining dependency information for flask-sqlalchemy from https://files.pythonhosted.org/packages/d8/1d/c3c5afdaebd5d5f82d2c25762f5356416bd7bc109a550c79247134e48ca3/flask_sqlalchemy-3.0.5-py3-none-any.whl.metadata
  Using cached flask_sqlalchemy-3.0.5-py3-none-any.whl.metadata (3.3 kB)
  Obtaining dependency information for flask-sqlalchemy from https://files.pythonhosted.org/packages/2a/47/8f9010cd80553e26c7d4533f1972d04648f49edde2aa2895636792364aad/flask_sqlalchemy-3.0.4-py3-none-any.whl.metadata
  Using cached flask_sqlalchemy-3.0.4-py3-none-any.whl.metadata (3.3 kB)
  Using cached Flask_SQLAlchemy-3.0.3-py3-none-any.whl (24 kB)
  Using cached Flask_SQLAlchemy-3.0.2-py3-none-any.whl (24 kB)
  Using cached Flask_SQLAlchemy-3.0.1-py3-none-any.whl (24 kB)
  Using cached Flask_SQLAlchemy-3.0.0-py3-none-any.whl (23 kB)
INFO: pip is still looking at multiple versions of flask-sqlalchemy to determine which version is compatible with other requirements. This could take a while.
  Using cached Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl (17 kB)
Collecting Babel>=1.0 (from Flask-BabelEx>=0.9.3->flask-security)
  Obtaining dependency information for Babel>=1.0 from https://files.pythonhosted.org/packages/0d/35/4196b21041e29a42dc4f05866d0c94fa26c9da88ce12c38c2265e42c82fb/Babel-2.14.0-py3-none-any.whl.metadata
  Using cached Babel-2.14.0-py3-none-any.whl.metadata (1.6 kB)
Collecting speaklater>=1.2 (from Flask-BabelEx>=0.9.3->flask-security)
  Using cached speaklater-1.3-py3-none-any.whl
Collecting blinker (from Flask-Mail>=0.7.3->flask-security)
  Obtaining dependency information for blinker from https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl.metadata
  Using cached blinker-1.7.0-py3-none-any.whl.metadata (1.9 kB)
Collecting wtforms (from Flask-WTF>=0.13.1->flask-security)
  Obtaining dependency information for wtforms from https://files.pythonhosted.org/packages/18/19/c3232f35e24dccfad372e9f341c4f3a1166ae7c66e4e1351a9467c921cc1/wtforms-3.1.2-py3-none-any.whl.metadata
  Using cached wtforms-3.1.2-py3-none-any.whl.metadata (5.3 kB)
Using cached SQLAlchemy-1.4.51-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB)
Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
Using cached click-8.1.7-py3-none-any.whl (97 kB)
Using cached Flask_Login-0.6.3-py3-none-any.whl (17 kB)
Using cached flask_wtf-1.2.1-py3-none-any.whl (12 kB)
Using cached greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (620 kB)
Using cached Jinja2-3.1.3-py3-none-any.whl (133 kB)
Using cached MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (28 kB)
Using cached Babel-2.14.0-py3-none-any.whl (11.0 MB)
Using cached blinker-1.7.0-py3-none-any.whl (13 kB)
Using cached wtforms-3.1.2-py3-none-any.whl (145 kB)
Installing collected packages: speaklater, pytz, passlib, MarkupSafe, itsdangerous, greenlet, click, blinker, Babel, wtforms, werkzeug, sqlalchemy, Jinja2, flask, Flask-WTF, flask-sqlalchemy, Flask-Principal, Flask-Mail, Flask-Login, Flask-BabelEx, flask-security
Successfully installed Babel-2.14.0 Flask-BabelEx-0.9.4 Flask-Login-0.6.3 Flask-Mail-0.9.1 Flask-Principal-0.4.0 Flask-WTF-1.2.1 Jinja2-3.1.3 MarkupSafe-2.1.5 blinker-1.7.0 click-8.1.7 flask-2.1.3 flask-security-3.0.0 flask-sqlalchemy-2.5.1 greenlet-3.0.3 itsdangerous-2.1.2 passlib-1.7.4 pytz-2024.1 speaklater-1.3 sqlalchemy-1.4.51 werkzeug-2.2.2 wtforms-3.1.2
(flask-security-venv) $ python flask-security-quickstart.py 
/tmp/test/flask-security-venv/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py:872: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  warnings.warn(FSADeprecationWarning(
 * Serving Flask app 'flask-security-quickstart' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
/tmp/test/flask-security-venv/lib/python3.11/site-packages/flask_sqlalchemy/__init__.py:872: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  warnings.warn(FSADeprecationWarning(
 * Debugger is active!
 * Debugger PIN: 168-150-549