上传/处理数据文件时出现Django / AJAX状态消息的问题

时间:2013-09-25 23:11:38

标签: ajax django ssl django-forms django-templates

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

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

问题1。 div #status-message中的报告会在Firefox中更新,但不会在Chrome中更新。

编辑1:原来这部分来自Chrome 28缓存。见Jquery ajax random error in Chrome only。现在,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-load/print_status/?_=1380231818430的不安全内容。”我还没弄明白如何解决这个问题。整个站点应该使用SSL,如果你复制第二个路径,它甚至会转发到https版本。 AJAX中的url:似乎并不重要。我甚至用https前缀完全硬编码了网址,它也说了同样的话:url: https://myapp.com/admin/product-load/print_status",

问题3。处理完成后令人讨厌的页面刷新。

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

views.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")

urls.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'),
)

forms.py

from django import forms

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

的index.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 %}

0 个答案:

没有答案