不允许使用Python flask方法所请求的URL不允许使用该方法

时间:2018-08-14 20:38:11

标签: python tensorflow flask

我正在使用flask来部署我的深度学习模型。

但是当我运行模型时,出现以下错误。

  

不允许使用方法所请求的URL不允许使用方法

当我激活调试模式时,我得到了

  

flask.cli.NoAppException flask.cli.NoAppException:导入时   “应用”,引发了ImportError:

     

回溯(最近通话最近):文件   “ c:\ users \ tab \ anaconda3 \ lib \ site-packages \ flask \ cli.py”,第235行,在   locate_app       导入(模块名称)文件“ C:\ Chatbot-Flask-Server-master \ Chatbot-Flask-Server-master \ app.py”,   第3行,在       将tensorflow导入为tf ModuleNotFoundError:没有名为'tensorflow'的模块

我已经安装了我的tensorflow,该模型可以在没有烧瓶的情况下正常运行,激活虚拟环境时仍然会出现错误。

这是我的代码:

## webapp
app = Flask(__name__, template_folder='./')


@app.route('/prediction', methods=['POST', 'GET'])
def prediction():
    response =  pred(str(request.json['message']))
    return jsonify(response)

@app.route('/')
def main():
   return render_template('index.html')


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

和索引

<form action="http://127.0.0.1:5000/" method='POST' , 'GET'>
  <p>Text <input type="text" name="message" style="height:200px" /></p>
  <p><input type="submit" value="submit" /></p>
</form>

1 个答案:

答案 0 :(得分:0)

虚拟环境

您在帖子中提到您已经安装了Tensorflow,并且在没有虚拟环境的情况下也可以运行,因此错误可能是由于您尚未在 Virtual Environment 本身中安装Tensorflow而引起的。这是因为,当您使用Python创建虚拟环境时,例如:

python -m venv venv

在虚拟环境中,只有最新的Python可用,而在虚拟环境之外没有其他软件包。

解决方案:激活虚拟环境,然后安装虚拟环境的Tensorflow INSIDE。

烧瓶请求

很明显,当您提交表单时,它是一个POST请求,但是在您的index视图中,您只能处理GET请求。如果您不知道POSTGET提出了什么要求,基本上:

  • POST用于将数据发送到服务器。
  • GET用于从服务器请求数据。

在您的情况下,您希望将表单数据发送到服务器,因此这是一个POST请求。您所需要做的就是修改视图函数,使其也可以处理POST

from flask import request

@app.route("/", methods=["POST", "GET"])
def main():
    // when the request is post request
    if request.method == "POST":
        // get data from the form
        data = request.form["message"]

        // do something here

    return render_template('index.html')

<form action="http://127.0.0.1:5000/" method='POST'>
  <p>Text <input type="text" name="message" style="height:200px" /></p>
  <p><input type="submit" value="submit" /></p>
</form>

Jinja模板

Jinja是Python的模板引擎。基本上,在Jinja的帮助下,您可以将变量从服务器端传递到客户端,并在客户端执行所有逻辑。对于您的情况,您想要将从前端获得的数据传递回前端,可以执行以下操作:

from flask import request

@app.route("/", methods=["POST", "GET"])
def main():
    // when the request is post request
    if request.method == "POST":
        // get data from the form
        data = request.form["message"]

        // pass the data back to the front end
        return render_template("index.html", message=data)

    // message is none here because this is a get request
    return render_template('index.html', message=None)

和您的index.html

<form action="http://127.0.0.1:5000/" method='POST' , 'GET'>
  <p>Text <input type="text" name="message" style="height:200px" /></p>
  <p><input type="submit" value="submit" /></p>
</form>

{% if message %}
  <h1>{{ message }}</h1>
{% endif %}

前端发生了什么?好吧,它检查服务器上的message变量是否为None。如果不是None,则渲染message变量,否则,什么也不做。

您可以了解有关Jinja here的更多信息:)