【问题标题】:Flask POSTs with Trailing Slash带有斜杠的 Flask POST
【发布时间】:2017-07-28 10:15:21
【问题描述】:

文档指出,定义路由的首选方法是包含尾部斜杠:

@app.route('/foo/', methods=['GET'])
def get_foo():
    pass

这样,客户端可以GET /fooGET /foo/ 并收到相同的结果。

但是,POST 方法的行为不同。

从烧瓶进口烧瓶 app = Flask(__name__) @app.route('/foo/', methods=['POST']) def post_foo(): 返回“酒吧” 应用程序运行(端口=5000)

这里,如果您POST /foo,如果您未在调试模式下运行,它将失败并显示method not allowed,或者如果您处于调试模式,它将失败并显示以下通知:

向这个 URL (http://localhost:5000/foo) 发送了一个请求,但是路由系统自动发出了一个重定向到“http://localhost:5000/foo/"。这个 URL 是用尾部斜杠定义的,所以 Flask 会自动重定向到带有如果没有斜杠就访问它。请确保将您的 POST 请求直接发送到此 URL,因为我们无法使浏览器或 HTTP 客户端使用表单数据可靠地重定向或无需用户交互


此外,您似乎甚至不能这样做:

@app.route('/foo', methods=['POST'])
@app.route('/foo/', methods=['POST'])
def post_foo():
    return "bar"

或者这个:

@app.route('/foo', methods=['POST']) def post_foo_no_slash(): 返回重定向(url_for('post_foo'),代码=302) @app.route('/foo/', methods=['POST']) def post_foo(): 返回“酒吧”

有什么方法可以让POST 同时处理非尾随斜杠和尾随斜杠?

【问题讨论】:

    标签: python python-2.7 flask


    【解决方案1】:

    您可以检查request.path 是否/foo/ 然后将其重定向到您想要的位置:

    @app.before_request
    def before_request():
        if request.path == '/foo':
            return redirect(url_for('foo'), code=123)
    
    @app.route('/foo/', methods=['POST'])
    def foo():
        return 'foo'
    
    $ http post localhost:5000/foo 
    127.0.0.1 - - [08/Mar/2017 13:06:48] "POST /foo HTTP/1.1" 123
    

    【讨论】:

      【解决方案2】:

      请参考这篇文章: Trailing slash triggers 404 in Flask path rule

      您可以禁用严格的斜线来满足您的需求

      全球:

      app = Flask(__name__)
      app.url_map.strict_slashes = False
      

      ...或每条路线

      @app.route('/foo', methods=['POST'], strict_slashes=False)
      def foo():
          return 'foo'
      

      您也可以查看此链接。 github上有关于这个的单独讨论。 https://github.com/pallets/flask/issues/1783

      【讨论】:

      • 很好的答案,而且内容丰富。谢谢@Wojciech Jakubas
      猜你喜欢
      • 2018-02-16
      • 2015-09-13
      • 2021-12-28
      • 1970-01-01
      • 2012-11-16
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多