2015-05-13 4 views
1

Я пытаюсь изменить это существующее приложение (miguelgrinberg/microblog), чтобы использовать логин Github-flask (cenkalti/github-flask). Он использует Flask-Login для управления сеансами пользователя (maxcountryman/flask-login).Вспышка Flask с ValueError после успешного входа пользователя в систему с использованием Github-Flask

TraceBack: https://gist.github.com/CoinGame/4a6b14d0213850b29979

Views.py: https://gist.github.com/CoinGame/22d8098ccabc255bd5cf процесс

Войти, кажется, работает. Я получаю токен github, который позволяет мне создавать вызовы API для объекта пользователя. Хотя, когда я пытаюсь собрать все кусочки, я получаю эту ошибку.

Я признаю, что я немного новичок в python и полностью пытаюсь работать с нуля через флягу и ее расширения. Работа над существующим проектом помогла мне понять структуру, но я чувствую, что она также может заставлять меня игнорировать вещи.

Любая идея, что мне здесь не хватает, чтобы получить эту ошибку после входа пользователя в систему?

ответ

0

id вы передаете эту функцию

def load_user(id): 
    return User.query.get(int(id)) 

вызывает проблему. Похоже, что он не существует или он может содержать символы, которые arent числовые. Где-то вдоль линии user_id, кажется, теряется/изменяется и бросает ошибку.

File "/root/votr-blog/app/views.py", line 21, in load_user 
    return User.query.get(int(id)) 
ValueError: invalid literal for int() with base 10: 'None' 

Если вы можете отслеживать, где id потерян, это может помочь.
Можно также обернуть вызов INT() с помощью TRY/поймать

try: 
     int_val = int(id) 
    except ValueError: 
     print("Failure w/ value " + id) 

Глядя в колбу-GitHub и этот код

@app.route('/github-callback') 
@github.authorized_handler 
def authorized(oauth_token): 
    next_url = request.args.get('next') or url_for('index') 
    if oauth_token is None: 
     flash("Authorization failed.") 
     return redirect(next_url) 

    #this code below is getting the user by their github access token 
    user = User.query.filter_by(github_access_token=oauth_token).first() 
    if user is None: 
     user = User(oauth_token) 
     db_session.add(user) 

    user.github_access_token = oauth_token 
    db_session.commit() 
    return redirect(next_url) 

авторизует и возвращает пользователей по отношению к их GitHub маркеров доступа, а чем user_id, это похоже на конфликт с login_manager с возвратом пользователей по id. Ваша проблема заключается в том, что оба метода пытаются сделать то же самое.

Flask-login использует user_ids для управления сеансами и пользователями в сеансе. Пользователь регистрируется и аутентифицируется, когда пользовательский идентификатор сохраняется в сеансе. Это используется для перезагрузки пользовательского объекта из идентификатора пользователя, сохраненного в сеансе.

В Github-колбе используются токены для управления пользователями. Это сохраняет токен в сеансе взглядами вещей. Эти два противоречат друг другу.
Вы могли бы сделать пару вещей:
1) Выберите тот или иной элемент управления пользователями.
2) Как только пользователь был аутентифицирован с помощью github-колбы, получите этот идентификатор пользователя и сохраните его для сеанса, так что функция load_user() должна с чем-то работать. Это кажется противоречивым, хотя, получая пользователя с github-флягой, чтобы получить идентификатор пользователей, чтобы вы могли снова получить пользователя с помощью флэша-входа.

+0

Этот код, кажется, является частью оригинального микроблога. Я считаю, что идентификатор относится к первичному ключу, который генерируется, когда пользователь добавляется в базу данных. В представлении модели это кажется целым числом. Я добавляю пользователя в базу данных после входа в систему, поэтому я немного смущен, почему это не возвращает ни одного после того, как они вошли в систему. https: // github.com/miguelgrinberg/microblog/blob/master/app/models.py # L24 Вот образ модели пользователя для микроблога, но мой не слишком отличается. Я могу опубликовать его, если это поможет. – CoinGame

+0

извините, да, плохо, я смешал идентификатор с токеном. Вы можете отслеживать идентификатор пользователя - то, что передается в функцию 'load_user()' при его вызове. – Craicerjack

+0

Я постараюсь выяснить это и скоро вернуться к вам. Спасибо. – CoinGame

Смежные вопросы