使用flask

时间:2017-01-22 15:56:36

标签: python python-2.7 flask jinja2

我正在学习烧瓶并尝试创建一个Web应用程序,该应用程序接受学生的姓名和标记,查找所有标记的总数并在表格中显示内容。但总数显示为0

代码如下:

mark_total.py:

from flask import Flask, render_template, request

app = Flask (__name__)

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

@app.route('/result', methods = ['POST', 'GET'])
def result():
        if request.method == 'POST':
                result = request.form
                return render_template('result.html', result = result)

if __name__ == '__main__':
        app.run(host = '0.0.0.0', debug = True)

student.html:          

        <form action = "/result" method = "POST">
                <p>Name <input type = "text" name = "Name" /></p>
                <p>Physics <input type = "text" name = "Physics" /></p>
                <p>Chemistry <input type = "text" name = "chemistry" /></p>
                <p>Maths <input type ="text" name = "Mathematics" /></p>
                <p><input type = "submit" value = "submit" /></p>
        </form>

</body>
</html>

result.html:     

<html>
        <head>
                <title>Results</title>
        </head>

        <body>
                <h1>{{result["Name"]}}'s results</h1>
                {% set total = 0 %}
                <table border = 1>
                {% for key, val in result.iteritems() %}
                        {% if key != 'Name' %}
                                {% set total = total|int + val|int %}
                                <tr>
                                        <td>{{ key }}</td>
                                        <td>{{ val }}</td>
                                        <td>{{ total }}</td>
                                </tr>
                        {% endif %}
                {% endfor %}
                <tr>
                        <td>Total</td>
                        <td>{{total}}</td>
                </tr>
                </table>
        </body>
</html>

输出的html源代码如下:

<html>
	<head>
		<title>Results</title>
	</head>
	<body>
		<h1>ABC's results</h1>
		<table border = 1>
			<tr>
				<td>Mathematics</td>
				<td>100</td>
				<td>100</td>
			</tr>
			<tr>
				<td>chemistry</td>
				<td>100</td>
				<td>100</td>
			</tr>
			<tr>
				<td>Physics</td>
				<td>100</td>
				<td>100</td>
			</tr>
			<tr>
				<td>Total</td>
				<td>0</td>
			</tr>
		</table>
	</body>
</html>

有人可以帮我理解如何解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

问题是循环内定义的total与循环外定义(和访问)的total不同。这就是本地范围的作用。

你可以通过使用这样的黑客来解决这个问题(改编自this回答)。

<html>
        <head>
                <title>Results</title>
        </head>

        <body>
                <h1>{{result["Name"]}}'s results</h1>
                {% set total = [0] %}
                <table border = 1>
                {% for key, val in result.iteritems() %}
                        {% if key != 'Name' %}
                                {% set _ = total.append(total.pop() + val|int) %}
                                <tr>
                                        <td>{{ key }}</td>
                                        <td>{{ val }}</td>
                                        <td>{{ total[0] }}</td>
                                </tr>
                        {% endif %}
                {% endfor %}
                <tr>
                        <td>Total</td>
                        <td>{{ total[0] }}</td>
                </tr>
                </table>
        </body>
</html>

但我真的不确定在模板中做这些事情是个好主意。模板的主要思想是将逻辑(如计算总数)和表示分开,这违反了这一原则。

答案 1 :(得分:1)

当你在循环中更改变量值时,除了dict之外,它不会影响循环外部:

{% set total = {'value': 0} %}
...
    {% if total.update({"value": c|int + total.value|int }) %} {% endif %}
...
    {{total.value}}