#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 аргумента, когда я вызываю функцию в функции AJAX5. Если вам нужно знать, как получить идентификатор списка воспроизведения и идентификатор песни после нажатия кнопки с вашей html-страницы, посмотрите на это: youtube.com/watch?v=I2dJuNwlIH0