Django+Json+Jquery产生局部刷新


需求:

想使用Python创建一个ETL工具,其中页面部分采用Django框架,调度的显示及控制通过Web页面进行操作。

因此调度的数据抽取、加载、存储过程跑数过程需要实时(准实时)显示处理记录条数(进度),因此需要开发局部刷新页面,以达到此效果。


备注:由于当前并未创建ETL工具,因此采用读取系统任务列表来举例。


实现过程:

1. django-admin创建项目(创建app)—— 步骤略。

2. 配置urls、templates目录、static目录及其下的js等内容 —— 步骤略。

3. 创建templates/index.html文件,内容如下:




	RealTime Test
	
	
	
	
	  
	


    
    
    

tasklist

4. 创建(或在app/views.py文件中)函数index和json_tasklist:

# -*- coding:utf-8 -*-
from django.shortcuts import render_to_response
from django.http import HttpResponse
import json
from subprocess import Popen, PIPE


def index(req):
    '''No comment'''
    template = 'index.html'
    return render_to_response(template, {})


def json_tasklist(req):
    '''产生Json数据并显示在页面中
    Args:
        None
    Returns:
        dict:    {"arr":array_with_tasklist}
    Raises:
        None
    '''
    #通过Popen命令执行cmd下的tasklist命令(windows中),在linux里面对应是使用ps -ef命令
    #下面以tasklist命令为例,如果是ps -ef命令,分隔符和行格式都要相应变化
    p = Popen(['tasklist'], stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)
    #转义unicode字符串并且按行分割成临时数组
    arr_temp = p.stdout.read().decode('gbk').split('\r\n')
    col_len = [] #此数组用于记录每一个列的宽度
    total_col = len(arr_temp[2].split(" ")) #共有多少列(实际上就是5列)
    for col in arr_temp[2].split(" "):
        col_len.append(len(col))
    
    arr_p = [] #此数组存储最终的数据结果
    for line in arr_temp[2:]:
        if line != "": #跳过空行(首尾)
            line_col = [] #每一行列数据的集合数组
            left = 0  #数据片段的左端点
            right = 0 #数据片段的右端点,结合在一起用来切分line字符串的
            for i in range(total_col):
                if i == 0:
                    left = 0
                else:
                    left = right + 1
                right = left + col_len[i]
                line_col.append(line[left:right]) #切开,如果想要更完美一点,应该还需要trim一下的,不过python已经默认帮我们做了。
            arr_p.append(line_col)
    jsondict = {"arr":arr_p} #生成json字典,形如:{"key1":[array1],"key2":"value2",......}
    jsondata = json.dumps(jsondict) #使用dumps方法格式化数据
    return HttpResponse(jsondata)
5. runserver:

Django+Json+Jquery产生局部刷新_第1张图片

后记:

1. 这种方式产生的计算压力除了在用户bownser刷新,还有会在服务端产生执行脚本的压力,建议不要实时查询数据库,而是通过读取文件的形式生成json数据,而且调整大的时间间隔,避免频繁调用产生的系统压力。

2. 这里需要调用js文件,如果没有正确配置static,就没法调用js,如果不会调用,可以参考以下文章:

django模板中如何导入js、css等外部文件

实在不行的话,留言吧。


你可能感兴趣的:(Python,Django,Django,json,jquery)