Как поместить файлы JavaScript в другое место, кроме /static, для приложения Flask, работающего в IIS?

Я пытаюсь запустить сервер 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 выполняется та же настройка, что и выше.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня нет опыта работы с 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, несмотря ни на что?

HereForABit 28.08.2024 05:29

Другие вопросы по теме