#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")