Почему моя веб-страница вызывает ошибку POST? - PullRequest
0 голосов
/ 01 ноября 2019

Я совершенно новичок в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...