从ajax

时间:2017-10-26 11:41:19

标签: python flask jinja2

我正在使用带有Jinja 2的Flask,并在用户单击“显示表”按钮时尝试向用户显示一个表,但不重新加载整个页面。 为此,我实现了一个工作正常的ajax调用。 问题是当我尝试将这些变量与Jinja一起使用时:

<urth-viz-table id="table" datarows="{{rows}}"
                        columns="{{header}}"
                        rows-visible="15"
                        selection-as-object>
</urth-viz-table>

Python给了我错误:

127.0.0.1 - - [26/Oct/2017 13:07:11] "POST /showTableQuestion HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1615, in full_dispatch_request
    return self.finalize_request(rv)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1630, in finalize_request
    response = self.make_response(rv)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1737, in make_response
    status=status_or_headers)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 801, in __init__
    self.headers = Headers(headers)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/datastructures.py", line 946, in __init__
    self.extend(defaults)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/datastructures.py", line 1079, in extend
    for key, value in iterable:
ValueError: need more than 1 value to unpack

您是否知道解决此问题的不同方法?

HTML文件show_quizz.html如下所示:

    {% if  question_obj.question == asked_question %}
                    Die Antwort des Users ist: {{ user_answer }}            <br/>
                    Die richtige Antwort ist: {{ question_obj.answer }}     <br/>
                    <form method="POST" action="{{ url_for('showTable') }}" id="csv_table">
                        <h3>Watch the underlying data to the question!</h3>
                        <input type="hidden" id="displayTable" name="question_obj_id_Table"
                                       value="{{ question_obj.id }}"/>
                        <button type="button">display Table</button>
                    </form>
                    <h1 id="didi"></h1>

                    {% if show_Table == "True" %}
                        <h2>HELLO</h2>
                        <!-- <script>console.log('fooo')</script> -->
                        <urth-viz-table id="table" datarows="{{rows}}"
                            columns="{{header}}"
                            rows-visible="15"
                            selection-as-object>
                        </urth-viz-table>
                    {% endif %}
 {% endif %}

使用的Python方法:

用于重新加载csv表ajax调用的页面

@app.route('/answer Table', methods=['POST'])   
def showTable():
    return render_template('show_quizz.html')

检索csv表以进行ajax调用

@app.route('/showTableQuestion', methods=['POST'])  
def showTableQuestion():
    table_url = Question.query.get_or_404(request.form['question_obj_id_Table']).table
    header, rows = generate_table(table_url)
    show_Table = "True"
    return (header , rows , show_Table)

用于ajax调用的Javascript:

$(function(){
    $('button').click(function(){
        //var question_obj_id = $('#displayTable').val();
        $.ajax({
            url: '/showTableQuestion',
            data: $('form').serialize(),
            type: 'POST',
            success: function(response){
                console.log(response)

            },
            error: function(error){
                console.log(error);
            }
        });
    });
});

1 个答案:

答案 0 :(得分:0)

通过ajax调用你的控制器的事实在这里是完全无关紧要的,你有同样的问题直接得到相同的url。

至于为什么会出现此错误,您的showTableQuestion()视图会返回一个(header , rows , show_Table)元组,according to the FineManual被解释为真正(response, status, headers),因此Flask会尝试从show_Table构建HTTP响应头,这是一个字符串,其中预期有key,value对序列。

FWIW,我自己从来没有使用过Flask,发现这个让我花了不到10分钟。发布您的问题肯定至少需要10分钟。也许您可以利用这段时间自己搜索FineManual?

(我不是故意粗鲁,但看起来越来越多的人认为SO是一个免费的调试服务,所以即使是最基本的努力,如阅读错误信息和追溯并检查文档

现在我不知道您从(header , rows , show_Table)返回此showTableQuestion()元组的期望是什么,但是如果您希望它在您的浏览器中神奇地重新渲染模板代码,那么我强烈建议您花点时间了解HTTP协议以及前端和后端代码之间的区别。