Pregunta

I'm getting UnicodeDecodeError error with FileAdmin module (included in Flask-Admin library for Flask):

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 5: ordinal not in range(128)

Whenever I create a directory which has has non-ASCII characters in its name (like très), I get that error.

I think the point is to add UTF-8 encoding:

# -*- coding: utf-8 -*-

but where (which files?) and how to handle this within FileAdmin module? This is unclear to me.

Edit following @PaoloCasciello request, find below the error traceback

Traceback (most recent call last)

File "C:\Python27\lib\site-packages\flask\app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1689, in wsgi_app 
response =  self.make_response(self.handle_exception(e))
File "C:\Python27\lib\site-packages\flask\app.py", line 1687, in wsgi_app 
response = self.full_dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1360, in full_dispatch_request 
rv = self.handle_user_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1358, in full_dispatch_request 
rv = self.dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1344, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Python27\lib\site-packages\flask_admin\base.py", line 59, in inner 
return f(self, **kwargs)
File "C:\Python27\lib\site-packages\flask_admin\base.py", line 59, in inner 
return f(self, **kwargs)
File "C:\Python27\lib\site-packages\flask_admin\contrib\fileadmin.py", line 460, in index
actions_confirmation=actions_confirmation)
File "C:\Python27\lib\site-packages\flask_admin\base.py", line 247, in render 
return render_template(template, **kwargs)
File "C:\Python27\lib\site-packages\flask\templating.py", line 125, in render_template 
context, ctx.app)
File "C:\Python27\lib\site-packages\flask\templating.py", line 107, in _render 
rv = template.render(context)
File "C:\Python27\lib\site-packages\jinja2\environment.py", line 969, in render 
return self.environment.handle_exception(exc_info, True)
File "C:\Python27\lib\site-packages\jinja2\environment.py", line 742, in handle_exception 
reraise(exc_type, exc_value, tb)
File "C:\Flask\test\templates\admin\file\list.html", line 3, in top-level template code     
{% import 'admin/actions.html' as actionslib with context %}
File "C:\Flask\test\templates\admin\master.html", line 1, in top-level template code 
{% extends admin_base_template %}
File "C:\Flask\test\templates\admin\base.html", line 22, in top-level template code 
{% block page_body %}
File "C:\Flask\test\templates\admin\base.html", line 40, in block "page_body" 
{% block body %}{% endblock %}
File "C:\Flask\test\templates\admin\file\list.html", line 24, in block "body" 
{% block file_list_table %}
File "C:\Flask\test\templates\admin\file\list.html", line 42, in block "file_list_table" 
{% block list_row scoped %}
File "C:\Flask\test\templates\admin\file\list.html", line 51, in block "list_row" 
{% block list_row_actions scoped %}
File "C:\Flask\test\templates\admin\file\list.html", line 61, in block "list_row_actions" 
<input type="hidden" name="path" value="{{ path }}"></input>
File "C:\Python27\lib\site-packages\markupsafe\_native.py", line 22, in escape 
return Markup(text_type(s)
¿Fue útil?

Solución

It is happening because Python os.walkdir returns filenames in ASCII when called with ascii path.

So, when you initialize FileAdmin, make sure you pass base path as unicode string::

admin.add_view(unicode(path), '/files/', name='Files')

Latest Flask-Admin has this fixed - FileAdmin will force unicode for the path internally.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top