Я пытаюсь запустить сервер Flask с помощью IIS и загружать файлы JavaScript из другого места, кроме /static, поскольку я хочу организовать свой проект постранично, а не сбрасывать все в /static и/templates. Предыдущие вопросы, такие как этот , не решают мой вопрос, поскольку они касаются простой загрузки JavaScript из /static, а это не то, что я ищу. Ни это , ни это мне не помогло.
Я не использую jQuery, и мой index.html находится в /, а не в /templates.
Файлы index.html и index.js содержат одну и ту же информацию как для сервера, запускаемого напрямую Flask, так и для сервера, работающего с IIS. Сервер IIS работает по адресу 192.168.1.87:80, IP-адресу хост-машины.
index.html
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style = "width: 300px; height: 300px; background-color: red;" id = "testDiv"></div>
<!--<script src = "index.js"></script>-->
<!-- <script src = "/static/index.js"></script> -->
<!-- <script src = "/stuff/index.js"></script> -->
<!-- <script src = "{{ url_for('static', filename='index.js') }}"></script> -->
<!-- <script src = "/index.js"></script> -->
<!--<script src = "../stuff/index.js"></script> -->
<script src = "../index.js"></script>
</body>
</html>
index.js
document.getElementById("testDiv").style.backgroundColor = "blue";
app.py запускается только с помощью Flask
from flask import Flask, send_from_directory
app = Flask(__name__, static_folder = "stuff")
#app = Flask(__name__, static_folder = "")
#app = Flask(__name__)
@app.route("/")
def index():
return send_from_directory("", "index.html")
if __name__ == '__main__':
app.run()
app.py запускается с сервером IIS
from flask import Flask, send_from_directory
app = Flask(__name__)
@app.route("/")
def index():
return send_from_directory("", "index.html")
if __name__ == '__main__':
app.run(host = "192.168.1.87", port=80)
Все ошибки, возвращаемые веб-сайтом, запущенным IIS, — это GET http://192.168.1.87/index.js net::ERR_ABORTED 404 (NOT FOUND), а все ошибки автономного сервера Flask — 404. Все ошибки связаны с вызовом скрипта в index.html.
Мне не удалось send_from_directory или url_for работать с JavaScript ни на серверах Flask, ни на серверах IIS, которые были рекомендованы здесь (в обоих случаях сервер возвращает 404).
На автономном сервере Flask, если static_folder = "stuff" и вызов скрипта в index.html <script src = "/stuff/index.js"></script> правильно загружают JavaScript из /stuff, а если static_folder будет чем-то иным, кроме «stuff», с вызовом скрипта в index.html, то <script src = "/static/index.js"></script> правильно загружает JavaScript из /static, но наличие static_folder = "stuff" и вызова скрипта <script src = "/static/index.js"></script> и наоборот вызывает ошибку 404.
Использование <script src = "/static/index.js"></script> с static_folder, для которого не установлено значение «stuff», на сервере IIS правильно загружает JavaScript из /static, но не работает, если с /stuff выполняется та же настройка, что и выше.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У меня нет опыта работы с IIS, но мне кажется, что у вас непонимание шаблонов и статических файлов.
Шаблоны с такими выражениями, как url_for(), находятся в каталоге, выбранном при создании экземпляра приложения ( template_folder , по умолчанию templates) и требуют вызова render_template() внутри конечной точки.
# Serve 'index.js' from the static-folder with a template called 'index.html'.
# The URL to 'index.js' is 'http://127.0.0.1:5000/static/index.js'.
app = Flask(__name__, template_folder='templates')
@app.route('/')
def index():
return render_template('index.html', **locals())
<script src = "{{ url_for('static', filename='index.js') }}"></script>
|- app.py
|- static
| |- index.js
| |- ...
|
|- templates
|- index.html
Статические файлы находятся в отдельном каталоге (по умолчанию static). Каталог также можно изменить во время создания экземпляра, указав static_folder . Кроме того, префикс пути URL-адреса можно изменить, указав static_url_path.
Например, вы можете назначить '' для обслуживания файлов, которые находятся в статической папке, но должны обслуживаться без префикса, например static, в URL-адресе.
Если вы хотите вернуть статический файл в конечной точке, app.send_static_file() предпочтительнее send_from_directory().
Обратите внимание, что Jinja, механизм шаблонов Flask, не учитывает эти статические файлы.
# Serve 'index.js' from the static-folder with a static file called 'index.html'.
# The URL to 'index.js' is 'http://127.0.0.1:5000/index.js'.
app = Flask(__name__,
static_folder='static',
static_url_path=''
)
@app.route('/')
def index():
return app.send_static_file('index.html')
<script src = "/index.js"></script>
|- app.py
|- static
| |- index.html
| |- index.js
| |- ...
|
|- templates
Установка static_folder = "" и static_url_path = "" сработала. Почему send_static_file() предпочтительнее send_from_directory()? Разве это не одно и то же, за исключением того, что send_static_file() будет иметь каталог static_folder, несмотря ни на что?