我有一个 Django 应用程序,在 Admin 中有一个页面,我可以在其中上传产品数据的 zip 文件,然后进行处理。我status_message
在 Python 中设置了列表,以便它不断更新有关处理进展情况的信息。
在 Firefox 上,在我的开发环境中进行此操作时,效果很好。当我在 Chrome 上测试它时,报告根本不再显示。更重要但可能相关的是,当我推送到我的登台服务器并对其进行测试时,一旦上传发生并且文件开始被处理,我就会被重定向到 404 错误页面,我不知道为什么. 我能想到的最大区别是登台服务器上的 SSL,但不是我的开发环境。最后,可能是由于我对AJAX + Django的缺乏经验,加载状态消息后有一个最终页面刷新。这很烦人,但并没有造成真正的伤害(除非它也导致了其他问题之一)。我的头在旋转。这是怎么回事?一条线是问题,我的观点,还是整个问题?
问题 1. div 中的报告在#status-message
Firefox 中更新,而不是 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 %}