我有一个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 %}