Flask 作为一个微框架,强调简单性和灵活性。它依赖于两个重要的 Python 库来提供核心功能:
安装 Flask 非常简单,只需使用 Python 的包管理工具 pip 即可:
pip install flask
安装完成后,你可以通过创建一个简单的 Flask 应用来验证是否安装成功。
Flask 的应用结构非常简单,只需创建一个 Python 文件,并通过 Flask () 类实例化应用对象。以下是一个最简单的 Flask 应用示例:
from flask import Flask
# 创建Flask应用实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
代码解析:
保存上述代码为 app.py,然后在命令行中运行:
python app.py
这时 Flask 会启动一个开发服务器,默认会监听 127.0.0.1:5000。打开浏览器,访问 http://127.0.0.1:5000/,你会看到 “Hello, World!” 的页面。
Flask 的核心之一就是路由系统,它将用户访问的 URL 与对应的视图函数相连接。Flask 通过装饰器 @app.route () 来定义路由,而视图函数则负责处理用户的请求并返回响应。
Flask 支持动态路由参数,可以通过 URL 中的动态部分来获取数据。以下是一个示例:
@app.route('/greet/')
def greet(name):
return f'Hello, {name}!'
代码解析:
Flask 不仅支持 GET 请求,还支持其他常见的 HTTP 请求方法,如 POST、PUT、DELETE 等。你可以通过 methods 参数来指定允许的请求方法:
@app.route('/submit', methods=['POST'])
def submit():
return 'Form submitted successfully!'
代码解析:
Flask 结合 Jinja2 模板引擎来动态生成 HTML 页面。你可以将 HTML 文件与 Python 代码分离,保持应用结构清晰。在 Flask 中,模板文件默认存放在 templates 文件夹中。
假设我们有一个名为 greet.html 的模板文件,内容如下:
Flask Example
Hello, {{ name }}!
在 Flask 应用中,我们可以通过 render_template 函数渲染模板并传递动态数据:
from flask import render_template
@app.route('/greet/')
def greet(name):
return render_template('greet.html', name=name)
代码解析:
Flask 支持模板继承和块(Block)功能,这对于构建复杂页面非常有用。你可以在基础模板中定义通用的布局结构,在子模板中覆盖特定的部分。
基础模板 base.html:
{% block title %}My Website{% endblock %}
Welcome to My Website
{% block content %}{% endblock %}
子模板 index.html:
{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
Welcome to the homepage!
{% endblock %}
代码解析:
Flask 可以通过表单来获取用户输入,常见的做法是结合 Flask - WTF 扩展来简化表单处理和验证。
Flask - WTF 为 Flask 提供了一个表单类,你可以在表单类中定义字段和验证规则。
pip install flask - wtf
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.secret_key ='s3cr3t'
class NameForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
return f'Hello, {form.name.data}!'
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
代码解析:
index.html 模板:
Flask Form
Enter your name:
{% if form.name.data %}
Hello, {{ form.name.data }}!
{% endif %}
代码解析:
Flask 表单处理的强大之处在于它的验证机制。通过 wtforms,你可以非常方便地为表单字段添加各种验证规则。比如,除了 DataRequired (),你还可以使用:
随着应用的复杂度增加,Flask 应用的结构通常会发生变化。一个典型的 Flask 项目结构如下:
/my_flask_app
/app
/templates
index.html
/static
/css
/js
init.py
routes.py
forms.py
run.py
Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 Web 服务器进行部署,常见的有:
部署时,可以通过以下命令启动 Flask 应用:
gunicorn -w 4 run:app
/simple_blog
/app
/templates
index.html
app.py
from flask import Flask, render_template, request
app = Flask(__name__)
# 存储所有文章
posts = []
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
posts.append({'title': title, 'content': content})
return render_template('index.html', posts=posts)
if __name__ == '__main__':
app.run(debug=True)
Simple Blog
Welcome to the Blog!
Submit a Post
Posts:
{% for post in posts %}
-
{{ post.title }}
{{ post.content }}
{% endfor %}
</li>
{% endfor %}