2014-09-24 2 views
5

Flask를 사용하여 웹 응용 프로그램을 작성 중이며 Brython에서 browser.ajax 기능을 사용하려고하지만 실행 가능한 예제를 찾을 수 없습니다. 누군가가 Brython에서 ajax를 사용하는 간단한 예제를 보여 주면 아주 좋을 것입니다. 보다 구체적으로, 사용자가 입력 한 데이터를 제출 버튼을 클릭하여 텍스트 영역에 텍스트 영역으로 전달하는 방법. 어떤 도움을 주셔서 감사합니다!Brython에서 ajax를 사용하는 방법


(위의 질문을 게시 한 후 몇 주를 쓰고 있습니다). Flask (http://runnable.com/UiPhLHanceFYAAAP/how-to-perform-ajax-in-flask-for-python)에 아약스를 구현하는 방법에 대한이 자습서를 읽고 jryery.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) 

Brython/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의 view 함수에 데이터를 보내지 않는 것처럼 보입니다. 그러나 나는 그것을 수정하는 방법을 모른다. 어떤 사람이 정확히 내가 뭘 잘못하고 있는지 지적 할 수 있다면 좋을 것입니다.

답변

5

예에서 Ajax 요청은 GET 메소드와 함께 전송됩니다. 이 경우, 전송의 인수는() 무시 :

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 코드가 있어야 데이터를 URL에 추가 된 검색어 문자열을 전송해야 메서드를 사용하면 Brython 코드를 그대로 유지할 수 있지만 Flask 코드를 수정해야합니다. 함수가 POST 요청을 처리하도록 지정하고 "args"대신 "form"특성을 갖는 인수를 가져와야합니다.

@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) 
+0

정말 고마워요! 그것은 작동합니다! 내가 가진 유일한 질문은 : 수동으로 쿼리 문자열 (이 경우 "? a = % s & b = % s")에 인수를 포함해야합니까, 아니면 어떻게 든 자동으로 수행 할 수 있습니까? 다시 한번 고마워요! – chemist

+0

정말 Post 메서드를 선호합니다. 어느 쪽이든, 그렇습니다. 인수는 "수동"으로 포함되어야합니다 - 브라우저는 양식 값을 수집하여 전체 페이지를 다시로드하는 이벤트에 제출할 것을 "알고 있습니다". – jsbueno

2

나는 그것에 대해 연구 중입니다. 준비가되어있는 것은 없지만 파이썬 코드를 작성하면 정말 고통 스럽습니다.

내가 작업하고있는 코드를 게시 할 수 없다. (그리고 그다지 멀지 않다.) 기본적으로 (Br) Python 함수를 작성하여 HTML 또는 form DOM에서 반복 처리하고 json-nish 구조 (중첩 된 dicionaries 및 목록이있는 사전)에 "value"가 있습니다. - 사용자는 http://brython.info/doc/en/index.html#에 문서화 된대로 browser.ajax 객체를 사용하고 데이터를 매개 변수로 사용하여 객체를 " 보내기 "방법.

개체 데이터는 요청 본문에 URL 인코딩됩니다. 클라이언트 측에서 JSON으로 디코딩해야합니다.

추가 힌트 : 질문에 깊이 나지 않았지만 기본적으로 사용되는 URLencoding이 JSON에서 가능한 모든 것을 표현하지 못할 수도 있습니다. 그래서 brython의 JSON 모듈을 수입하고,이 같은 전송을 수행 json_data = json.loads(urllib.unquote(request.body).split(":",1)[-1])

(이하 "request.body는"피라미드에서이다 :이 날 클라이언트 측에서이 작업을 수행 할 수 있습니다

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

을 플라스크의 경우 "request.data"이지만 conte 유형이 플라스크에 이해되지 않는 경우에만 - How to get data received in Flask request을 확인하십시오.

+0

답장을 보내 주셔서 감사합니다.방금 Flask/brython 샘플을 포함하여 질문을 업데이트했습니다. 아직도 작동하지 않습니다. – chemist

관련 문제