Как использовать Ajax в Brython

Я пишу веб-приложение с использованием Flask и хотел бы использовать функциональность browser.ajax в Brython, но не смог найти работоспособный пример. Было бы очень хорошо, если бы кто-нибудь продемонстрировал короткий пример использования ajax в Brython. В частности, как передать данные, введенные пользователем в текстовое поле, в текстовое поле, нажав кнопку "Отправить". Любая помощь высоко ценится!


(Я пишу это через несколько недель после того, как разместил вопрос выше). Я следовал этому руководству о том, как реализовать ajax во Flask ( http://runnable.com/UiPhLHanceFYAAAP/how-to-perform-ajax-in-flask-for-python) и попытался заменить jquery.ajax на Brython. К сожалению, я до сих пор не могу заставить его работать. Вот мой код:

Часть колбы:

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/_add_numbers')
def add_numbers():
    a = request.args.get('a', 0, type=int)
    b = request.args.get('b', 0, type=int)
    return jsonify(result=a + b)

Бритт /HTML:

 <body onload="brython()">
 <script type="text/python">
 from browser import document as doc
 from browser import ajax

def on_complete(req):
    if req.status==200 or req.status==0:
        doc["txt_area"].html = req.text
    else:
        doc["txt_area"].html = "error "+req.text

def get(url):        
    req = ajax.ajax()
    a = doc['A'].value        
    b = doc['B'].value
    req.bind('complete',on_complete)
    req.open('GET',url,True)
    req.set_header('content-type','application/x-www-form-urlencoded')
    req.send({"a": a, "b":b})      

doc['calculate'].bind('click',lambda ev:get('/_add_numbers'))

</script>

<div class="container">
  <div class="header">
    <h3 class="text-muted">How To Manage JSON Requests</h3>
  </div>
  <hr/>
  <div>
  <p>
<input type="text" id="A" size="5" name="a"> +
<input type="text" id ="B" size="5" name="b"> =
<textarea type="number" class="form-control" id="txt_area" cols="10" rows = '10'></textarea>
<p><a href="javascript:void();" id="calculate">calculate server side</a>

  </div>
 </div>
 </body>
</html>

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

2 ответа

Решение

В вашем примере запрос Ajax отправляется методом GET. В этом случае аргумент send() игнорируется: данные должны быть отправлены в строке запроса, добавленной к URL

Код Brython должен быть:

def get(url):        
    req = ajax.ajax()
    a = doc['A'].value        
    b = doc['B'].value
    req.bind('complete',on_complete)
    # pass the arguments in the query string
    req.open('GET',url+"?a=%s&b=%s" %(a, b),True)
    req.set_header('content-type','application/x-www-form-urlencoded')
    req.send()

Если вы хотите использовать метод POST, тогда вы можете оставить код Brython как есть, но код Flask должен быть изменен: вы должны указать, что функция обрабатывает запрос POST, и вместо этого вы получите аргументы с атрибутом "form" из "args":

@app.route('/_add_numbers_post', methods=['POST'])
def add_numbers_post():
    a = request.form.get('a', 0, type=int)
    b = request.form.get('b', 0, type=int)
    return jsonify(result = a+b)

Я работаю над этим - нет ничего готового, но написание кода на Python делает его действительно безболезненным.

Я не могу опубликовать код, над которым я работаю (и он далеко не минимален) - но в основном вы пишете (Br)Python-функцию для итерации в HTML, или form DOM и собирать все, что имеет "значение" в структуре json-nish (словарь с вложенными диктонарами и списками по желанию) - для этого вы просто используете объект browser.ajax, как описано в http://brython.info/doc/en/index.html и передайте объект со своими данными в качестве параметра методу send.

Данные объекта будут URL-кодированы в теле запроса. Вы просто должны декодировать его оттуда в JSON на стороне клиента.

В качестве дополнительной подсказки: я не углубился в этот вопрос, но я чувствую, что кодировка URL, используемая по умолчанию, может не выразить все, что возможно в JSON. Итак, импортировал модуль json от brython и отправил его так:

ajax_object.send({"data": json.dumps(json_data)})

Это позволяет мне сделать это на стороне клиента:json_data = json.loads(urllib.unquote(request.body).split(":",1)[-1] )

("request.body" от Pyramid - для колбы это "request.data", но только если колба не понимает att-тип - проверьте, как получить данные, полученные в запросе от Flask)

Другие вопросы по тегам