Django: проблема с ContentFile: содержимое строки не загружается полностью - PullRequest
0 голосов
/ 24 февраля 2020

Я новичок в использовании Django. В качестве первого проекта я написал небольшой инструмент для создания M3U8-плейлистов. Моя проблема в том, что длинные плейлисты не передаются полностью.

Это сокращенный код:

def create(request):
    # just a dummy filelist
    playlist = ["#EXTM3U"] + 5 * ["/home/pi/music/" + 5 * "äöü0123456789á/" + "xyz.mp3"]
    file_to_send = ContentFile("")
    for item in playlist:
        file_to_send.write("{}\n".format(item.replace("/home/pi/Music", r"\\raspberry\music").replace("/", "\\")))
    response = HttpResponse(file_to_send, "audio/x-mpegurl")
    response["Content-Length"] = file_to_send.size
    response["Content-Disposition"] = f"attachment; filename=\"playlist.m3u8\""
    # print some debug info
    print("lines:", len(playlist), "chars (no linebreaks)", sum([len(entry) for entry in playlist]),
          "filesize:", file_to_send.size)
    return response

Кажется, проблема l ie в не-ascii символах в записи плейлиста (äöüá). Если таких символов нет, файл передается без изменений. Я предполагаю, что это символы, которые используют два байта в UTF-8, но запись строк в ContentFile, как я, вероятно, не является правильной.

1 Ответ

0 голосов
/ 24 февраля 2020

Нашел ответ, работая над описанием проблемы. Это работает:

def create(request):
    # just a dummy filelist
    playlist = ["#EXTM3U"] + 5 * ["/home/pi/music/" + 5 * "äöü0123456789á/" + "xyz.mp3"]
    joined_playlist = "\n".join([item.replace("/home/pi/Music", r"\\raspberry\music").replace("/", "\\") for item in playlist])
    file_to_send = ContentFile(joined_playlist.encode("UTF-8"))
    response = HttpResponse(file_to_send, "audio/x-mpegurl")
    response["Content-Length"] = file_to_send.size
    response["Content-Disposition"] = f"attachment; filename=\"playlist.m3u8\""
    # print some debug info
    print("lines:", len(playlist), "chars (no linebreaks)", sum([len(entry) for entry in playlist]),
          "filesize:", file_to_send.size)
    return response

Важным отличием является то, что я больше не записываю строки в ContentFile, а являюсь массивом байтов, который я получил путем кодирования строки в UTF-8.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...