Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下载按钮重定向到错误页面_Javascript_Python_Django_Django Urls - Fatal编程技术网

Javascript 下载按钮重定向到错误页面

Javascript 下载按钮重定向到错误页面,javascript,python,django,django-urls,Javascript,Python,Django,Django Urls,在我的Django项目中,用户将Elasticsearch查询提交到表单中,并返回从该查询生成的可下载报告。我们已经做了一些更改,现在我正在尝试让返回报表的部分重新工作。但是,我的url模式遇到了一个问题,应该调用view函数来下载报告 我有一个Download Report按钮,该按钮在生成报告后出现(通过Ajax请求检查)。这个想法是,用户将单击按钮,报告将显示在他们的下载文件夹中。但是,当我单击按钮时,它会将我发送到/report/return\u doc/,而不是/return\u do

在我的Django项目中,用户将Elasticsearch查询提交到表单中,并返回从该查询生成的可下载报告。我们已经做了一些更改,现在我正在尝试让返回报表的部分重新工作。但是,我的url模式遇到了一个问题,应该调用view函数来下载报告

我有一个
Download Report
按钮,该按钮在生成报告后出现(通过Ajax请求检查)。这个想法是,用户将单击按钮,报告将显示在他们的下载文件夹中。但是,当我单击按钮时,它会将我发送到
/report/return\u doc/
,而不是
/return\u doc/

将用户发送到
/return\u doc/
的逻辑是,它与我的视图中的return\u doc函数相关联,但是我是否可以触发此函数并将报告下载给用户,而无需刷新页面/将其发送到新的url?或者我需要做一些完全不同的事情来使这个按钮正常工作吗

错误消息

Page not found (404)
Request Method: GET
Request URL:    http://0.0.0.0:0001/report/return_doc/
Using the URLconf defined in audit_tool_app.urls, Django tried these URL patterns, in this order:

admin/
accounts/
form/
report/ [name='form']
report/ ^static/(?P<path>.*)$
check_progress/ [name='check_progress']
return_doc/ [name='return_doc']
[name='home']
^static/(?P<path>.*)$
The current path, report/return_doc/, didn't match any of these.
审计工具应用程序/url.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', views.get_query, name='form'),
]  + static(settings.STATIC_URL, document_root=settings.STAT)
"""audit_tool_app URL Configuration"""
from django.contrib import admin
from django.urls import include, path
from django.views.generic.base import TemplateView
from django.conf import settings
from django.conf.urls.static import static
from audit_tool import views

urlpatterns = [
                  path('admin/', admin.site.urls),
                  path('accounts/', include('django.contrib.auth.urls')),
                  path('form/', include('audit_tool.urls')),
                  path('report/', include('audit_tool.urls')),
                  path('check_progress/', views.check_progress, name='check_progress'),
                  path('report/return_doc/', views.return_doc, name='return_doc'),
                  path('', TemplateView.as_view(template_name='home.html'), name='home'),
              ] + static(settings.STATIC_URL, document_root=settings.STAT)
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from docx import Document
import os
import threading
from .forms import QueryForm
from .models import *
import time


@login_required
def get_query(request):
    if request.method == 'POST':
        form = QueryForm(request.POST)
        if form.is_valid():
            query = form.cleaned_data["query"]
            fn = "report_" + str(time.time()).replace(".", "_") + ".docx"
            t = threading.Thread(target=generate_doc, args=(query, fn))
            t.start()
            return render(request, "audit_tool/check.html", {"fn": fn})
        else:
            return HttpResponse("Your query does not appear to be valid. Please enter a valid query and try again.")
    else:
        form = QueryForm()
        return render(request, 'audit_tool/form_template.html', {'form': form})


@login_required
def check_progress(request):
    """
    Returns status of document generation
    """
    fn = request.POST["filename"]
    file = "/app/created_files/" + fn
    if not os.path.exists(file):
        return JsonResponse({"report_in_progress": 1})
    else:
        return JsonResponse({"report_in_progress": 0})


@login_required
def return_doc(request):
    """
    Returns report to user
    """
    fn = request.POST["filename"]
    file = "/app/created_files/" + fn
    doc = Document(file)
    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
    response['Content-Disposition'] = 'attachment; filename={}'.format(fn)
    doc.save(response)
    return response
视图.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', views.get_query, name='form'),
]  + static(settings.STATIC_URL, document_root=settings.STAT)
"""audit_tool_app URL Configuration"""
from django.contrib import admin
from django.urls import include, path
from django.views.generic.base import TemplateView
from django.conf import settings
from django.conf.urls.static import static
from audit_tool import views

urlpatterns = [
                  path('admin/', admin.site.urls),
                  path('accounts/', include('django.contrib.auth.urls')),
                  path('form/', include('audit_tool.urls')),
                  path('report/', include('audit_tool.urls')),
                  path('check_progress/', views.check_progress, name='check_progress'),
                  path('report/return_doc/', views.return_doc, name='return_doc'),
                  path('', TemplateView.as_view(template_name='home.html'), name='home'),
              ] + static(settings.STATIC_URL, document_root=settings.STAT)
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from docx import Document
import os
import threading
from .forms import QueryForm
from .models import *
import time


