“不允许的方法请求的URL不允许使用该方法。”

时间:2016-08-06 16:59:40

标签: python methods flask http-status-code-405

我已经阅读了这个问题的相关帖子,但没有找到修复或似乎匹配的答案(道歉,如果我错过了,我看了10个帖子)。

编写搜索页面以查找数据库中的条目。最初我把它写成两个独立的函数。一个显示搜索框,另一个显示实际搜索并返回结果。这很好用,但是我试图通过将搜索框保持在页面顶部并且只返回结果(如果有的话)来使这更“用户友好”。

似乎是一件简单的事情,但无法正常工作。

views.app中的Python代码

@app.route('/search', methods=['POST'])
def SearchForm():

    if request.method == "POST":
        output = []
        searchterm = request.form['lookingfor']
        whichName = request.form['name']
        if searchterm:
            conn = openDB()
            results = findClient(conn, searchterm, whichName)
            for r in results:
                output.append({'id': r[0], 'fname': r[1], 'lname': r[2], 'phonen': r[3], 'email': r[4], 'started': r[5],
                               'opt': r[6], 'signup': r[7], 'enddate': findEndDate(r[7], r[5])})
            closeDB(conn)
            if output:
                message = "Record(s) Found"
            else:
                message = "Nothing found, sorry."
            return render_template('search.html', message=message, output=output)
        else:
            output = []
            message = "Please enter a name in the search box"
            return render_template('search.html', message=message, output=output)
    else:
        return render_template('search.html')

search.html的HTML

{% extends "baseadmin.html" %}
{% block content %}
<div>
    <form action="{{url_for('search')}}" method="post">
        <p>Search for a Client: <input type="text" name="lookingfor"/></p>
        <input type="radio" name="name" value="fname" id="fname"><label for="fname">First Name</label>
        <input type="radio" name="name" value="lname" id="lname"><label for="lname">Last Name</label>
        <input type="submit" value="submit"/>
    </form>
</div>
<h2>{{ message }}</h2>
<div>
    <table>
      <tr>
        <th>Name</th>
        <th>Email Address</th>
        <th>Phone Number</th>
        <th>Trial Method</th>
        <th>Start Date</th>
        <th>EndDate</th>
      </tr>
      {% for client in output %}
        <tr>
          <td>{{ client['fname'] }} {{ client['lname'] }}</td>
          <td>{{ client['email'] }}</td>
          <td>{{ client['phonen'] }}</td>
          <td>{{ client['started'] }}</td>
          <td>{{ client['signup'] }}</td>
          <td>{{ client['enddate'] }}</td>
        </tr>
      {% endfor %}
    </table>
</div>
{% endblock %}

1 个答案:

答案 0 :(得分:1)

正如@dirn已经在comment中提到的那样,methods=['POST']中的@app.route('/search', methods=['POST'])表示函数SearchForm,而网址'/search'仅接受POST请求。如果有人试图仅使用URL访问该页面,他们就会通过GET请求进行访问。

将行更改为@app.route('/search', methods=['GET', 'POST'])应修复错误。

(主要回答(1)显示完整的解决方案,以及(2)提高solution provided by @dirn的可见度。)