2016-10-08 2 views
1

J'ai une application web Flask. J'essaie d'intégrer python-social-auth.python-social-auth: AttributeError: l'objet 'SQLAlchemy' n'a pas d'attribut 'query' sur/complete/vk-oauth2 url

Je mis:

SOCIAL_AUTH_USER_MODEL = 'app.models.User' 
SOCIAL_AUTH_AUTHENTICATION_BACKENDS = (
    'social.backends.vk.VKOAuth2', 
) 
SOCIAL_AUTH_VK_OAUTH2_KEY = '***' 
SOCIAL_AUTH_VK_OAUTH2_SECRET = '***' 
SOCIAL_AUTH_VK_OAUTH2_SCOPE = [] 

Quand je vais à l'url /login/vk-oauth2 et après autorisation avec succès je VK (vk.com) une redirection vers /complete/vk-oauth2/?redirect_state=123ewq&code=123&state=123qwe avec l'erreur: AttributeError: 'SQLAlchemy' object has no attribute 'query'

Traceback:

Traceback (most recent call last): 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "my_app/env/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "my_app/env/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "my_app/env/lib/python3.4/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "my_app/env/lib/python3.4/site-packages/social/apps/flask_app/utils.py", line 46, in wrapper 
    return func(backend, *args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/apps/flask_app/routes.py", line 23, in complete 
    *args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/actions.py", line 44, in do_complete 
    user = backend.complete(user=user, *args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/backends/base.py", line 41, in complete 
    return self.auth_complete(*args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/utils.py", line 246, in wrapper 
    return func(*args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/backends/oauth.py", line 397, in auth_complete 
    *args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/utils.py", line 246, in wrapper 
    return func(*args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/backends/oauth.py", line 408, in do_auth 
    return self.strategy.authenticate(*args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/strategies/base.py", line 150, in authenticate 
    return backend.authenticate(*args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/backends/base.py", line 82, in authenticate 
    return self.pipeline(pipeline, *args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/backends/base.py", line 85, in pipeline 
    out = self.run_pipeline(pipeline, pipeline_index, *args, **kwargs) 
    File "my_app/env/lib/python3.4/site-packages/social/backends/base.py", line 112, in run_pipeline 
    result = func(*args, **out) or {} 
    File "my_app/env/lib/python3.4/site-packages/social/pipeline/social_auth.py", line 20, in social_user 
    social = backend.strategy.storage.user.get_social_auth(provider, uid) 
    File "my_app/env/lib/python3.4/site-packages/social/storage/sqlalchemy_orm.py", line 141, in get_social_auth 
    return cls._query().filter_by(provider=provider, 
    File "my_app/env/lib/python3.4/site-packages/social/storage/sqlalchemy_orm.py", line 39, in _query 
    return cls._session().query(cls) 
AttributeError: 'SQLAlchemy' object has no attribute 'query' 

Mon modèle d'utilisateur:

from app import app 
from flask_sqlalchemy import SQLAlchemy 

db = SQLAlchemy(app) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(100), nullable=False) 
    email = db.Column(db.String(100), nullable=True) 
    provider = db.Column(db.String(50)) 
    social_id = db.Column(db.Integer) 
    created_at = db.Column(db.DateTime, server_default=func.now(), nullable=False) 

    @property 
    def is_active(self): 
     return True 

    @property 
    def is_authenticated(self): 
     return True 

    @property 
    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return str(self.id) 

paquets d'occasion:

$ pip freeze 
alembic==0.8.6 
defusedxml==0.4.1 
Flask==0.10.1 
Flask-Cors==2.1.2 
Flask-Fixtures==0.3.3 
Flask-Login==0.3.2 
Flask-Migrate==1.8.0 
Flask-Script==2.0.5 
Flask-SQLAlchemy==2.1 
itsdangerous==0.24 
Jinja2==2.8 
Mako==1.0.4 
MarkupSafe==0.23 
oauthlib==2.0.0 
psycopg2==2.6.1 
PyJWT==1.4.2 
python-editor==1.0 
python-social-auth==0.2.21 
python3-openid==3.0.10 
requests==2.10.0 
requests-oauthlib==0.7.0 
six==1.10.0 
SQLAlchemy==1.0.13 
Werkzeug==0.11.9 

Qu'est-ce que je fais mal? Ou ce que je n'ai pas fait?

Répondre

1

Utilisez-vous la fonction init_app comme décrit dans les documents? http://psa.matiasaguirre.net/docs/configuration/flask.html#models-setup

Cette section est incorrecte et doit dire que vous devez passer votre session de SQLAlchemy à la fonction init_app et non une référence à votre base de données.

Il devrait être quelque chose comme:

init_app(app, db.session)

J'ai présenté un PR pour résoudre ce problème. https://github.com/omab/python-social-auth/pull/1050

+0

Merci. Tu m'as aidé. J'ajoute 'init_social (app, db.session)' et cette erreur a été corrigée. Mais maintenant j'ai un nouveau problème: 'sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation" social_auth_usersocialauth "n'existe pas. Je n'ai pas de table DB "social_auth_usersocialauth". Python-social-auth a une migration pour Flask? – Meatbot

+1

@Meatbot Voici les modèles SQLAlchemy: https://github.com/omab/python-social-auth/blob/master/social/storage/sqlalchemy_orm.py – duffn