Динамическое содержимое страницы Flask

#python

#python

Вопрос:

Я пытаюсь написать динамическую страницу на Python с помощью Flask на моем pythonanywhere.com бесплатный хостинг. У меня есть следующий код, в надежде, что я смогу записать в resp переменную, чтобы создать свои страницы.

 @app.route('/xdcc-search/search.html')
def search_app():
    try:
        with open('templates/xdcc-search/search.html', 'r') as dynamic:
            dynamic.read()
    except:
        pass
    dynamic.replace("<file>","MY_FILENAME.tar")
    resp = make_response(render_template(dynamic), 200)
    no_cache(resp)
    return resp
  

Я получаю сообщение об ошибке, указывающее, что перед назначением ссылаются на dynamic. Есть ли способ отредактировать шаблон после render_template(filename) восстановления и сборки страницы?

Ответ №1:

Когда вы делаете это:

 with open('templates/xdcc-search/search.html', 'r') as dynamic:
    dynamic.read()
  

… вы читаете содержимое файла, но выбрасываете его — read() это функция, которая считывает содержимое файла и возвращает его.

Исправление вашего кода таким образом, чтобы он действительно выполнял то, что вы пытаетесь сделать, дает следующее:

 @app.route('/xdcc-search/search.html')
def search_app():
    try:
        with open('templates/xdcc-search/search.html', 'r') as dynamic:
            contents = dynamic.read()
    except:
        pass
    contents.replace("<file>","MY_FILENAME.tar")
    resp = make_response(render_template(contents), 200)
    no_cache(resp)
    return resp
  

…но это все равно неправильно; render_template принимает в качестве параметра имя файла, содержащего шаблон, а не его содержимое. Итак, что вам нужно сделать, чтобы заставить это работать, это заменить это render_template на render_template_string .

 @app.route('/xdcc-search/search.html')
def search_app():
    try:
        with open('templates/xdcc-search/search.html', 'r') as dynamic:
            contents = dynamic.read()
    except:
        pass
    contents.replace("<file>","MY_FILENAME.tar")
    resp = make_response(render_template_string(contents), 200)
    no_cache(resp)
    return resp
  

Но это все еще не использует шаблоны Flask так, как они предназначены для использования. Смысл шаблонов в том, что они должны содержать элементы в фигурных скобках, чтобы указать, какие изменения следует внести. Замена статической строки внутри нее явным вызовом to replace позволяет обойти это и выполнить более примитивную версию того же самого.

Что вам действительно следует сделать, так это изменить свой шаблон, чтобы вместо того, чтобы иметь <file> внутри, у него было {{ file }} , а затем вы можете заменить весь этот беспорядочный код представления этим:

 @app.route('/xdcc-search/search.html')
def search_app():
    resp = make_response(render_template("xdcc-search/search.html", file="MY_FILENAME.tar"), 200)
    no_cache(resp)
    return resp
  

Наконец, я не уверен, что вам это нужно no_cache , поскольку функции просмотра по умолчанию не кэшируются. Кроме того, код состояния по умолчанию для ответа равен 200. Так что, вероятно, все, что вам нужно, это:

 @app.route('/xdcc-search/search.html')
def search_app():
    return render_template("xdcc-search/search.html", file="MY_FILENAME.tar")