[Python-modules-commits] [python-social-auth] 55/322: Simplify flask app initialization

Wolfgang Borgert debacle at moszumanska.debian.org
Sat Dec 24 15:12:48 UTC 2016


This is an automated email from the git hooks/post-receive script.

debacle pushed a commit to tag v0.2.10
in repository python-social-auth.

commit cc5908675c95944b68aae038700c7ee901aff491
Author: Matías Aguirre <matiasaguirre at gmail.com>
Date:   Sun Nov 23 01:45:47 2014 -0200

    Simplify flask app initialization
---
 examples/flask_example/__init__.py      |  15 +++--
 examples/flask_example/manage.py        |   8 +--
 examples/flask_example/models/user.py   |  23 ++++---
 examples/flask_example/settings.py      |   9 +--
 social/apps/flask_app/default/models.py | 103 ++++++++++++++++++--------------
 social/storage/sqlalchemy_orm.py        |   3 +-
 6 files changed, 92 insertions(+), 69 deletions(-)

diff --git a/examples/flask_example/__init__.py b/examples/flask_example/__init__.py
index f791441..a5ebd77 100644
--- a/examples/flask_example/__init__.py
+++ b/examples/flask_example/__init__.py
@@ -1,7 +1,9 @@
 import sys
 
+from sqlalchemy import create_engine
+from sqlalchemy.orm import scoped_session, sessionmaker
+
 from flask import Flask, g
-from flask.ext.sqlalchemy import SQLAlchemy
 from flask.ext import login
 
 sys.path.append('../..')
@@ -20,9 +22,12 @@ except ImportError:
     pass
 
 # DB
-db = SQLAlchemy(app)
+engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
+Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+db_session = scoped_session(Session)
+
 app.register_blueprint(social_auth)
-init_social(app, db)
+init_social(app, db_session)
 
 login_manager = login.LoginManager()
 login_manager.login_view = 'main'
@@ -49,12 +54,12 @@ def global_user():
 @app.teardown_appcontext
 def commit_on_success(error=None):
     if error is None:
-        db.session.commit()
+        db_session.commit()
 
 
 @app.teardown_request
 def shutdown_session(exception=None):
-    db.session.remove()
+    db_session.remove()
 
 
 @app.context_processor
diff --git a/examples/flask_example/manage.py b/examples/flask_example/manage.py
index 9c6302f..a298e00 100755
--- a/examples/flask_example/manage.py
+++ b/examples/flask_example/manage.py
@@ -5,14 +5,14 @@ from flask.ext.script import Server, Manager, Shell
 
 sys.path.append('..')
 
-from flask_example import app, db
+from flask_example import app, db_session, engine
 
 
 manager = Manager(app)
 manager.add_command('runserver', Server())
 manager.add_command('shell', Shell(make_context=lambda: {
     'app': app,
-    'db': db
+    'db_session': db_session
 }))
 
 
