Flask和Jinja2是一对经典的组合,Jinja2是Python中一种基于模板的语言,而Flask则是一个轻量级的web框架。
安装
首先,我们需要安装两个模块,Flask和Jinja2。可以通过pip来进行安装:
pip install Flask
pip install Jinja2
创建Flask应用
首先,在项目根目录下创建一个app.py文件,用于创建Flask应用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
创建html模板
创建一个名为templates
的文件夹,用于存放HTML模板。在templates文件夹下,创建一个名为index.html
的文件,用于显示刚才Flask应用返回的Hello, World!
。在index.html文件中,可以使用Jinja2模板语言:
<!DOCTYPE html>
<html>
<head>
<title>Flask + Jinja2 Example</title>
</head>
<body>
<h1>{{ greeting }}</h1>
</body>
</html>
安装jinja2
在app.py文件中加入以下代码,告诉Flask去哪里查找HTML模板:
import os
from flask import Flask, render_template
app = Flask(__name__)
app.template_folder = os.path.abspath('templates')
@app.route('/')
def index():
return render_template('index.html', greeting='Hello, World!')
if __name__ == '__main__':
app.run()
render_template()
函数将HTML模板中使用的变量和实际的值进行关联,这样{{ greeting }}
就会被替换为Hello, World!
。
同时,为了保证代码的可读性和可维护性,可以使用Jinja2中的模板继承。在templates文件夹下,创建一个名为base.html
的文件,用于提供页面的公共部分:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Flask + Jinja2 Example{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
在index.html中,通过Jinja2的模板继承,让base.html提供公共结构,而index.html只需关注自己的内容:
{% extends "base.html" %}
{% block title %}Flask + Jinja2 Example{% endblock %}
{% block content %}
<h1>{{ greeting }}</h1>
{% endblock %}
这样,我们就可以使用Flask和Jinja2结合进行web开发了。
示例一:表单处理
在上面的例子中,我们仅展示了如何将变量传递给HTML模板。接下来,我们将展示如何通过HTML表单和Flask进行交互。
在templates文件夹下,创建一个名为form.html
的HTML文件,用于展示表单。HTML代码如下:
{% extends "base.html" %}
{% block title %}Flask + Jinja2 Example{% endblock %}
{% block content %}
<h1>Flask Form Example</h1>
<form method="POST" action="{{ url_for('form_submit') }}">
<label for="name">Name:</label>
<input type="text" name="name" id="name">
<label for="email">Email:</label>
<input type="email" name="email" id="email">
<input type="submit" value="Submit">
</form>
{% endblock %}
其中{{ url_for('form_submit') }}
将表单的action
指向了一个名为form_submit的路由函数。
在app.py中,加入路由函数form_submit:
from flask import Flask, render_template, request
app = Flask(__name__)
app.template_folder = os.path.abspath('templates')
@app.route('/form', methods=['GET'])
def form():
return render_template('form.html')
@app.route('/form', methods=['POST'])
def form_submit():
name = request.form.get('name')
email = request.form.get('email')
return f'Hello, {name} ({email})!'
if __name__ == '__main__':
app.run()
在form_submit中,通过request.form获取表单中用户输入的内容,并将最终结果返回给用户。
示例二:数据库操作
在Flask中,ORM工具Flask-SQLAlchemy是应用最广泛的数据库操作扩展。下面展示如何使用Flask和Jinja2结合进行数据库操作。
首先,需要使用pip安装Flask-SQLAlchemy:
pip install Flask-SQLAlchemy
然后,修改app.py,添加数据库配置:
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.template_folder = os.path.abspath('templates')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
email = db.Column(db.String(100))
db.create_all()
@app.route('/users', methods=['GET'])
def users():
users = User.query.all()
return render_template('users.html', users=users)
if __name__ == '__main__':
app.run()
在这个例子中,我们首先定义一个User模型类,其中包含三个属性id、name和email。然后,通过db.create_all()函数来创建相应的数据表。
最后,在路由函数users中,使用User.query.all()获取所有的用户,并将结果传递给HTML模板。
在templates文件夹下,创建一个名为users.html
的HTML文件,展示数据库中的用户信息:
{% extends "base.html" %}
{% block title %}Flask + Jinja2 Example{% endblock %}
{% block content %}
<h1>Flask Database Example</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.email }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
其中,{% for user in users %}
遍历了所有的用户,将结果渲染到HTML表格中。
这就是使用Flask和Jinja2进行web开发的基本流程。通过Flask和Jinja2的结合,可以让web开发变得更加简单、高效、易维护。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:flask结合jinja2使用详解 - Python技术站