我的计算机上有一个文件,我试图从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
我在这里做错了什么?
答案 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。