Flask загружает один и тот же файл index.js при запуске из другого проекта - PullRequest
1 голос
/ 22 марта 2019

Я сталкиваюсь со следующей проблемой при попытке запустить приложение фляги локально: я использовал URL_FOR и напрямую пытался указать путь к файлу index.js, но он всегда загружает другой индекс.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
-... 

-> Скажем, я сейчас в проекте 2 в моем терминале.Я запускаю экспорт FLASK_APP=application.py, затем python3 -m flask run, и он обслуживает приложение на локальном хосте 5000 согласно:

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

Выглядит нормально до сих пор.Однако вот что интересно -> когда я перехожу к http://127.0.0.1:5000/, и inspect, он всегда ссылается на index.js в моей папке / project1 / static.

Что я делаю в 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 голосов
/ 23 марта 2019

IMO, браузер будет кешировать статические файлы. Поскольку все ваши файлы JavaScript с именем index.js, путь во всем вашем проекте будет /static/index.js. Браузер посмотрит путь статики: «О, это тот же файл! Поэтому я просто читаю из кеша».

Итак, единственное, что вам нужно сделать, это очистить кеш браузера (может быть, просто с помощью Ctrl + F5 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...