首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“浏览器(或代理)发送了此服务器无法理解的请求。”

“浏览器(或代理)发送了此服务器无法理解的请求。”
EN

Stack Overflow用户
提问于 2022-05-05 04:57:00
回答 1查看 749关注 0票数 0

我正在尝试使用Flask和Python构建一个带有ML模型的网站。

当我输入值以得到预测时,我一直得到这个错误。

浏览器(或代理)发送此服务器无法理解的请求。

这是我到目前为止编写的代码。

这是app.py文件

代码语言:javascript
复制
from flask import Flask, request, render_template
import pickle

app = Flask(__name__)
model = pickle.load(open('model.pkl', 'rb'))  # loading the model

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

@app.route('/predict',methods=['POST'])
def predict():
    """Grabs the input values and uses them to make prediction"""
    # rooms = int(request.form["rooms"])
    # distance = int(request.form["distance"])

    radius_mean  =  int(request.form["radius_mean"])
    texture_mean=   int(request.form["texture_mean"])
    perimeter_mean= int(request.form["perimeter_mean"])
    area_mean=  int(request.form["area_mean"])
    smoothness_mean=    int(request.form["smoothness_mean"])
    compactness_mean=   int(request.form["compactness_mean"])
    concavity_mean= int(request.form["concavity_mean"])
    concave_points_mean =   int(request.form["concave_points_mean"])
    symmetry_mean=  int(request.form["symmetry_mean"])
    fractal_dimension_mean= int(request.form["fractal_dimension_mean"])
    radius_se=  int(request.form[radius_se])
    texture_se= int(request.form["texture_se"])
    perimeter_se=   int(request.form["perimeter_se"])
    area_se=    int(request.form["area_se"])
    smoothness_se=  int(request.form["smoothness_se"])
    compactness_se= int(request.form["compactness_se"])
    concavity_se=   int(request.form["concavity_se"])
    concave_points_se=  int(request.form["concave_points_se"])
    symmetry_se=    int(request.form["symmetry_se"])
    fractal_dimension_se=   int(request.form["fractal_dimension_se"])
    radius_worst=   int(request.form["radius_worst"])
    texture_worst=  int(request.form["texture_worst"])
    perimeter_worst=    int(request.form["perimeter_worst"])
    area_worst= int(request.form["area_worst"])
    smoothness_worst=   int(request.form["smoothness_worst"])
    compactness_worst=  int(request.form["compactness_worst"])
    concavity_worst=    int(request.form["concavity_worst"])
    concave_points_worst=   int(request.form["concave_points_worst"])
    symmetry_worst= int(request.form["symmetry_worst"])
    fractal_dimension_worst=    int(request.form["fractal_dimension_worst"])


    prediction = model.predict
    ([[radius_mean, 
    texture_mean, 
    perimeter_mean, 
    area_mean, 
    smoothness_mean, 
    compactness_mean, 
    concavity_mean, 
    concave_points_mean, 
    symmetry_mean, 
    fractal_dimension_mean, 
    radius_se, 
    texture_se, 
    perimeter_se, 
    area_se, 
    smoothness_se, 
    compactness_se, 
    concavity_se, 
    concave_points_se, 
    symmetry_se, 
    fractal_dimension_se, 
    radius_worst, 
    texture_worst, 
    perimeter_worst, 
    area_worst, 
    smoothness_worst, 
    compactness_worst, 
    concavity_worst, 
    concave_points_worst, 
    symmetry_worst,
    fractal_dimension_worst
    ]])  # this returns a list e.g. [127.20488798], so pick first element [0]
    output = round(prediction[0], 30) 

    return render_template('index.html', prediction_text=f'A tumour with {rooms} {radius_mean}{texture_mean} {perimeter_mean} {area_mean} {smoothness_mean} {compactness_mean} {concavity_mean} {concave_points_mean} {symmetry_mean} {fractal_dimension_mean} {radius_se} {texture_se} {perimeter_se} {area_se} {smoothness_se} {compactness_se} {concavity_se} {concave_points_se} {symmetry_se} {fractal_dimension_se} {radius_worst} {texture_worst} {perimeter_worst} {area_worst} {smoothness_worst} {compactness_worst} {concavity_worst} {concave_points_worst} {symmetry_worst} {fractal_dimension_worst} from the city center has a value of {output}')


if __name__ == "__main__":
    app.run()

这是index.html文件:

代码语言:javascript
复制
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

     <!-- Nav Bar -->
  <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
      <a class="navbar-brand" href="#">Navbar</a>
      <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav me-auto mb-2 mb-lg-0">
          <li class="nav-item">
            <a class="nav-link active" aria-current="page" href="#">Home</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Link</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
              Dropdown
            </a>
            <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
              <li><a class="dropdown-item" href="#">Action</a></li>
              <li><a class="dropdown-item" href="#">Another action</a></li>
              <li><hr class="dropdown-divider"></li>
              <li><a class="dropdown-item" href="#">Something else here</a></li>
            </ul>
          </li>
          <li class="nav-item">
            <a class="nav-link disabled">Disabled</a>
          </li>
        </ul>
        <form class="d-flex">
          <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
          <button class="btn btn-outline-success" type="submit">Search</button>
        </form>
      </div>
    </div>
  </nav>
  
