轮询和长轮询

轮询:轮询就是第隔N秒访问一次服务器
长轮询:访问一次服务器时间比较长,如20秒,并且如果有数据返回则立马结束

# urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('get_json/', views.get_json),
    path('put_data/', views.put_data),
]

# views
from django.shortcuts import render
from django.http import HttpResponse
import json
from queue import Queue, Empty

que = Queue()


# Create your views here.
def index(request):
    return render(request, 'index.html')


def get_json(request):
    # 轮询
    # data = {'name': 'Alex', 'age': 33}
    # return HttpResponse(json.dumps(data))
    # 轮询结束
    # 长轮询开始
    # 队列模拟长轮询,队列等待10秒
    response = {'status': True, 'data': None}
    try:
        val = que.get(timeout=10)
        response['data'] = val
    except Empty as e:
        response['status'] = False
    return HttpResponse(json.dumps(response))
    # 长轮询结束


def put_data(request):
    que.put('随便放一此数据')
    return HttpResponse('已经发送数据')
# HTML和JS



    
    Title
    


空内容

# JS开始 // 轮询开始 /* $(function () { // 轮询的关键 setInterval(func, 2000) }); function func() { $.ajax({ url:'/get_json/', type:'post', success:function (data) { data = JSON.parse(data); console.log(data); } }) }*/ // 轮询结束 // 长轮询开始 $(function () { func() });
function func() {
    $.ajax({
        url: '/get_json/',
        type: 'post',
        success: function (data) {
            data = JSON.parse(data);
            if (data.status){
                location.href='http://www.baidu.com/'
            }
            // 自己调用自己是长轮询的关键
            func()
        }
    })
}
// 长轮询结束

JS结束

posted on 2020-02-08 01:28  Treelight  阅读(440)  评论(0编辑  收藏  举报