Я совершенно новичок в Ajax и Flask. Я пытаюсь развернуть веб-приложение с Flask, которое будет отображать некоторые данные из списка, собранного в Python (именно поэтому я использую Flask) при нажатии кнопки на странице HTML. Я также, возможно, мог бы озаглавить этот вопрос «Почему не работает мое приложение Flask?», Как если бы я пытался загрузить файл app.py
, я получил ошибку Flask. Но когда я запускаю страницу index.html
и нажимаю кнопку, я получаю
jquery.min.js: 2 POST http://127.0.0.1:5500/_get_data/ 405 (Метод не разрешен)
Iнапечатал то, что я пытаюсь вернуть, просто чтобы убедиться, что оно отображается в виде списка, и это так. Я также попытался выполнить всю очистку файла перед инициализацией приложения Flask, поскольку, возможно, это какая-то незаконная очистка или что-то в этом роде.
файл index.html
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>NBA Data Web App</title>
<script src = "http://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" crossorigin = "anonymous"></script>
</head>
<body>
<button id = "searchBtn"> Search </button>
<div id = "response"></div>
<script type = "text/javascript">
$('button#searchBtn').click(function() {
$.ajax({
url: "/_get_data/",
type: "POST",
success: function(resp) {
$('div#response').append(resp.data);
}
});
});
</script>
</body>
</html>
файл app.py
#Import dependencies
from flask import Flask, render_template, jsonify
from urllib.request import urlopen
from bs4 import BeautifulSoup as bs
import pandas as pd
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/_get_data/', methods = ['POST'])
def _get_data():
#URL of the page we want to scrape (2019-2020 per game player stats)
url = "https://www.basketball-reference.com/leagues/NBA_2020_per_game.html"
#HTML from our URL
html = urlopen(url)
#Convert that HTML into an object
soup = bs(html, 'html.parser')
#Use findall() to get our headers
soup.findAll('tr', limit = 2)
#Extract the text so we can make a list
headers = [th.getText() for th in soup.findAll('tr', limit = 2)[0].findAll('th')]
#Exclude the first column, as we don't care about the ranking order from Basketball Reference
headers = headers[1:]
#Ignore the first header row
rows = soup.findAll('tr')[1:]
#Get the player's stats
player_stats = [[td.getText() for td in rows[i].findAll('td')]for i in range(len(rows))]
stats = pd.DataFrame(player_stats, columns = headers)
stats.head(10)
#Convert our search data to a list for Ajax/Flask
playerData = (stats[stats['Player'] == 'James Harden']).values.tolist()
dataList = ( ", ".join( repr(x) for x in playerData))
return jsonify({'data': render_template('response.html', dataList = dataList)})
if __name__ == "__main__":
app.run(debug = True)
файл response.html (не уверен, что это как-то связано с моей ошибкой)
<ul>
{% for elem in dataList %}
<li>{{elem}}</li>
{% endfor %}
</ul>