Flask url_for приводит к escape_chars http_405

Я искал и читал много похожих сообщений, но моя проблема имеет другое поведение, чем все, что я нашел.

У меня есть очень простое приложение для фляги (ниже). Все, что он делает, это наличие страницы test.html с 2 кнопками для обратного вызова в python def.

  1. Test1 button has hard-coded form action="/test".
    • Works
  2. Test2 button has form action="{{ url_for('test') }}"
    • Fails with: > POST /%7B%7B%20url_for('test')%20%7D%7D HTTP/1.1" 405 -
    • Метод не разрешен

В чем может быть проблема? Являются ли escape-символы проблемой? Если да, то как их предотвратить?

test.py

#!/usr/bin/env python3
from flask import Flask, request, send_file
app = Flask(__name__, static_url_path='', static_folder='')

@app.route('/')
def FooTest():
  return app.send_static_file('test.html')

@app.route("/test", methods=["GET","POST"])
def test():
  print("Got Callback:")
  return "Click"

if __name__ == '__main__':
  app.run(debug=True)

test.html

<!DOCTYPE html> 
<html> 
   <form method="post" action="/test">
       <button type="submit"> Test1</button/>
   </form>
   <form method="post" action="{{ url_for('test') }}">
       <button type="submit"> Test2</button/>
   </form>
</html>


person Wayne    schedule 27.09.2020    source источник


Ответы (1)


Ваш test.html — это шаблон Jinja2, который будет обработан вызовом render_template для создания желаемого HTML. Вы возвращаете шаблон как есть, поэтому браузер пытается вызвать http://localhost:5000/{{ url_for('test') }}, которого не существует. Измените FooTest следующим образом (возможно, вам придется изменить путь к файлу):

from flask import render_template

@app.route('/')
def FooTest():
  return render_template('test.html')
person oschlueter    schedule 27.09.2020
comment
А, интересно. Мне нужно обслуживать файл html из моего статического местоположения. Может ли url_for работать из статики? Или это плохо? - person Wayne; 27.09.2020
comment
Я сам начал работать с Flask совсем недавно и не могу оценить, нарушает ли это лучшие практики. Что я могу сказать, так это то, что Jinja2 — это универсальный механизм шаблонов, не специфичный для HTML, поэтому он также полезен для рендеринга JSON или другого контента, поэтому я не думаю, что это должно помешать вам попробовать это. Однако я бы сказал, что место для статического контента — не лучшее место для шаблонов. - person oschlueter; 27.09.2020