每个带有扩展的页面都会重新加载javascript(并重新建立ws连接)

时间:2019-02-20 10:49:27

标签: django websocket django-channels

美好的一天,

我有点想解决一个问题,却找不到解决办法。

我有基本模板和两个扩展基本模板的模板。基本模板包括websocket.js文件,该文件在用户打开页面时建立WebSocket连接。问题是,当他单击指向某些子页面的链接时,浏览器将重新加载所有静态文件,包括websocket.js,这将导致WebSocket连接的断开/重新连接。

问题我该如何避免这种重新加载。应该避免使用扩展并转移到jQuery样式的动态页面更新而不进行任何重新加载,或者我可以将javascript WebSocket对象保留在全局中的某个位置,并且如果此对象不是未定义的,则不要建立新的连接(我也不知道该怎么做)

websocket.js很简单:

var websocketServerLocation = 'ws://' + window.location.host +
    '/ws/dashboard/';

function start(websocketServerLocation) {
    ws = new WebSocket(websocketServerLocation);
    ws.onmessage = function (e) {
        var data = JSON.parse(e.data);
        drawDashboard(data);
    };
    ws.onclose = function () {
        // Try to reconnect in 5 seconds
        setTimeout(function () {
            start(websocketServerLocation)
        }, 5000);
    };
}

start(websocketServerLocation);

base.html:

{% load staticfiles %}
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    ....
    <script type="text/javascript" src="{% static "websocket.js" %}"></script>
</head>
<body>
    ...

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="{% url 'child1' %}">child1<span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="{% url 'child2' %}">child2</a>
     ....
</html>

一些“孩子”:

{% extends "base.html" %}
{% load staticfiles %}
{% block content %}

{% endblock %}

1 个答案:

答案 0 :(得分:0)

Django将每个模板视为新页面或请求,即使它们扩展了相同的基本模板。因此,将无法保留基本模板。通过其他方式,您可以使所有内容都通过jQuery和ajax运行以完成工作。