Форум сайта python.su
1
Приветствую.
Столкнулся со следующей проблемой. Сгенерил в шаблоне ссылку на файл
<p><a href="/file/?fname={{ file.quote_file }}">{{ file.file }}</a></p><p><a href="/file/?fname=%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%BC%D0%B5%D1%87%D0%B0%D0%BD%D0%B8%D0%B9_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82_%D0%BE%D0%B1%D1%89%D0%B8%D0%B9.doc">Список_замечаний_по_подсистеме_интернет_общий.doc</a></p>
def quote_file(self):
from urllib import quote
return quote(unicode(self.file).encode('utf-8'))
UnicodeEncodeError at /file/
'ascii' codec can't encode characters in position 21-26: ordinal not in range(128), HTTP response headers must be in US-ASCII format
Офлайн
2
А код-то покажите где вы обрабатываете запрос.
Офлайн
1
Собственно вот:
def serve_base_file(request):
fname = ''
if request.method=='GET':
fname = request.GET.get('fname')
else:
return HttpResponse(u'Неверно передано имя файла.')
if fname=='':
return HttpResponse(u'Неверно передано имя файла.')
# тут идут проверки прав доступа...
import mimetypes
ctype = mimetypes.guess_type(fname)
f = open(settings.MEDIA_ROOT + fname, 'rb')
data = FileWrapper(f)
response = HttpResponse(data, \
content_type=ctype)
response['Content-Disposition'] = 'attachment; filename=' + fname
return response
Офлайн
1
я конечно хз, что ты там затеваешь с именами файлов, но тебе функция quote_file и нафиг не нужна. линк должен выглядеть так: /file/?fname=Список_замечаний_по_подсистеме_интернет_общий.doc, а браузер его автоматом преобразует в URI.
Офлайн
1
При наведении указателя “мышки ” на линк в статусной строке так и высвечивается. Не пойму, в каком месте происходит EncodeError.
Офлайн
2
В трейсбеке должно быть четко указано место где это происходит.
Я ставлю на это место:
Andrejus
f = open(settings.MEDIA_ROOT + fname, ‘rb’)
Офлайн
1
Действительно…
Traceback:
File “C:\Python27\lib\site-packages\django\core\handlers\base.py” in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File “C:\Python27\lib\site-packages\django\contrib\auth\decorators.py” in _wrapped_view
25. return view_func(request, *args, **kwargs)
File “C:\djcode\vctasks\..\vctasks\addtask\views.py” in serve_base_file
141. response = ‘attachment; filename=’ + fname
File “C:\Python27\lib\site-packages\django\http\__init__.py” in __setitem__
350. header, value = self._convert_to_ascii(header, value)
File “C:\Python27\lib\site-packages\django\http\__init__.py” in _convert_to_ascii
339. value = value.encode('us-ascii')
В 141-й строке views.py какая-то ерунда происходит. но что с этим делать - пока не знаю
Офлайн
2
В http заголовках не могут быть не ascii символы.
Офлайн
1
А можно ещё как-нибудь передать имя файла в объекте HttpResponse?
Или мне остаётся подвергать имена файлов транслитерации при upload'е?
Офлайн
2
так сделайте ему quote
Офлайн