@login_required
def get_query(request):
    if request.method == 'POST':
        form = QueryForm(request.POST)
        if form.is_valid():
            query = form.cleaned_data["query"]
            fn = "report_" + str(time.time()).replace(".", "_") + ".docx"
            t = threading.Thread(target=generate_doc, args=(query, fn))
            t.start()
            return render(request, "audit_tool/check.html", {"fn": fn})
        else:
            return HttpResponse("Your query does not appear to be valid. Please enter a valid query and try again.")
    else:
        form = QueryForm()
        return render(request, 'audit_tool/form_template.html', {'form': form})


@login_required
def check_progress(request):
    """
    Returns status of document generation
    """
    fn = request.POST["filename"]
    file = "/app/created_files/" + fn
    if not os.path.exists(file):
        return JsonResponse({"report_in_progress": 1})
    else:
        return JsonResponse({"report_in_progress": 0})


@login_required
def return_doc(request):
    """
    Returns report to user
    """
    fn = request.POST["filename"]
    file = "/app/created_files/" + fn
    doc = Document(file)
    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
    response['Content-Disposition'] = 'attachment; filename={}'.format(fn)
    doc.save(response)
    return response
check.html

<!-- templates/django_audit/check.html -->
{% extends 'base_login.html' %}

{% block title %}Please wait{% endblock %}

{% load static %}

{% block content %}
<script type='text/javascript' src="{% static "bootstrap/js/jquery/1.7.1/jquery.min.js" %}"></script>
<script type="text/javascript">
$(document).ready( function() {

    var fn = $('#fn').val()
    var checkInterval = setInterval(isFileComplete, 3000); //3000 is 3 seconds


    function isFileComplete() {

        $.ajax({
        url: '/check_progress/',
        type: 'POST',
        data: {
            'filename': fn,
            'csrfmiddlewaretoken': '{{ csrf_token }}',
        },
        dataType: 'json',
        success: function (data) {
            if (data.report_in_progress == 1) {
                $("#download-button").hide();
            } else {
                $("#download-button").show();
                clearInterval(checkInterval);
            }
        }
        });
   }
   });
</script>
<p><br></p>
<p><br></p>
<div class="alert alert-primary" role="alert">
  <p>Generating {{fn}}...please wait until the Download Report button appears.</p>
  <button type="button" id="download-button" value="Download" onclick="window.open('return_doc')">Download Report</button>
</div>
<input id="fn" type=hidden value="{{fn}}">
{% endblock %}

{%extends'base_login.html%}
{%block title%}请稍候{%endblock%}
{%load static%}
{%block content%}
$(文档).ready(函数(){
var fn=$('#fn').val()
var checkInterval=setInterval(isFileComplete,3000);//3000是3秒
函数isFileComplete(){
$.ajax({
url:“/检查进度/”,
键入:“POST”,
数据:{
“文件名”:fn,
'csrfmiddlewaretoken':'{{csrf_token}}',
},
数据类型:“json”,
成功:功能(数据){
如果(data.report\u in\u progress==1){
$(“#下载按钮”).hide();
}否则{
$(“#下载按钮”).show();
clearInterval(检查间隔);
}
}
});
}
});


正在生成{{fn}}…请等待下载报告按钮出现

下载报告 {%endblock%}
你让这件事变得比实际需要困难得多

POST用于将数据发送到后端,通常用于更新数据库中的某些内容,或者在get_查询视图中用于创建文件。但是,在退货单的情况下,您没有这样做;您正在检索已创建的内容,即文件。因此,您应该继续按原样操作,即发送GET请求

但是,您没有做的事情是发送要检索的文件名。在GET请求中,它位于查询参数中URL的末尾-例如
/mypath/?filename=myfilename
。因此,只需在您的路径中使用它:

onclick="window.open('/return_doc/?filename={{fn}}')"
并且认为:

fn = request.GET["filename"]

(请注意,一个更好的解决方案是在媒体目录中创建文件,这样服务器就可以直接访问和提供文件,而不需要返回文档URL或视图。)

使用充当按钮的
锚定标记如何?你试过了吗?@Paolo我试过了
,它在/report/return\u doc/\\\'filename'\/app/icm\u audit\u tool/views.py的return\u doc\\47中给了我
多值DictKeyError。fn=request.POST[“filename”]\\/usr/local/lib/python3.7/site-packages/django/utils/datastructures.py,位于\uu getitem\\u79中。raise MultiValueDictKeyError(key)
初始错误通过添加前导斜杠得以修复:
onclick=“window.open('/return\u doc/”)”>下载
-但这只会导致与上述相同的错误,因为您实际上没有发布文件名。请改为尝试
请求.POST.get('filename',None)
。在任何情况下,该按钮是否在单击时发送任何数据?看起来您没有任何post数据
filename
被发送到您的视图@卡鲁萨莱伊有一种可怕的感觉,我正在使事情变得比需要的更困难。感谢您的详细解释和解决方案!