概要
POSTで指定したディレクトリ内のファイル一覧を返すAPIをDjangoで構築しています。
どうも、日本語を含むとファイル名が全て文字化けしてしまうようです。
実現したいこと
- ユーザが/api/get_listへ
POST
する - djangoは送信された文字列と合致するディレクトリ内のファイル一覧を
django.http.JsonResponse
で返す。
get_list関数(views.py)
python
1from django.http import HttpResponse 2from django.http import JsonResponse 3import os 4 5 6def get_list(request): 7 if request.method == 'POST': 8 try: 9 if request.POST['type'] == 'images': 10 media_type = 'images' 11 elif request.POST['type'] == 'movies': 12 media_type = 'movies' 13 except KeyError: 14 HttpResponse.status = 403 15 return HttpResponse('You are Hentai.') 16 else: 17 path = os.path.join('/PATH/TO/DIR/media', media_type) 18 result = os.listdir(path) 19 return JsonResponse(result, safe=False) 20 else: 21 HttpResponse.status = 403 22 return HttpResponse('You are Hentai.') 23
api/get_listのレスポンス結果
["\udce3\udc83\udc86\udce3\udc82\udcb9\udce3\udc83\udc881", "test1.mp4", "test2.mp4", "\udce3\udc83\udc86\udce3\udc82\udcb9\udce3\udc83\udc882", "\udce3\udc83\udc86\udce3\udc82\udcb9\udce3\udc83\udc884", "\udce3\udc83\udc86\udce3\udc82\udcb9\udce3\udc83\udc883"]
0: "���������1" 1: "test1.mp4" 2: "test2.mp4" 3: "���������2" 4: "���������4" 5: "���������3"
このように、聞いたことのない文字コード("\udce3\udc83..."
)になってしまいます。
pythonの文字コードが間違っているのかと思い、シェルでの確認とついでにos.listdir()
を実行して見ましたが、普通に取得出来ています。
shellでの確認
python
1[kiwi ~]$ py manage.py shell 2 3Python 3.6.5 (default, Apr 10 2018, 17:08:37) 4[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux 5Type "help", "copyright", "credits" or "license" for more information. 6(InteractiveConsole) 7>>> import sys 8>>> sys.getfilesystemencoding() 9'utf-8' 10>>> import os 11>>> os.listdir('media/movies') 12['テスト1', 'test1.mp4', 'test2.mp4', 'テスト2', 'テスト4', 'テスト3']
不可解なのが、os.listdir()
の結果ではなく、以下のようにするとちゃんと日本語で取得出来ます...
python
1return JsonResponse(['あ', 'い', 'う', 'え', 'お'], safe=False)
os.listdir()
が原因で文字化けするというのはあり得るのでしょうか?os.scandir()
も試してみましたが、同じ結果でした...。
どなたか、ご教授下さい...もう3日ほど悩んでおります。
開発環境
- CentOS7
- apache2.4.35
- django2.1.3

回答4件
あなたの回答
tips
プレビュー