@@ -20,8 +20,8 @@ manager.add_command('shell', Shell(make_context=lambda: {
 def syncdb():
     from flask_example.models import user
     from social.apps.flask_app.default import models
-    db.drop_all()
-    db.create_all()
+    user.Base.metadata.create_all(engine)
+    models.PSABase.metadata.create_all(engine)
 
 if __name__ == '__main__':
     manager.run()
diff --git a/examples/flask_example/models/user.py b/examples/flask_example/models/user.py
index 32727f6..7cb7058 100644
--- a/examples/flask_example/models/user.py
+++ b/examples/flask_example/models/user.py
@@ -1,16 +1,23 @@
+from sqlalchemy import Column, String, Integer, Boolean
+from sqlalchemy.ext.declarative import declarative_base
+
 from flask.ext.login import UserMixin
 
-from flask_example import db
+from flask_example import db_session
+
+
+Base = declarative_base()
+Base.query = db_session.query_property()
 
 
-class User(db.Model, UserMixin):
+class User(Base, UserMixin):
     __tablename__ = 'users'
-    id = db.Column(db.Integer, primary_key=True)
-    username = db.Column(db.String(200))
-    password = db.Column(db.String(200), default='')
-    name = db.Column(db.String(100))
-    email = db.Column(db.String(200))
-    active = db.Column(db.Boolean, default=True)
+    id = Column(Integer, primary_key=True)
+    username = Column(String(200))
+    password = Column(String(200), default='')
+    name = Column(String(100))
+    email = Column(String(200))
+    active = Column(Boolean, default=True)
 
     def is_active(self):
         return self.active
diff --git a/examples/flask_example/settings.py b/examples/flask_example/settings.py
index 839e009..101f1b8 100644
--- a/examples/flask_example/settings.py
+++ b/examples/flask_example/settings.py
@@ -1,14 +1,9 @@
-from flask_example import app
-
-
-app.debug = True
+from os.path import dirname, abspath
 
 SECRET_KEY = 'random-secret-key'
 SESSION_COOKIE_NAME = 'psa_session'
-DEBUG = False
-from os.path import dirname, abspath
+DEBUG = True
 SQLALCHEMY_DATABASE_URI = 'sqlite:////%s/test.db' % dirname(abspath(__file__))
-
 DEBUG_TB_INTERCEPT_REDIRECTS = False
 SESSION_PROTECTION = 'strong'
 
diff --git a/social/apps/flask_app/default/models.py b/social/apps/flask_app/default/models.py
index c284d09..556adc1 100644
--- a/social/apps/flask_app/default/models.py
+++ b/social/apps/flask_app/default/models.py
@@ -1,6 +1,8 @@
 """Flask SQLAlchemy ORM models for Social Auth"""
 from sqlalchemy import Column, Integer, String, ForeignKey
 from sqlalchemy.orm import relationship, backref
+from sqlalchemy.schema import UniqueConstraint
+from sqlalchemy.ext.declarative import declarative_base
 
 from social.utils import setting_name, module_member
 from social.storage.sqlalchemy_orm import SQLAlchemyUserMixin, \
@@ -10,52 +12,65 @@ from social.storage.sqlalchemy_orm import SQLAlchemyUserMixin, \
                                           BaseSQLAlchemyStorage
 
 
+PSABase = declarative_base()
+
+
+class _AppSession(PSABase):
+    __abstract__ = True
+
+    @classmethod
+    def _set_session(cls, app_session):
+        cls.app_session = app_session
+
+    @classmethod
+    def _session(cls):
+        return cls.app_session
+
+
+class UserSocialAuth(_AppSession, SQLAlchemyUserMixin):
+    """Social Auth association model"""
+    # Temporary override of constraints to avoid an error on the still-to-be
+    # missing column uid.
+    __table_args__ = ()
+
+    @classmethod
+    def user_model(cls):
+        return cls.user.property.argument
+
+    @classmethod
+    def username_max_length(cls):
+        user_model = cls.user_model()
+        return user_model.__table__.columns.get('username').type.length
+
+
+class Nonce(_AppSession, SQLAlchemyNonceMixin):
+    """One use numbers"""
+    pass
+
+
+class Association(_AppSession, SQLAlchemyAssociationMixin):
+    """OpenId account association"""
+    pass
+
+
+class Code(_AppSession, SQLAlchemyCodeMixin):
+    pass
+
+
 class FlaskStorage(BaseSQLAlchemyStorage):
-    user = None
-    nonce = None
-    association = None
-    code = None
+    user = UserSocialAuth
+    nonce = Nonce
+    association = Association
+    code = Code
 
 
-def init_social(app, db):
+def init_social(app, session):
     UID_LENGTH = app.config.get(setting_name('UID_LENGTH'), 255)
     User = module_member(app.config[setting_name('USER_MODEL')])
-    app_session = db.session
-
-    class _AppSession(object):
-        @classmethod
-        def _session(cls):
-            return app_session
-
-    class UserSocialAuth(_AppSession, db.Model, SQLAlchemyUserMixin):
-        """Social Auth association model"""
-        uid = Column(String(UID_LENGTH))
-        user_id = Column(Integer, ForeignKey(User.id),
-                         nullable=False, index=True)
-        user = relationship(User, backref=backref('social_auth',
-                                                  lazy='dynamic'))
-
-        @classmethod
-        def username_max_length(cls):
-            return User.__table__.columns.get('username').type.length
-
-        @classmethod
-        def user_model(cls):
-            return User
-
-    class Nonce(_AppSession, db.Model, SQLAlchemyNonceMixin):
-        """One use numbers"""
-        pass
-
-    class Association(_AppSession, db.Model, SQLAlchemyAssociationMixin):
-        """OpenId account association"""
-        pass
-
-    class Code(_AppSession, db.Model, SQLAlchemyCodeMixin):
-        pass
-
-    # Set the references in the storage class
-    FlaskStorage.user = UserSocialAuth
-    FlaskStorage.nonce = Nonce
-    FlaskStorage.association = Association
-    FlaskStorage.code = Code
+    _AppSession._set_session(session)
+    UserSocialAuth.__table_args__ = (UniqueConstraint('provider', 'uid'),)
+    UserSocialAuth.uid = Column(String(UID_LENGTH))
+    UserSocialAuth.user_id = Column(Integer, ForeignKey(User.id),
+                                    nullable=False, index=True)
+    UserSocialAuth.user = relationship(User, backref=backref('social_auth',
+                                                             lazy='dynamic'))
diff --git a/social/storage/sqlalchemy_orm.py b/social/storage/sqlalchemy_orm.py
index f1934c4..1be8a1a 100644
--- a/social/storage/sqlalchemy_orm.py
+++ b/social/storage/sqlalchemy_orm.py
@@ -3,10 +3,11 @@ import base64
 import six
 import json
 
+from sqlalchemy import Column, Integer, String
 from sqlalchemy.exc import IntegrityError
 from sqlalchemy.types import PickleType, Text
-from sqlalchemy import Column, Integer, String
 from sqlalchemy.schema import UniqueConstraint
+from sqlalchemy.ext.declarative import declared_attr
 
 from social.storage.base import UserMixin, AssociationMixin, NonceMixin, \
                                 CodeMixin, BaseStorage

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-social-auth.git



More information about the Python-modules-commits mailing list