Проблемы с Flask-openid в Python 3

Я пытаюсь заставить работать Flask-openid, но продолжаю нажимать эту ошибку при попытке войти

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

Бывает при использовании этой функции

oid.try_login(openid, ask_for=['email', 'fullname', 'nickname'])

Здесь используется функция:

@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
    """Does the login via OpenID.  Has to call into `oid.try_login`
    to start the OpenID machinery.
    """
    # if we are already logged in, go back to were we came from
    if g.user is not None:
        app.logger.info('logged-in: ' + oid.get_next_url())
        return redirect(oid.get_next_url())
    if request.method == 'POST':
        openid = request.form.get('openid_identifier')
        if openid:
            app.logger.info(request.form)
            app.logger.info('logging-in: ' + oid.get_next_url())
            return oid.try_login(openid, ask_for=['email', 'fullname',
                                                  'nickname'])
    app.logger.info('not-logged-in: ' + oid.get_next_url())
    return render_template('login.html', next=oid.get_next_url(),
                           error=oid.fetch_error())

и на самом деле, похоже, проблема с lxml, которую использует Flask-openid:

  File "C:\Python33\lib\site-packages\openid\yadis\etxrd.py", line 69, in parseXRDS
    element = ElementTree.XML(text)
  File "lxml.etree.pyx", line 3012, in lxml.etree.XML (src\lxml\lxml.etree.c:67876) 
  File "parser.pxi", line 1781, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:102435)

Я попробовал несколько примеров проектов на github, но у них у всех одна и та же проблема. Есть ли какой-нибудь способ заставить Flask-openid работать в Python 3?

2 ответа

Я сам только изучаю Flask, поэтому мне не очень помогает.

Однако взгляните на http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins

Автор упоминает

Обратите внимание, что из-за различий в обработке Unicode между Python 2 и 3 мы должны предоставить две альтернативные версии этого метода.

Он использует str вместо unicode

def get_id(self):
    try:
        return unicode(self.id)  # python 2
    except NameError:
        return str(self.id)  # python 3

Я могу быть совершенно не прав! В таком случае, извините, стоит попробовать.

Это гораздо больше, чем просто строка. Он основан на старом пакете python-openid, который не совместим с Python3. Существует новая версия python-openid специально для Python3.

https://pypi.python.org/pypi/python3-openid/3.0.1

Тот же блог, упомянутый ранее, также подробно описывает это: http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins"К сожалению, версия 1.2.1 Flask-OpenID (текущая официальная версия) не очень хорошо работает с Python 3. Проверьте, какая у вас версия, выполнив следующую команду:"

Другие вопросы по тегам