Flask url_for «статический» в папке шаблонов?

Возможно, есть лучший способ сделать это, но я пытаюсь организовать свое приложение Flask так, чтобы статические шаблоны Javascript и HTML находились в одной папке (аналогично компонентам)

Это просто для организации, я не буду рендерить статику в jinja2.

Итак, вместо этого:

├── templates/
│   ├── login.html
├── static/
│   ├── login.js

Я ищу это (просто идея):

├── components/
│   ├── login/
│   │   ├── login.html
│   │   └── login.js

Или, может быть, это, чтобы я мог сделать оболочку, которая отображает компонент только по имени его папки, например: return render_component('login')

├── components/
│   ├── login/
│   │   ├── template.html
│   │   └── login.js

Идея заключается в том, что внутри шаблона login.html добавляется тег скрипта с url_for до login.js.

Я также открыт для различных идей/способов достижения этой структуры компонентов.


person Mojimi    schedule 28.06.2019    source источник
comment
тогда ваши шаблоны также будут доступны как статические файлы, почему бы не создать сценарий запуска, который копирует статические файлы из вашей папки templates в папку static.   -  person Avm-x    schedule 28.06.2019
comment
Доступно для кого? Разработчик? это нормально для меня   -  person Mojimi    schedule 28.06.2019


Ответы (2)


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

app
|- collections
|    - blueprint_one
|        - configs
|        - static
|           - css
|           - js
|              js_file_one.js
|        - templates
|           - blueprint_one
|              html_file_one.html
|        blue_print_one_view_file_one.py
|        __init__.py   
|    - blueprint_two
|    - blueprint_three
|- static
|    - js
|    - css 
|- templates
__init__.py

Приведенная выше структура папок позволяет отделить не только статические файлы, но и файлы представления Flask.

Ниже приведены примеры активации/импорта файлов:

1) приложение/инициализация.py

app = Flask(__name__, static_folder='static')
app.config.from_pyfile('app_config.py')
# Do all your db set up and etcs..
# Import blueprints below set ups to prevent circular import
app.collections.blueprint_one import blueprint_one
app.collections.blueprint_two import blueprint_two
# Now register blueprints that you've imported
app.register_blueprint(blueprint_one, url_prefix='/blueprint_one')
app.register_blueprint(blueprint_two, url_prefix='/blueprint_two')

2) blueprint_one/init.py

# Create a blueprint
from flask import Blueprint
blueprint_one = Blueprint('blueprint_one_name', __name__, template_folder='templates', static_folder='static')
# Import required views to use
from . import blue_print_one_view_file_one.py

3) blueprint_one/blue_print_one_view_file_one.py

# Import blueprint
from app.collections.blueprint_one import blueprint_one
# Any view functions using above blueprint 
@blueprint_one.route('/login/, methods=['GET'])
def login():
    return render_template('blueprint_one/html_file_one.html')

4) blueprint_one/templates/blueprint_one/html_file_one.html

// Note: instead of .static, you can use blueprint_one.static.
<script type="text/javascript" src="{{ url_for('.static', filename = 'js/js_file_one.js') }}"></script>

5) приложения/статические и приложения/шаблоны по-прежнему можно использовать так, как вы используете их в настоящее время.

Это решение не решает проблему размещения js и html в одной папке, но, по крайней мере, вы можете разделить каждую функцию на компоненты, такие как план, для более модульной структуры проекта.

person Jessi    schedule 28.06.2019

Не существует лучшего способа сделать это, поэтому я хотел бы предложить вам просмотреть, как должны быть настроены проекты фляг.

http://flask.pocoo.org/docs/1.0/tutorial/layout/< /а>

Также я думаю, что на этот вопрос может быть ответ, который решит вашу проблему здесь.

URL-адреса Flask url_for в Javascript

Теперь вот несколько мыслей. Для меня это звучит так, как будто вы хотите использовать шаблоны в файлах, которые находятся в вашей статической папке. Это не то, для чего предназначена статическая папка. Статический означает неизменный, поэтому файлы в вашей статической папке не должны изменяться. Шаблоны должны быть динамичными, что обычно означает, что они меняются. Если вы планируете отображать шаблоны из файлов в вашем статическом каталоге, вы столкнетесь с многочисленными проблемами и, возможно, даже не сможете это сделать. Одна из наиболее заметных проблем, с которыми вы, возможно, столкнетесь, заключается в том, что браузеры не захотят захватывать новые файлы javascript, если они думают, что они находятся в вашем статическом каталоге. Браузеры могут предположить, что они не изменились. Также Flask творит чудеса за кулисами. Когда URL-адрес файла в вашем статическом каталоге обрабатывается от клиента, который уже запросил файловую флягу, возвращает HTTP-КОД 304, что по сути означает «Файл не изменился».

Я мог бы продолжать и продолжать о том, почему вы не должны этого делать. Вместо этого, если ни одна из приведенных выше сведений не решает ваш вопрос, я хотел бы предложить вам поместить свои шаблоны javascript в подкаталог вашего каталога шаблонов. Затем используйте следующий код, чтобы вернуть их.

@app.route('/js/<file_name>',methods=['GET'])
def get_js_templates(file_name):
    return render_template('js/'+file_name)

Я ни в коем случае не являюсь экспертом в какой-либо области, но я занимался разработкой полного стека с использованием веб-фреймворка flask. Если у вас есть еще вопросы, оставьте комментарий к этому посту.

person West    schedule 28.06.2019
comment
Я не пытаюсь визуализировать свою статику, все, что я хочу, это чтобы они находились в той же папке, что и html, просто для организации, в конце концов, все то же самое. - person Mojimi; 28.06.2019
comment
тогда я понятия не имею, о чем вы спрашиваете. Ко всему, что вы помещаете в свой статический каталог, можно получить доступ с помощью url_for('static','sub_directory/file_name.file_extension'), который генерирует URL-адрес, аналогичный следующему current_domain/static/sub_domain/file_name.file_extension, и возвращает необработанный файл, если он имеет изменился с момента последнего запроса запрашивающей стороной. - person West; 28.06.2019