Определите каталог * stati c для каждого маршрута (URL) в flask - PullRequest
3 голосов
/ 20 января 2020

У меня есть несколько файлов: 1.html, 2.html, et c. которые имеют это содержание:

1. html имеет

<h1>Hello</h1>
<img src="1-directory/image.jpg" />

2. html имеет

<h1>Hello</h1>
<img src="2-directory/image.jpg" />

et c.

Итак, у каждого файла есть изображение в <i>-directory/ (i варьируется: 1, 2, 3, ...). Как я могу загрузить эти изображения в flask для каждого файла.

Мой маршрут:

@app.route('/docs/show/<int:i>')
def show(i):
    with open(i + '.html', 'r') as f:
        content = f.read()
        return render_template('show.html', content = content)

, а мой шаблон show.html равен

{content | safe}

Так Я хочу установить <i>-directory в flask для каждого файла и, таким образом, отображать соответствующее изображение.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Вы должны создать папку stati c, а затем добавить все папки с изображением. Вы можете следовать этой структуре каталогов:

PROJECT NAME
>> static
  >> 1-directory
      >> 1.jpg
  >> 2-directory
      >> 2.jpg
  >> 3-directory
      >> 3.jpg
  >> 4-directory
      >> 4.jpg
>> templates
  >> 1.html
  >> 2.html
  >> 3.html
  >> 4.html
  >> show.html
>> venv folder
>> app.py

Вы можете использовать этот код для app.py :

import flask

app = flask.Flask(__name__)

@app.route('/docs/show/<string:i>', methods=['GET'])
def show(i):
    with open('templates/' + str(i) + '.html', 'r') as f:
        content = f.read()
    return flask.render_template('show.html', content = content)

if __name__=='__main__':
    app.run('0.0.0.0',port=<your_port_name>)

Вы можете сохранить 1. html как показано ниже:

<h1>Hello</h1>
<img src="/static/1-directory/1.jpg" />

Вы можете сохранить 2. html, как показано ниже:

<h1>Hello</h1>
<img src="/static/2-directory/2.jpg" />

Вы можете сохранить 3. html как показано ниже:

<h1>Hello</h1>
<img src="/static/3-directory/3.jpg" />

Вы можете сохранить 4. html, как показано ниже:

<h1>Hello</h1>
<img src="/static/4-directory/4.jpg" />

И , вы можете отобразить свой код в шоу. html (так же, как вы это показали):

<html>
<body>{{content | safe}}</body>
</html>

РЕДАКТИРОВАТЬ (согласно вашим комментариям):

Я создал файловую структуру следующим образом в соответствии с вашими комментариями:

PROJECT NAME
>> templates
  >> 1-directory
      >> 1.jpg
  >> 2-directory
      >> 2.jpg
  >> 3-directory
      >> 3.jpg
  >> 4-directory
      >> 4.jpg
  >> 1.html
  >> 2.html
  >> 3.html
  >> 4.html
  >> show.html
>> venv folder
>> app.py

Вы можете кодировать app.py следующим образом:

@app.route('/docs/show/<string:i>', methods=['GET'])
def show(i):
    internal_html = flask.render_template(str(i)+'.html', file_name = str(i)+'-directory/'+str(i)+'.jpg')
    return flask.render_template('show.html', content = internal_html)

@app.route('/serve_file/<path:filename>')
def serve_file(filename):
    return flask.send_from_directory('templates/', filename)

Все ваши HTML файлы будут такими, как показано ниже:

<h1>Hello</h1>
<img src="{{ url_for('serve_file', filename=file_name) }}" />

Кроме того, ваше шоу. html будет такой же, как приведенный выше код. Здесь мы используем этот send_from_directory , потому что flask не служит кроме папки / stati c. Таким образом, для внешнего использования папки мы должны использовать send_from_directory .

0 голосов
/ 27 января 2020

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

Но чтобы ответить на вопрос, есть несколько способов go, в зависимости от этого. о том, насколько "волшебным" вы хотите, чтобы решение было. (Я предполагаю, что если вы хотите, чтобы flask обрабатывал это, то вам нужно magi c)

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

import functools

def inject_snippet(func):
    @functools.wraps(func)
    def wrapper(i, *args, **kwargs):
        filepath = f"{i}-directory/{i}.html"
        with open(filepath) as f:
            snippet = f.read()
            return func(snippet, *args, **kwargs)
    return wrapper


@app.route('/docs/show/<int:i>')
@inject_snippet
def show(snippet):
    return render_template('show.html', content=snippet)
...