</head>
<body>
    <div class="login">
        <h2>Price Prediction</h2>
          <p>Introduce the number of rooms and distance:</p>
           <!-- Inputs for our ML model -->
            <form action="{{ url_for('predict')}}"method="post">
              <input type="text" name="radius_mean  " placeholder="radius_mean " required="required" />
              <input type="text" name="texture_mean" placeholder="texture_mean" required="required"/>
              <input type="text" name="perimeter_mean" placeholder="perimeter_mean" required="required" />
              <input type="text" name="area_mean" placeholder="area_mean" required="required"/>
              <input type="text" name="smoothness_mean" placeholder="smoothness_mean" required="required" />
              <input type="text" name="compactness_mean" placeholder="compactness_mean" required="required"/>
              <input type="text" name="concavity_mean" placeholder="concavity_mean" required="required" />
              <input type="text" name="concave_points_mean" placeholder="concave_points_mean" required="required"/>
              <input type="text" name="symmetry_mean" placeholder="symmetry_mean" required="required" />
              <input type="text" name="fractal_dimension_mean" placeholder="fractal_dimension_mean"required="required"/>

              <input type="text" name="radius_se " placeholder="radius_se " required="required" />
              <input type="text" name="texture_se" placeholder="texture_se" required="required"/>
              <input type="text" name="perimeter_se" placeholder="perimeter_se"required="required" />
              <input type="text" name="area_se" placeholder="area_se" required="required"/>
              <input type="text" name="smoothness_se" placeholder="smoothness_se" required="required" />
              <input type="text" name="compactness_se" placeholder="compactness_se"  required="required"/>
              <input type="text" name="concavity_se" placeholder="concavity_se"  required="required" />
              <input type="text" name="concave_points_se" placeholder="concave_points_se"required="required"/>
              <input type="text" name="symmetry_se" placeholder="symmetry_se" required="required" />
              <input type="text" name="fractal_dimension_se" placeholder="fractal_dimension_se"required="required"/>

              <input type="text" name="radius_worst" placeholder="radius_worst"required="required" />
              <input type="text" name="texture_worst" placeholder="texture_worst" required="required"/>
              <input type="text" name="perimeter_worst" placeholder="perimeter_worst" required="required" />
              <input type="text" name="area_worst" placeholder="area_worst" required="required"/>
              <input type="text" name="smoothness_worst" placeholder="smoothness_worst"  required="required" />
              <input type="text" name="compactness_worst" placeholder="compactness_worst" required="required"/>
              <input type="text" name="concavity_worst" placeholder="concavity_worst" required="required" />
              <input type="text" name="concave_points_worst" placeholder="concave_points_worst" required="required"/>
              <input type="text" name="symmetry_worst" placeholder="symmetry_worst"  required="required" />
              <input type="text" name="fractal_dimension_worst" placeholder="fractal_dimension_worst" required="required"/>

              <button type="submit" class="btn btn-primary btn-block btn-large">Predict Value!</button>
            </form>
         
          <br>
          <br>
       </div>
</body>
</html>

所附图像显示数据集和所显示的列。

对如何纠正这个错误有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-05-05 11:27:51

烧瓶实际上表明了错误的原因。

单击“预测”按钮“”后,浏览器上的

..。

服务器端日志上的

  • :werkzeug.exceptions.BadRequestKeyError: 400坏请求:浏览器(或代理)发送了该服务器无法理解的请求。KeyError:'radius_mean'

最初的问题是,您的密钥有一些额外的空间:

  • index.html ^\有两个尾随空格!

int(request.form"radius_mean")

  • 视图函数radius_mean =

空间不会自动被剥夺,空间很重要:

代码语言:javascript
复制
In [8]: "radius_mean" == "radius_mean  "
Out[8]: False

检查HTML和Python代码上的所有键,确保它们是一致的。如果视图函数试图访问不在HTML模板中的表单键,也会发生同样的错误。

为了帮助您调试,可以在视图函数上检查request.form包含的内容,这就像字典一样。您可以使用调试器或执行print(request.form.keys())

您可以在这里做的一个很大的改进是定义一个可迭代的(例如。(列表、元组等)把所有钥匙都储存起来。将此可迭代传递到您的HTML模板,并为每个键动态生成表单<input>,因为您的示例显示它们都只是复制粘贴了不同的nameplaceholder。然后在您的视图函数中,再次循环这个相同的迭代来解析表单。

代码语言:javascript
复制
app = Flask(__name__)

FORM_KEYS = (
    "radius_mean",
    "texture_mean",
    "perimeter_mean",
    "area_mean",
    "smoothness_mean",
    # Add the other keys here
)

@app.route("/")
def home():
    return render_template("index.html", form_keys=FORM_KEYS)

@app.route("/predict", methods=["POST"])
def predict():
    # This is a dictionary comprehension.
    # You can also manually assign the values one-by-one
    form_values = {
        form_key: int(request.form[form_key])
        for form_key in FORM_KEYS
    }  

    model_values = list(form_values.values())
    prediction = model.predict([model_values])
    ...
代码语言:javascript
复制
<form action="{{ url_for('predict')}}" method="post">
    {% for form_key in form_keys %}
      <input type="text" name="{{ form_key }}" placeholder="{{ form_key }}" required="required" /> 
    {% endfor %}

    <button type="submit" class="btn btn-primary btn-block btn-large">Predict Value!</button>
</form>

这将有助于防止表单键中的不一致,并提高可维护性,因为您只需要在1处更新和检查键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72122094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档