【问题标题】:Include a pdf file in urls in Django在 Django 的 url 中包含一个 pdf 文件
【发布时间】:2013-12-09 07:27:01
【问题描述】:

我的main project 目录之一中有一个pdf 文件。我应该如何在主 urls.py 文件中添加这个文件,以便在 <a href> 标签中链接这个文件。

编辑

我通过 AJAX 获得 2 个日期,开始日期和结束日期。我处理这两个日期的数据,生成报告,然后返回一个 HttpResponse。 PDF 报告现在保存在我的主项目目录中。现在我在 AJAX 中得到了回复。那么,现在我应该如何处理成功函数中的响应,从服务器发回并打开一个 PDF 文件。

谢谢。

jQuery

$(function() {
  $("#report_submit").click(function(){
      $.ajax({
      type : "POST",
      url: "/reports/",
      data : { 'start_date' : $("#startDate").val() , 'end_date' : $("#endDate").val() },
      success : function(result){

      },

      error : function(result){
      }
    });

  });
});

Django 查看代码

def generate_report(request):
    ctx = {}



if request.is_ajax():
        if request.POST.has_key('start_date'):
            start_date = datetime.strptime(request.POST[ 'start_date'] , '%m/%d/%Y')
            end_date = datetime.strptime(request.POST[ 'end_date'] , '%m/%d/%Y')
            
            ......
            # PDF GENERATED in MAIN PROJECT DIRECTORY

            with open(os.path.join(os.path.dirname(__file__),'../../../../gui','Report.pdf')) as pdf:
                response = HttpResponse(pdf.read(), content_type='application/pdf')
                response['Content-Disposition'] = 'inline;filename=Report.pdf'

                return response  # so, now when I send a response back, how should I process it in AJAX success function?
            pdf.closed


    return render(request, 'generate_report/reports.html', ctx)

【问题讨论】:

    标签: python django pdf django-urls


    【解决方案1】:

    根据应用的要求,您可以通过两种方式完成此操作

    1. 将 pdf 文件添加到静态目录并从那里提供。毕竟pdf文件实际上只是一个静态资源。

    2. 但是,如果您需要在将文件提供给用户之前进行一些检查,例如。只允许经过身份验证的用户访问它,然后编写一个视图来进行必要的检查,然后为文件的内容提供适当的响应头。见例子here

    在 OP 更新他们的问题后编辑

    这里绝对需要ajax 吗?如果是这样,我可以想到以下内容:

    由于您提到正在生成报告,我将假设未经身份验证且没有授权的用户不应访问该报告。

    一种方法是将生成的 pdf 文件存储在某个位置(静态目录之外),并在数据库表中保存生成文件的名称和可以访问它的用户的 id 的记录。然后,该请求可以简单地以文件名进行响应。

    在 ajax 的成功回调中,在单独的选项卡中打开视图的 url 以及文件名作为 get 参数。此视图将检查用户是否可以访问并提供文件。

    同样,如果不需要 ajax,所有这些复杂性都可以避免

    【讨论】:

    • 我试过这个。与open(os.path.join(os.path.dirname(__file__),'../../../../gui','Report.pdf')) as pdf: response = HttpResponse(pdf.read(), content_type='application/pdf') response['Content-Disposition'] = 'inline;filename=Report.pdf' return response pdf.closed
    • 客户端还是没有获取到pdf文件。
    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多