如何在Django视图中显示PDF文件?

2024-06-07 11:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在Django视图中显示PDF文件,而不是让用户必须下载才能看到它?

如果有可能,怎么办?

这就是我目前所拥有的-

@login_required
def resume(request, applicant_id):

    #Get the applicant's resume
    resume = File.objects.get(applicant=applicant_id)
    fsock = open(resume.location, 'r')
    response = HttpResponse(fsock, mimetype='application/pdf')

    return response

Tags: 文件django用户视图idgetpdfresponse
3条回答

Django有一个专门用于返回文件的类,FileResponse。它将文件流化,这样在返回之前就不必将整个文件读入内存。给你:

from django.http import FileResponse, Http404

def pdf_view(request):
    try:
        return FileResponse(open('foobar.pdf', 'rb'), content_type='application/pdf')
    except FileNotFoundError:
        raise Http404()

如果您有非常大的文件或者经常这样做,一个更好的选择可能是使用正常的服务器配置在Django之外提供这些文件。

如果您使用的是Windows机器,那么pdf必须以rb而不是r的形式打开。

def pdf_view(request):
    with open('/path / to /name.pdf', 'rb') as pdf:
        response = HttpResponse(pdf.read(),content_type='application/pdf')
        response['Content-Disposition'] = 'filename=some_file.pdf'
        return response

简单地说,如果您有一个PDF文件,并且希望通过Django视图输出它,那么您只需要将文件内容转储到响应中,并用适当的mimetype发送它。

def pdf_view(request):
    with open('/path/to/my/file.pdf', 'r') as pdf:
        response = HttpResponse(pdf.read(), mimetype='application/pdf')
        response['Content-Disposition'] = 'inline;filename=some_file.pdf'
        return response
    pdf.closed

您可能只需直接返回响应,而不必指定内容处置,但这更好地表明了您的意图,还允许您指定文件名,以防用户决定保存它。

另外,请注意,上面的视图不处理由于任何原因无法打开或读取文件的情况。因为它是用with完成的,所以不会引发任何异常,但是您仍然必须返回某种响应。不过,你可以简单地提出一个Http404或其他东西。

相关问题 更多 >

    热门问题