目录
Flask框架基本概述
一、Werkzeug(Flask底层核心)
二、Jinja2(模板引擎)
三、两者协作关系
基本部署
Flask表单处理与用户输出
1. 基础表单处理(原生 Flask)
2. 使用 Flask-WTF 扩展
3. 模板文件示例
4. 文件上传处理
Flask的项目结构与部署
Flask作为一个微框架,强调简单性和灵活性。它依赖于两个重要的python库来提供核心功能:
{% extends "base.html" %}
{% block content %}
{{ title }}
{% for item in items %}
{{ item|capitalize }}
{% endfor %}
{% endblock %}
两者共同构成Flask的"微框架"特性基础,使开发者可灵活扩展其他功能
安装flask
pip install flask
创建应用
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello,World!'
if __name__ == '__main__':
app.run(debug=True)
代码解析:
运行应用
python3 home.py
Flask路由与视图函数
路由
一、核心概念解析
/about
)和动态路径(如/user/
)@app.route()
快速注册典型部署
from flask import Flask
app = Flask(__name__)
# 静态路由
@app.route('/')
def home():
return 'Welcome to Homepage'
# 动态路由
@app.route('/user/')
def show_user(username):
return f'User: {username}'
if __name__ == '__main__':
app.run(debug=True)
此示例展示静态路由和带参数的动态路由实现
flask import Flask, request
app = Flask(__name__)
# 类型转换器
@app.route('/post/')
def show_post(post_id):
return f'Post ID: {post_id} (type: {type(post_id)})'
# 支持多种HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return 'Processing login'
return 'Show login form'
演示了参数类型转换和HTTP方法限制
使用Jinja2模块渲染HTML
Flask 结合 Jinja2 模板引擎来动态生成 HTML 页面。你可以将 HTML 文件与 Python 代码分离,保持应用结构清晰。在 Flask 中,模板文件默认存放在 templates 文件夹中。
假设我们有一个名为 greet.html 的模板文件,内容如下:
Flask Example
Hello,{{ name }}!
我们可以通过render_template函数模块并传递动态数据:
from flask import render_template
@app.route('/greet/')
def greet(name):
return render_template('greet.html',name=name)
return render_template('greet.html',name=name):Flask会加载greet.html模块,并将name的值传递给模块。模块中的{{ name }}会被替换为传入的值。
模块继承与块
Flask支持模板继承和块(Block)功能,这对于构建复杂页面非常有用。你可以在基础模板中定义通用的布局结构,在子模版中覆盖特定的部分。
基础模板 base.htm1:
(% block title %}My Website{% endblock %}
Welcome to My website
{% block content %}{% endblock %}
子模版index.html
{% extends 'base.html' %}
{% block title x}Home{% endblock %}
{% block content %}
Welcome to the homepage!
{% endblock %}
代码解析:
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
return f"登录成功: 用户名 {username}"
return render_template('login.html')
代码解析:
request.method
判断请求类型,GET 返回表单页面,POST 处理提交数据。request.form
直接获取表单数据,需确保字段名与 HTML 表单一致。 flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length
class LoginForm(FlaskForm):
username = StringField('用户名', validators=[DataRequired(), Length(min=4)])
password = PasswordField('密码', validators=[DataRequired()])
submit = SubmitField('登录')
代码解析:
FlaskForm
定义表单字段,每个字段绑定验证器(如 DataRequired
必填)。StringField
和 PasswordField
分别对应文本和密码输入框。from flask import Flask, render_template
from forms import LoginForm
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key' # CSRF防护必需
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit(): # 自动验证表单
return f"欢迎, {form.username.data}"
return render_template('login_wtf.html', form=form)
validate_on_submit()
自动检查请求类型和字段验证。SECRET_KEY
启用 CSRF 防护,防止跨站攻击。form.field_name.data
获取已验证的数据。
登录
代码解析:
form.hidden_tag()
自动生成 CSRF 令牌隐藏字段。form.field_name()
渲染表单字段,form.field_name.label
渲染标签。from flask import Flask, request
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files['file']
filename = secure_filename(file.filename)
file.save(f"uploads/{filename}")
return "文件上传成功"
代码解析:
request.files
获取上传文件对象。secure_filename
过滤危险字符,防止路径遍历攻击。关键点总结
项目结构
随着应用的复杂度增加,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