2016-08-06 4 views
-1

Я прочитал связанные сообщения по этому вопросу, но не нашел ответа, который исправляет или, кажется, соответствует (извинения, если я пропустил это, я просмотрел, как 10 сообщений)."Метод не разрешен. Метод не разрешен для запрошенного URL."

Запись страницы поиска, которая ищет записи в БД. Первоначально я написал это как две отдельные функции. Один для отображения окна поиска, а второй для фактического поиска и возврата результатов. Это работает отлично, но я пытаюсь сделать это более удобным для пользователя, сохранив поле поиска в верхней части страницы и просто вернув результаты, если они есть.

Кажется, что это просто, но не работает.

Python код в views.app

@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') 

HTML для search.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 %} 
+3

Вы делаете запрос GET, чтобы загрузить начальную страницу? Так, это твоя проблема. Добавьте GET к разрешенным методам. – dirn

+0

@ dirn - Это исправлено. Спасибо. Но я не понимаю, зачем мне нужен метод GET. Я не передаю никакие переменные в url для страницы поиска и не ищу их. Доступ к странице с помощью http: // .com/search – PerryDaPlatypus

+1

Когда ваш браузер запрашивает страницу с помощью метода, отличного от отправки формы, выполняется запрос GET. POST-файлы могут выполняться только через формы и запросы JavaScript. – dirn

ответ

1

Как @dirn уже упоминал в своем comment, то methods=['POST'] в @app.route('/search', methods=['POST']) означает функцию SearchForm и URL '/search' будут принимать только запросы POST. Если кто-то пытается получить доступ к странице, используя только URL-адрес, они будут делать это с помощью запроса GET.

Изменение линии до @app.route('/search', methods=['GET', 'POST']) должно исправить ошибку.

(Ответил главным образом, (1) показать полное решение и (2) принести обзорность solution provided by @dirn.)