Как передать два аргумента функции python, вызываемой функцией ajax?

#javascript #python #jquery #ajax #flask

Вопрос:

Я создаю веб-приложение с помощью Flask и хочу, чтобы эта функция вызывалась при нажатии кнопки, а страница не перезагружалась:

 @app.route('/add_song_to_playlist')
def add_song_to_playlist(pl_id, s_id):
    sp = songs_playlists(song_id = s_id, playlist_id = pl_id)
    db.session.add(sp)
    db.session.commit()
    return "nothing"
 

Однако для этого требуется два аргумента, и я не уверен, как передать их в функции ajax. Также мне нужно, чтобы они были похожи на встроенный код python с {{ }}.

Вот функция ajax в шаблоне и кнопка, и то, что я пытался передать в качестве аргумента «данные», который принимает getJSON() :

 <div class="dropdown-menu dropdown-menu-right float-left">
    <a class="dropdown-item" href="{{ url_for('make_playlist') }}"> Create a new playlist </a>
    {% for p in pl %}
    <form>
        <a class="dropdown-item" href="#" id=add_song> {{ p.playlist_name }} </a>
    </form>
    <script type=text/javascript>
        $(function() {
            $('a#add_song').on('click', function(e) {
            e.preventDefault()
            $.getJSON('/add_song_to_playlist', );
            return false;
            });
        });
    </script>
</div>
{% endfor %}
 

Но, похоже, это не работает, и я даже не ожидал, что это сработает. Я прочитал документацию jquery об этой функции, но в ней ничего не говорилось о передаче двух аргументов, кроме того, в виде кода на python (возможно, из-за моего недостатка знаний в JS). Любая помощь будет очень признательна!

Комментарии:

1. Вы можете передавать аргументы либо в URL-адресе, в качестве параметров запроса, либо в тексте. Существует множество различных форматов для передачи аргументов в теле. Flask передает сегменты URL в вызов функции, например @app.route('/add_song_to_playlist/<pl_id>/<s_id>')

Ответ №1:

вы можете указать параметры маршрута следующим образом:

 @app.route('/add_song_to_playlist/<pl_id>/<s_id>', methods=['POST'])
def add_song_to_playlist(pl_id, s_id):
    sp = songs_playlists(song_id = s_id, playlist_id = pl_id)
    db.session.add(sp)
    db.session.commit()
    return "nothing"
 

ваш http-вызов должен выглядеть примерно так: https://server_ip/add_song_to_playlist/playlist_id/song_id

взгляните сюда: https://pythonbasics.org/flask-tutorial-routes/

Или вы можете передать их через тело почтового вызова, а затем получить к ним доступ следующим образом:

 @app.route('/add_song_to_playlist', methods=['POST'])
def add_song_to_playlist():
    pl_id = request.form.get('pl_id')
    s_id = request.form.get('s_id')
    sp = songs_playlists(song_id = s_id, playlist_id = pl_id)
    db.session.add(sp)
    db.session.commit()
    return "nothing"
 

В качестве альтернативы, также через запрос get: https://server_ip/add_song_to_playlist?playlist_id=pl_idamp;song_id=s_id

 @app.route('/add_song_to_playlist', methods=['GET'])
def add_song_to_playlist():
    pl_id = request.args.get('pl_id')
    s_id = request.args.get('s_id')
    sp = songs_playlists(song_id = s_id, playlist_id = pl_id)
    db.session.add(sp)
    db.session.commit()
    return "nothing"
 

На мой взгляд, лучший способ управления рассматриваемым вызовом-это первый.

Комментарии:

1. Да, и теперь мне нужно передать необходимые аргументы для функции. Аргументы, которые мне нужны, взяты из 2 списков, которые я получаю из бэк-энда при рендеринге этого шаблона. Так что я знаю, как это делается, но мне нужно что-то вроде этого : $.getJSON(‘/add_song_to_playlist’, {{ song.name }}, {{ p.имя плейлиста }}) ИДК, если я хорошо это объясню.

2. Извините, что я случайно загрузил комментарий, когда он не был закончен. Теперь он отредактирован.

3. Если вы можете получить идентификатор списка воспроизведения и идентификатор песни, посмотрите здесь (как сделать запрос hhtp с помощью ajax): w3schools.com/xml/ajax_xmlhttprequest_send.asp

4. Я либо не могу понять вас из-за недостатка знаний, либо вам я не могу объяснить, что я пытаюсь сделать. У меня есть шаблон, который я передаю два списка, которые представляют собой все запросы из двух таблиц — песни и списки воспроизведения, поэтому я могу использовать их для отображения песен и списков воспроизведения, что делается путем повторения этих списков, как в файле .html: {% for song in songs %} ... {% endfor %} . Затем у меня есть кнопка, которую я хочу вызвать функцией onclick без перезагрузки страницы, которая принимает элементы из двух списков в качестве аргументов. И я не знаю, как передать 2 аргумента, когда я вызываю функцию в функции AJAX

5. Если вам нужно знать, как получить идентификатор списка воспроизведения и идентификатор песни после нажатия кнопки с вашей html-страницы, посмотрите на это: youtube.com/watch?v=I2dJuNwlIH0