烧瓶 url_for 导致 escape_chars http_405

Posted

技术标签:

【中文标题】烧瓶 url_for 导致 escape_chars http_405【英文标题】:Flask url_for results in escape_chars http_405 【发布时间】:2021-01-13 11:12:27 【问题描述】:

我搜索并阅读了许多类似的帖子,但我发现的问题与我发现的问题不同。

我有一个超级简单的烧瓶应用程序(如下)。它所做的只是呈现带有 2 个按钮的 test.html 页面,用于回调 python def。

    Test1 按钮具有硬编码形式 action="/test"。 作品 Test2 按钮的形式为 action=" url_for('test') " 失败:> POST /%7B%7B%20url_for('test')%20%7D%7D HTTP/1.1" 405 - 方法不允许

可能是什么问题? 转义字符是问题吗?如果是这样,我该如何预防?

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>

【问题讨论】:

【参考方案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')

【讨论】:

啊,有趣。我需要从我的静态位置提供 html 文件。 url_for 可以从静态工作吗?或者,这是一件坏事吗? 我自己最近才开始使用 Flask,无法评估这是否违反了最佳实践。我能说的是,Jinja2 是一个通用模板引擎,并非特定于 HTML,因此对于呈现 JSON 或其他内容也很有用,所以我认为这不应该阻止你尝试。我认为静态内容的位置并不是模板的最佳位置。

以上是关于烧瓶 url_for 导致 escape_chars http_405的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶 url_for 生成 http URL 而不是 https

带有多个参数的烧瓶 url_for()

烧瓶-基础

方法不允许烧瓶错误 405

带有请求的烧瓶损坏的管道

接收空表单的烧瓶