Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Проблем с обработкой кириллицы в строке запроса [RSS Feed]

#1 Март 24, 2011 14:38:40

Andrejus
От:
Зарегистрирован: 2011-03-22
Сообщения: 64
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

Приветствую.

Столкнулся со следующей проблемой. Сгенерил в шаблоне ссылку на файл

<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>
где fname=“Список_замечаний_по_подсистеме_интернет_общий.doc”.

параметр fname задаётся при помощи метода quote_file, который обрабатывает русское имя файла :
    def quote_file(self):
from urllib import quote
return quote(unicode(self.file).encode('utf-8'))
где file - поле типа FileField.

Получаю исключение
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 Март 24, 2011 16:29:21

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

А код-то покажите где вы обрабатываете запрос.



Офлайн

#3 Март 24, 2011 16:40:39

Andrejus
От:
Зарегистрирован: 2011-03-22
Сообщения: 64
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

Собственно вот:

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
С латинскими именами работает.



Офлайн

#4 Март 24, 2011 16:45:49

Doberman26rus
От: Ставрополь
Зарегистрирован: 2009-03-16
Сообщения: 128
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

я конечно хз, что ты там затеваешь с именами файлов, но тебе функция quote_file и нафиг не нужна. линк должен выглядеть так: /file/?fname=Список_замечаний_по_подсистеме_интернет_общий.doc, а браузер его автоматом преобразует в URI.



подпись

Офлайн

#5 Март 24, 2011 16:55:35

Andrejus
От:
Зарегистрирован: 2011-03-22
Сообщения: 64
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

При наведении указателя “мышки ” на линк в статусной строке так и высвечивается. Не пойму, в каком месте происходит EncodeError.



Офлайн

#6 Март 24, 2011 17:00:17

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

В трейсбеке должно быть четко указано место где это происходит.

Я ставлю на это место:

Andrejus
f = open(settings.MEDIA_ROOT + fname, ‘rb’)



Офлайн

#7 Март 24, 2011 17:05:14

Andrejus
От:
Зарегистрирован: 2011-03-22
Сообщения: 64
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

Действительно…

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 какая-то ерунда происходит. но что с этим делать - пока не знаю



Офлайн

#8 Март 24, 2011 17:12:31

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

В http заголовках не могут быть не ascii символы.



Офлайн

#9 Март 24, 2011 17:21:15

Andrejus
От:
Зарегистрирован: 2011-03-22
Сообщения: 64
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

А можно ещё как-нибудь передать имя файла в объекте HttpResponse?
Или мне остаётся подвергать имена файлов транслитерации при upload'е?



Офлайн

#10 Март 24, 2011 17:23:25

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблем с обработкой кириллицы в строке запроса

так сделайте ему quote



Офлайн

  • Начало
  • » Django
  • » Проблем с обработкой кириллицы в строке запроса[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version