Проблемы с 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. Проверьте, какая у вас версия, выполнив следующую команду:"