如何将JSON文件的内容放入响应中

时间:2016-08-17 15:53:48

标签: python json django file

我的计算机上有一个文件,我试图从django视图中提供JSON。

def serve(request):
    file = os.path.join(BASE_DIR, 'static', 'files', 'apple-app-site-association')
    response = HttpResponse(content=file)
    response['Content-Type'] = 'application/json'

我得到的是导航到网址时文件的路径

/Users/myself/Developer/us/www/static/files/apple-app-site-association

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

os.path.join返回一个字符串,这就是你在响应内容中获得路径的原因。您需要先在该路径上读取文件。

对于静态文件

如果文件是静态的并且在磁盘上,您可以使用网络服务器返回它,并且完全避免使用python和django。如果文件需要下载身份验证,您仍然可以使用django处理该文件,并返回X-Sendfile header(这取决于Web服务器)。

提供静态文件是Web服务器的工作,Nginx和Apache非常擅长这一点,而Python和Django是处理应用程序逻辑的工具。

读取文件的最简单方法

def serve(request):
    path = os.path.join(BASE_DIR, 'static', 'files', 'apple-app-site-association')
    with open(path , 'r') as myfile:
        data=myfile.read()
    response = HttpResponse(content=data)
    response['Content-Type'] = 'application/json'

这受到How do I read a text file into a string variable in Python

的启发

更高级的解决方案

请参阅StreamingHttpResponse上的dhke's answer

其他信息

答案 1 :(得分:3)

如果您将HttpResponse字符串content提供给serve that string,请将其作为HTTP正文告诉@Emile Bergeron's answer

  

content应该是迭代器或字符串。如果它是迭代器,它应该返回字符串,并且这些字符串将连接在一起以形成响应的内容。如果它不是迭代器或字符串,则在访问时将转换为字符串。

由于您似乎在使用静态存储目录,因此您也可以使用staticfiles来处理内容:

from django.contrib.staticfiles.storage import staticfiles_storage
from django.http.response import StreamingHttpResponse

file_path = os.path.join('files', 'apple-app-site-association')

response = StreamingHttpResponse(content=staticfiles_storage.open(file_path))
return response

django-sendfile所述,对于静态文件,这应该已经过度,因为无论如何都应该可以从外部访问这些文件。因此,简单地重定向到static(file_path)也应该可以解决问题(假设您的网络服务器配置正确)。

提供任意文件:

from django.contrib.staticfiles.storage import staticfiles_storage
from django.http.response import StreamingHttpResponse

file_path = ...

response = StreamingHttpResponse(content=open(file_path, 'rb'))
return response

请注意,从Django 1.10开始,文件句柄将自动关闭。

此外,如果可以从您的网络服务器访问该文件,请考虑使用{{3}},以便文件的内容根本不需要通过Django。