Django1.6+jQuery Ajax + JSON 实现页面局部实时刷新


最近微信公众帐号要扩展做一个签到系统,签到结果在一个网页上实时更新,即页面局部刷新。我想用Ajax来实现,之前公众帐号是用的Django搭的,我查找了Django的官方文档,没有封装Ajax。网上有各种方法,眼花缭乱。之前在图书馆借了本书《Django Web 开发指南》里面,有Ajax的实例,但是旧版本的Django,代码没法运行,但是里面倒是提供一种方法——把数据翻译成JSON格式,然后按照我们的格式返回字符串结果,在写到HttpResponse里去。我借鉴了其中的方法。查了Django的官方文档,我修改了书中的代码,可以正常运行。自己也写了一个demo

  我的直接简单地在view.py把数据存在一个list中,然后用JSON格式储存,写到HttpResponse中

from django.http import HttpResponse
from django.shortcuts import render_to_response
import json

def data(request, id):
    rlist = [['Jack', 'Chinese'], ['Mike', 'English'], ['Bob', 'Math'], ['Frank', 'Art'], ['Lucy', 'Music']]
    rlist2 = []
    rlist2.append({"name" : rlist[int(id)][0], "subject" : rlist[int(id)][1]})
    rjson = json.dumps(rlist2)
    response = HttpResponse()
    response['Content-Type'] = "text/javascript"
    response.write(rjson)
    return response
    
def update(request):
    return render_to_response('update.html')

 

   url.py中有两个地址,一个是展示页面,一个是数据保存地址

from django.conf.urls import patterns,  url
from AjaxTest.views import data, update

urlpatterns = patterns('',
    url(r'^data/(?P<id>\d+)/$', data),
    url(r'^update/', update)
)

 

  访问http://127.0.0.1:8000/data/id/, id数字,可获取JSON数据

  

 

 

 

 

  这一步很关键,接下来我们编写和这个API视图交互Javascript,并用它来响应页面。我用jQuery中的ajax,每隔3秒执行一次 udate() 函数,用jQuery的 getJSON 方法,发送URL请求,解析结果,这样完成Ajax,Javascript代码如下

function update(id) {
   $.getJSON("/data/" + id + "/",function(data) {
      $.each(data, function(){
         $("#content").html('<p>' + this.name + ' is a ' + this.subject + ' teacher.</p>');
         });
   });
}
function timeDown(limit, i) {
   limit--;
   if (i > 4) {
       i = 0;
   }
   if (limit < 0) {
       limit = 3;
       update(i);
       i++;
   }
   $('#time').text(limit + '秒后刷新');
       setTimeout(function() {
           timeDown(limit, i);
            }, 1000)
}
           
$(document).ready(function() {
   timeDown(3, 0)
})

 

  html页面代码

<html>
 <head>
   <title>Ajax Test</title>
   <script src="http://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
   <script type="text/javascript" language="javascript">
           function update(id) {
               $.getJSON("/data/" + id + "/",function(data) {
                $.each(data, function(){
                    $("#content").html('<p>' + this.name + ' is a ' + this.subject + ' teacher.</p>');
                });
               });
           }
           function timeDown(limit, i) {
               limit--;
               if (i > 4) {
                   i = 0;
               }
               if (limit < 0) {
                   limit = 3;
                   update(i);
                   i++;
               }
               $('#time').text(limit + '秒后刷新');
               setTimeout(function() {
                   timeDown(limit, i);
               }, 1000)
           }
           
           $(document).ready(function() {
               timeDown(3, 0)
        })
   </script>
 </head>
 <body>
   <h1>Ajax Test</h1>
   <p id="time"></p>
   <div id="content"></div> 
 </body>
</html>

  运行服务器,访问http://127.0.0.1:8000/update/,每隔3秒刷新一次更新内容,如下图

   

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Django实现进度条,可以使用Django框架提供的HttpResponse对象和Ajax技术。 首先,在views.py中编写一个函数,用于处理上传文件的请求。该函数可以使用Python的os模块来执行上传文件的操作,并在上传过程中输出进度信息。 然后,在该函数中使用Django的HttpResponse对象来返回上传进度信息。可以将进度信息转化为JSON格式,并使用HttpResponse对象的content_type参数来指定返回的数据类型。 最后,在前端使用Ajax技术来获取HttpResponse对象中的进度信息,并将其显示在进度条上。 下面是一个简单的示例代码: ```python # views.py import os from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt import json @csrf_exempt def upload(request): if request.method == 'POST': file = request.FILES.get('file') file_path = '/path/to/upload/directory/' + file.name with open(file_path, 'wb+') as f: for chunk in file.chunks(): f.write(chunk) uploaded_size = f.tell() total_size = file.size progress = uploaded_size / total_size response_data = { 'progress': progress, 'uploaded_size': uploaded_size, 'total_size': total_size } response_json = json.dumps(response_data) response = HttpResponse(response_json, content_type='application/json') response['Content-Length'] = len(response_json) yield response # upload.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Upload File</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> </head> <body> <form id="upload-form" method="POST" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="file"> <button type="submit">Upload</button> </form> <div> <progress id="progress-bar" value="0" max="1"></progress> <span id="progress-text">0%</span> </div> <script type="text/javascript"> $(document).ready(function() { $('#upload-form').submit(function(event) { event.preventDefault(); var formData = new FormData(this); $.ajax({ url: '/upload/', type: 'POST', data: formData, processData: false, contentType: false, xhr: function() { var xhr = new window.XMLHttpRequest(); xhr.upload.addEventListener('progress', function(event) { if (event.lengthComputable) { var percentComplete = event.loaded / event.total; $('#progress-bar').val(percentComplete); $('#progress-text').text(percentComplete * 100 + '%'); } }, false); return xhr; }, success: function(response) { console.log('Upload complete!'); }, }); }); }); </script> </body> </html> ``` 在这个例子中,upload函数会处理上传文件的请求,并在上传过程中输出进度信息。在前端,使用Ajax技术来获取HttpResponse对象中的进度信息,并将其显示在进度条上。 通过访问http://yourdomain.com/upload/即可上传文件并动态显示进度条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值