在Python(Flask)中将GET更改为POST

时间:2015-06-28 02:40:16

标签: python http post flask get

我正在尝试创建一个简单的应用程序,其中在服务器上生成一个整数数组并发送到客户端。以下是app.py中的一些示例(工作)代码:

from flask import Flask, render_template, request, url_for

import random


app = Flask(__name__)


@app.route('/')
def form():
    s_abc = [random.random() for _ in range(40)]
    return render_template('abc.html', s_abc=s_abc)

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

这是abc.html的一个(工作)片段:

<div>
  {{s_abc}} 
</div>

问题是,此代码使用GET HTTP方法(Flask默认使用时没有指定)。我想改为使用POST HTTP方法,因为它显然更安全地发送数据。 (来源:http://blog.teamtreehouse.com/the-definitive-guide-to-get-vs-post

为此,我试图改变:

@app.route('/')

为:

@app.route('/', methods=['POST'])

不幸的是,我收到了一条错误:“方法不允许:请求的网址不允许这种方法。”

问题:我该如何解决这个问题?

[注意:根据我目前的理解,我需要创建一个表单来使用POST方法,但我认为我的网站不需要表单,因为客户端不会将数据发送到服务器。 (在我的网站中,服务器正在向客户端发送数据。)]

[注意:这类似于我之前提出的问题,但不一样,因为我在这里询问特定的错误消息,方法不允许。]

2 个答案:

答案 0 :(得分:0)

当您使用浏览器访问页面时,浏览器总是向服务器发送'GET'请求...所以当您将方法更改为'POST'时,烧瓶找不到任何GET路由'/ '并返回“Method Not Allowed”错误,因为当浏览器要求该页面时,'/'不再允许GET。

你不应该使用POST。 POST仅在从表单或ajax提交数据时使用。

答案 1 :(得分:0)

在这种情况下,您不应该使用POST方法。 POST方法适用于在服务器上更改数据时使用。在这种情况下,您只检索数据,因此GET是更合适的方法。

在任何情况下,如果您决定使用POST,您的代码实际上正在运行。如果使用POST请求访问端点,则可以看到此信息:

$ curl -X POST http://127.0.0.1:5000/
<div>
  [0.03464541692036849, 0.5588700799957625, 0.4702806873145451, 0.7525198710149907, 0.0674801622743858, 0.28229897849445273, 0.17400190415782735, 0.48911931330821357, 0.8033543541248421, 0.16335301905982258, 0.3307436416488905, 0.11670066397858725, 0.552907551276049, 0.6699689958218984, 0.7444295210533091, 0.8258885497774587, 0.8656500198078877, 0.6826827672886756, 0.27219907080455874, 0.9053285546116574, 0.8328655798090894, 0.2323223157770763, 0.9775485685217323, 0.34887389370958166, 0.17092511319368353, 0.20875570398480459, 0.6744092445507751, 0.6176283706166301, 0.05070680888843082, 0.3441890248079591, 0.17701427714228501, 0.115329649057473, 0.325114272097177, 0.19386610624431766, 0.18892384889766745, 0.511139418514318, 0.019931284111035397, 0.5240369332606203, 0.8936272011794374, 0.9665936114223397] 
</div>

如果您只是访问浏览器中的URL,这实际上会发送一个GET请求,并且您已经修改了代码以专门只允许POST方法 - 这就是您获得Method Not Allowed响应的原因。

$ curl -X GET http://127.0.0.1:5000/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

最佳解决方案是在此实例中使用GET。