Служите статическим файлам из подпрограммы в web.py

Я пишу веб-приложение в web.py (переписывание / расширение mongs), которое я хочу использовать как в качестве отдельного приложения, так и в качестве вспомогательного приложения, в которое можно перенаправлять запросы. Проблема, с которой я сталкиваюсь, заключается в том, что, когда оно используется в качестве вспомогательного приложения, статические файлы не могут легко обслуживаться из его собственного статического каталога. Поскольку я намереваюсь распространять это (и не требовать, чтобы пользователи объединяли файлы в статический каталог своего проекта), я хочу, чтобы структура каталогов была:

app_that_is_using_mongs (not mine)
    static (which holds the app's static files - also not mine)
    mongs (my subapp)
        main.py (the code for mongs)
        view (holds templates)
        static (the static folder for mongs)
    main.py (the code for the app that is using mongs)

... так что весь каталог mongs отделен от любого приложения, которое его использует.

Я рассмотрел несколько возможностей заставить это работать:

  • Использование обработчика запросов, который читает и выводит файлы из статического каталога, например:

    cwd = os.path.dirname(__file__) + '/'  # get current working directory
    
    class Static:
        def GET(self, filename):
            """searches for and returns a requested static file or 404s out"""
            try:
                return open(cwd + 'static/' + filename, 'r').read()
            except:
                web.application.notfound(app)  # file not found
    

Я не уверен в производительности этого решения для больших файлов, и кажется, что это должно быть что-то, что web.py может сделать самостоятельно.

  • Добавление другого статического каталога с помощью доступа к инструменту cherry.py staticdir через web.py... Я не уверен, как сделать что-то подобное (напрямую взаимодействовать с сервером, на котором работает web.py), и я не думаю, что все равно будет работать, если я перейду на сервер Gunicorn (или любой сервер, кроме cherry.py).

  • Исправление способа, которым web.py обрабатывает статические файлы, чтобы сделать его более расширяемым... Если другого пути нет, то, возможно, лучше переписать эту часть web.py и, возможно, поместить ее в основной репозиторий.

Итак, каков наилучший способ сделать это?

1 ответ

Решение

В web.py статические ресурсы не обслуживаются через маршрутизатор приложения. Вместо этого на http-сервере есть проверка, с чего начинается URL-адрес запроса. /static, Это означает, что если у вас есть суб-приложение или нет, /static/... карты непосредственно к static каталог в корневом приложении.

Ваша первая идея создания статического класса определенно сработает, но вы правы, что есть определенное влияние на производительность - хотя вам придется сравнить его, чтобы действительно знать, насколько он плох.

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

parent_app/
    static/
        sub_app/ -> parent_app/sub_app/static/sub_app
        ...
    sub_app/
        static/
            sub_app/
                ...

Затем, когда вы хотите получить доступ к статическому активу из sub_app, вы бы ударил URL, как: /static/sub_app/asset, Поскольку этот URL начинается с /static, он будет пойман http-сервером и перенаправлен на static каталог, следуя мягкой ссылке, и разрешает фактический актив. Из-за sub_app каталог, это решение будет работать при непосредственном запуске sub_app или запуске parent_app. Вам нужно будет установить эту мягкую ссылку на каждом сервере, на котором вы развертываете, и для каждой среды разработки, что делает это не идеальным.

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