Колба служит автономным статическим проектом - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть несколько уже завершенных, автономных статических проектов, которые я хотел бы использовать вместе с Flask.Мой каталог проектов выглядит примерно так:

- flask
  - flaskr.py
  - projects
    - project1
      - index.html
      - css.css
      - js.js
    - project2
      - ...
    - ...

Я пытался просто send_static_file my index.html:

@app.route('/proj1')
def proj1():
  return app.send_static_file("projects/index.html")

Однако, в нем есть ссылки на css.css и js.js затем укажите /css.css и /js.js вместо /projects/project1/css.css и /projects/project1/js.js.

Я также пытался изменить app.root_path перед вызовом send_static_file, а затем сбросить его, ноэто всегда приводит к 404.

Вставка тега <base href="/projects/project1/"> сразу после <head>, кажется, работает, но мне кажется хакерским.Я хотел бы найти более «правильное» решение.

Как мне этого добиться?Я не хочу изменять любой код в проектах;оно должно быть как можно более простым.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

В мой другой ответ Я обрисовал причину этой проблемы и предложил решение, чтобы браузер мог определить правильную позицию ресурса.Еще одна возможность для колбы выяснить, какой ресурс на самом деле хотел браузер.«Обычно» браузер отправляет заголовок реферера с запросом (хотя бывают исключения), и мы можем использовать это, чтобы определить, какое значение css.css означало:

from flask import request
@app.route('/css.css')
def css():
    r = request.referrer
    if r.endswith("proj1"):
        app.send_static_file("projects/project1/css.css")

Это довольнохакерски и лично я бы не советовал, по сути, вы либо должны жестко закодировать проекты, либо реализовать некоторую регистрацию, чтобы автоматизировать это.

0 голосов
/ 11 октября 2018

Как утверждает @ jpmc26, вопрос не верен с самого начала.Flask следует использовать для динамического сайта, и он является излишним и не подходит для этого варианта использования.Вместо этого рекомендуется использовать веб-сервер, такой как Nginx.Если когда-либо потребуется динамическое содержимое, Nginx сможет направлять запросы на дочерний сервер Flask.

0 голосов
/ 28 сентября 2018

Насколько я знаю, send_static_file только отправляет статический файл, он не переписывает или что-то еще.Таким образом, файл поступает на клиент так же, как и в файловой системе.

Браузер получает /proj1 и получает файл HTML с надписью «Также скачайте css.css и добавьте его в этот документ».Браузер не знает, что файл HTML изначально находится на /projects/project1/index.html, он только знает, что к нему обращались /proj1.Таким образом, он ищет файл css.css относительно файла, к которому он обращался, поэтому он ищет /css.css.

Если вы обслуживаете index.html через /projects/project1/index.html (или любой другой путь, который находится в /projects/project1/) относительный поиск приведет к /projects/project1/css.css.

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