0

我有一个 Django 应用程序,在 Admin 中有一个页面,我可以在其中上传产品数据的 zip 文件,然后进行处理。我status_message在 Python 中设置了列表,以便它不断更新有关处理进展情况的信息。

在 Firefox 上,在我的开发环境中进行此操作时,效果很好。当我在 Chrome 上测试它时,报告根本不再显示。更重要但可能相关的是,当我推送到我的登台服务器并对其进行测试时,一旦上传发生并且文件开始被处理,我就会被重定向到 404 错误页面,我不知道为什么. 我能想到的最大区别是登台服务器上的 SSL,但不是我的开发环境。最后,可能是由于我对AJAX + Django的缺乏经验,加载状态消息后有一个最终页面刷新。这很烦人,但并没有造成真正的伤害(除非它也导致了其他问题之一)。我的头在旋转。这是怎么回事?一条线是问题,我的观点,还是整个问题?

问题 1. div 中的报告在#status-messageFirefox 中更新,而不是 Chrome。

编辑 1:原来这部分来自 Chrome 28 缓存的东西。请参阅仅 Chrome 中的 Jquery ajax 随机错误。现在有了这个,Chrome 会在所有处理后显示消息,但直到那时状态消息才会发生变化:

function retrieve_status()
{
  $.ajax({
    url: "print_status",
    success: function(data){
      $('#status-message').html("");
      for (var i=0; i<data['message'].length; i++)
        $('#status-message').append(data['message'][i] + "<br>");
        $('#status-message').scrollTop($('#status-message')[0].scrollHeight);
    },
    cache: false
  });
}

问题 2.仅在登台服务器上进行 zip 上传后出现 404 错误。

编辑 2:在登台服务器的浏览器控制台中,我收到警告“ https://myapp.com/admin/product-load/的页面显示来自http://myapp.com/admin/product-的不安全内容加载/打印状态/?_=1380231818430。” 我还没有想出如何解决这个问题。整个站点应该使用 SSL,如果您在第二个路径中复制,它甚至会转发到 https 版本。AJAX 中的url:似乎无关紧要。我什至用 https 前缀对 url 进行了完全硬编码,它说了同样的话:url: https://myapp.com/admin/product-load/print_status",

问题3.处理完成后烦人的页面刷新。

这是我的代码。我没有修剪太多,因为我不确定什么是相关的或不相关的。

视图.py:

from django.http import HttpResponse
from django.shortcuts import render
from django.contrib.admin.views.decorators import staff_member_required
from myappload.forms import ProductLoadForm
from myappload.load import ProductLoader
import json

status_message = []

@staff_member_required
def index(request):
    global status_message
    status_message = []
    if request.method == 'POST':
        form = ProductLoadForm( request.POST, request.FILES)
        if form.is_valid():
            product_data = request.FILES.get('file')
            loader = ProductLoader( zip_filename=product_data, index=False, status=record_status)
            load_report = loader.load()
            return render ( request, 'myappload/index.html', { 'form': form})
    else:
        form = ProductLoadForm()
    return render ( request, 'myappload/index.html', { 'form': form})

def record_status(status):
    global status_message
    status_message.append(status)
    print status

def print_status(request):
    return HttpResponse(json.dumps({ 'message': status_message }), content_type="application/json")

网址.py

from django.conf.urls.defaults import patterns, url

#  URLs
urlpatterns = patterns('myappload.views',
    url(r'^$', 'index', name='product_load_page'),
    url(r'^print_status/$', 'print_status', name='product_upload_status'),
)

表格.py

from django import forms

class ProductLoadForm(forms.Form):
    file = forms.FileField()

索引.html:

{% extends "admin/base_site.html" %}

{% block content %}
<form name="product_load_form" class="form form-horizontal"
enctype="multipart/form-data" method="post">
  {% csrf_token %}
  {% include 'forms/basic.html' %}
  <input id="upload-button" type="submit" value="Upload"/>
</form>
<div id="status-message">
The status message will show up here <br>
</div>

<script>
function retrieve_status()
{
  $.get("print_status", function( data ) {
    $('#status-message').html("");
    for (var i=0; i<data['message'].length; i++)
      $('#status-message').append(data['message'][i] + "<br>");
      $('#status-message').scrollTop($('#status-message')[0].scrollHeight);
  });
}

$(document).ready(function() {
  retrieve_status();  //the page will refresh when done, calling this on load
  $('#upload-button').click(function() {
    setInterval(function(){retrieve_status()},500);
  });
  $('#status-message').css('height', $(window).height() - 170);
});
</script>
{% endblock %}
4

0 回答 0