Flask форма добавляет данные формы к URL-адресу при отправке - PullRequest
0 голосов
/ 17 июня 2020

У меня есть форма HTML

<form>
 <input type="text" name="keyword" id="keyword" />
<input type="submit">Submit</input>

при отправке. Я хочу передать данные формы в flask app

requests.py

def search_news(keyword):
search_news_url = 'https://newsapi.org/v2/everything?q={}&language=en&apiKey={}'.format(keyword,api_key)
with urllib.request.urlopen(search_news_url) as url:
    search_news_data = url.read()
    search_news_response = json.loads(search_news_data)

    search_news_results = None

    if search_news_response['articles']:
        search_news_list = search_news_response['articles']
        search_news_results = process_search_results(search_news_list)

return search_news_results

def process_search_results(search_news_list):
news_results = []
for search_results_item in search_news_list:
    author = search_results_item.get('author')
    title = search_results_item.get('title')
    description = search_results_item.get('description')
    url = search_results_item.get('url')
    urlToImage = search_results_item.get('urlToImage')
    publishedAt = search_results_item.get('publishedAt')
    content = search_results_item.get('content')
    totalResults = search_results_item.get('totalResults')

    if content:
        news_results_object = Everything(author,title,description,url,urlToImage,publishedAt,content,totalResults)
        news_results.append(news_results_object)
return news_results

views.py

from ..requests import get_everything,search_news
....
@main.route('/')
    def index():
    everything = get_everything()
    title = 'News Highlight'
    searching_news = request.args.get('keyword')

if searching_news:
    redirect(url_for('.search',keyword = searching_news))
return render_template('index.html',title = title,everything = everything)


....
@main.route('/search/<keyword>')
def search(keyword):
keyword_list = keyword.split(" ")
keyword_format = '%20'.join(keyword_list)
searched_news = search_news(keyword_format)
title = f'Search results for {keyword} '
return render_template('search.html',searched_news = searched_news)

при отправке формы он добавляет данные формы к URL-адресу следующим образом:

http://127.0.0.1:5000/?keyword=game+of+thrones

Я пробовал использовать post методы, но я получаю сервер не поддерживает ошибку метода . Может ли кто-нибудь помочь, пожалуйста.

но когда я добавляю ссылку вроде этой:

http://127.0.0.1:5000/search/game%20%of%thrones

приложение ищет и отображает результаты

1 Ответ

0 голосов
/ 17 июня 2020

По умолчанию данные формы отправляются через строку запроса URL-адреса, если вы не укажете, что она должна вести себя иначе (method по умолчанию GET).

Post

Если вы хотите отправить данные на flask с помощью запроса POST, это способ go:

  1. Не забудьте указать форму HTML для использования method="POST" и укажите, куда отправлять данные с помощью атрибута action:

    <form method="post" action="/search">
       <input type="text" name="keyword" id="keyword" />
       <input type="submit">Submit</input>
    </form>
    
  2. Сообщите вашему представлению на стороне сервера, что нужно принимать POST запросов и получать отправленные данные от request.form. В views.py используйте

    @main.route('/search/' methods=['POST'])
    def search():
        keyword = request.form['keyword']
        ...
    

Get

Если вы хотите использовать запрос GET и передавать данные через строку запроса, установите метод вашей формы на get

<form method="get" action="/search">
   <input type="text" name="keyword" id="keyword" />
   <input type="submit">Submit</input>
</form>

При отправке ваш браузер добавит значения, введенные в поле ввода, к URL-адресу в виде строки запроса: ?keyword=<whatever-you-entered>.

Сообщите вашему представлению на стороне сервера принимать GET запросов и получать данные строки запроса через request.args.get(). В views.py используйте

@main.route('/search/' methods=['GET'])
def search():
    keyword = request.args.get('keyword')
    ...

В MDN есть хорошая статья с более подробной информацией об отправке и получении данных формы с HTML и Python, это, возможно, стоит прочитать тоже.

...