从不同项目运行时,Flask会加载相同的index.js文件

时间:2019-03-22 11:34:59

标签: javascript python flask

尝试在本地运行flask应用程序时遇到以下问题:我使用URL_FOR并直接尝试指定index.js文件的路径,但它始终加载不同当我尝试在本地运行flask应用程序时使用index.js。

文件夹设置:

folder with source code of sample projects from a course i'm doing
-project1
--templates
---index.html
--static
---index.js
--application.py
-project2
--templates
---index.html
--static
---index.js
--application.py
-project3
--templates
---index.html
--static
---index.js
--application.py
-... 

->假设我现在在终端中处于project2中。 我正在运行导出FLASK_APP=application.py,然后运行python3 -m flask run,它按如下方式在localhost 5000上为应用程序服务:

* Serving Flask-SocketIO app "application.py" * Forcing debug mode off

看起来一直到现在。但是,这很有趣–>当我导航到http://127.0.0.1:5000/inspect时,它总是引用我/ project1 / static文件夹中的index.js。

我在index.html中正在做什么:

<!DOCTYPE html>
<html>
    <head>
        <script src="{{ url_for('static', filename='index.js') }}"></script>
        <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
        <title>Vote</title>
    </head>
    <body>
        <ul id="votes">
        </ul>
        <hr>
        <button data-vote="yes">Yes</button>
        <button data-vote="no">No</button>
        <button data-vote="maybe">Maybe</button>
    </body>
</html>

我的index.js是什么样的:

document.addEventListener('DOMContentLoaded', () => {

    // Connect to websocket
    var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);

    // When connected, configure buttons
    socket.on('connect', () => {

        // Each button should emit a "submit vote" event
        document.querySelectorAll('button').forEach(button => {
            button.onclick = () => {
                const selection = button.dataset.vote;
                socket.emit('submit vote', {'selection': selection});
            };
        });
    });

    // When a new vote is announced, add to the unordered list
    socket.on('announce vote', data => {
        const li = document.createElement('li');
        li.innerHTML = `Vote recorded: ${data.selection}`;
        document.querySelector('#votes').append(li);
    });
});

我的application.py如下所示:

import os
import requests

from flask import Flask, jsonify, render_template, request
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
socketio = SocketIO(app)

@app.route("/")
def index():
    return render_template("index.html")

@socketio.on("submit vote")
def vote(data):
    selection = data["selection"]
    emit("announce vote", {"selection": selection}, broadcast=True)

if __name__ == '__main__':
    app.run()

我的答案

  • 我发现了一种有趣的方法来自己修复它:如果我只是将其重命名为“ main.js”并引用它,则它可以工作。

问题

  • 有什么主意在这里吗?我是否以错误的方式引用index.js?
  • 不可能只是在一个父文件夹中根本不能包含多个index.js文件,对吧?

1 个答案:

答案 0 :(得分:0)

IMO,浏览器将缓存静态文件。由于您所有的JavaScript文件都名为index.js,因此所有项目中的路径均为/static/index.js。浏览器会查看静态文件的路径,“哦,它是同一个文件!所以我只是从缓存中读取”。

因此,您唯一需要做的就是clear browser cache(也许只是使用 Ctrl + F5 )。