目录
一.Flask 框架概述
Flask 作为一个微框架,强调简单性和灵活性。它依赖于两个重要的 Python 库来提供核心功能:
- Werkzeug:这是 Flask 的底层库,提供了 WSGI 接口、HTTP 请求和响应处理、路由等核心功能
- Jinja2:一个功能强大的模板引擎,用于动态生成 HTML 页面。
Flask 的设计目的是让开发者能够快速开发应用,并提供了灵活的方式进行扩展。如果你不需要复杂的功能,Flask的核心本身已经足够满足需求。如果你需要更多高级特性,可以通过 Flask 的扩展库进行补充。
(1).安装 Flask 框架
安装 Flask 非常简单,只需使用 Python 的包管理工具 pip 即可:
(2). 创建一个 Flask 应用
Flask的应用结构非常简单,只需创建一个 Python 文件,并通过 Flask()类来实例化应用对象。以下是一个最简单的Flask应用示例:
[root@bogon ~]# vim app.py
from flask import Flask
#创建 Flask 应用实例
app =Flask( __name__)
#定义路由和视图函数
@app.route('/')
def hello_world():
return 'Hello, World!'
#启动应用
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=5000)
代码解析:
代码 / 语法 | 功能说明 |
---|---|
Flask(__name__) |
创建 Flask 应用实例,__name__ 让 Flask 了解当前模块名称,辅助跨模块配置 |
@app.route('/') |
定义路由与视图函数映射,用户访问根 URL 时,调用关联视图函数(如 hello_world ) |
return 'aaaa' |
视图函数返回字符串,Flask 会将其封装为 HTTP 响应,返回给客户端 |
app.run(debug=True) |
启动 Flask 开发服务器,debug=True 启用调试模式,支持自动重载、错误详情展示 |
(3). 运行 Flask 应用
保存上述代码为 app.py,然后在命令行中运行:
这时 Flask 会启动一个开发服务器,默认会监听127.0.0.1:5000。打开浏览器,访问http://127.0.0.1:5000/,你会看到“hello”的页面。
二.Flask路由与视图函数
Flask 的核心之一就是路由系统,它将用户访问的 URL 与对应的视图函数相连接。Flask 通过装饰器@app.route()来定义路由,而视图函数则负责处理用户的请求并返回响应 。
(1).动态路由
Flask 支持动态路由参数,可以通过 URL 中的动态部分来获取数据。以下是一个示例:
@app.route('/greet/<name>')
def greet(name):
return f'hello,{lwy}!'
代码解析:
- :这是一个动态路由参数,Flask 会提取 URL 中的 name 部分并将其传递给视图函数
- 当用户访问/greet/John 时,name 的值将为 John,返回的响应为 Hello,John!
(2). 支持多种 HTTP 请求方法
Flask 不仅支持 GET 请求,还支持其他常见的 HTTP 请求方法,如 POST、PUT、DELETE 等。你可以通过methods 参数来指定允许的请求方法:
[root@localhost ~]# vim app.py
##定义路由和视图函数
@app.route('/submit',methods=['POST'])
def submit():
return 'ni hao,wodezuguo'
(3).使用 Jinja2 模板渲染 HTML
Flask 结合 Jinja2 模板引擎来动态生成 HTML 页面。你可以将 HTML 文件与 Python 代码分离,保持应用结构清晰。在 Flask 中,模板文件默认存放在 templates 文件夹中
假设我们有一个名为 greet.html 的模板文件,内容如下:
[root@localhost ~]# mkdir templates
[root@localhost ~]# cd templates/
[root@localhost templates]# vim greet.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask Example</title>
</head>
<body>
<h1>你好,{{name}}!</h1>
</body>
</html>
[root@localhost ~]# vim app.py
from flask import Flask,render_template
##定义路由和视图函数
@app.route('/greet/<name>')
def greet(name):
return render_template('greet.html',name=name)
创建脚本文件:
# 从 Flask 框架的核心模块中导入 Flask 类,用于创建 Flask 应用实例
from flask import Flask
# 从 Flask 框架中导入 render_template 函数,用于渲染 HTML 模板文件
from flask import render_template
# 创建 Flask 应用实例,__name__ 是 Python 内置变量,
# 它的值是当前模块的名称,Flask 会根据这个值来确定应用的根路径,
# 从而找到模板文件、静态文件等资源的位置
app = Flask(__name__)
# 使用 @app.route 装饰器为 '/greet/<name>' 路径注册视图函数。
# 这里的 <name> 是动态路由参数,会将 URL 中对应位置的值传递给视图函数的 name 参数
@app.route('/greet/<name>')
def greet(name):
# 调用 render_template 函数,渲染名为 'index.html' 的模板文件。
# 第二个参数 name=name 是将视图函数接收到的 name 参数传递给模板,
# 这样在模板中就可以使用 {{ name }} 来获取并显示这个值
return render_template('index.html', name=name)
# Python 的常见写法,判断当前脚本是否作为主程序运行。
# 当脚本直接被运行时(而不是被其他模块导入时),__name__ 的值会是 '__main__'
if __name__ == '__main__':
# 启动 Flask 应用。设置 host='0.0.0.0' 表示允许外部所有 IP 访问该应用;
# port=5000 指定应用监听的端口为 5000;debug=True 开启调试模式,
# 在调试模式下,代码修改后应用会自动重启,并且遇到错误时会显示详细的调试信息,方便开发调试
app.run(host='0.0.0.0', port=5000, debug=True)
访问测试:
(4). 模板继承与块
Flask 文持模板继承和块(Block)功能,这对于构建复杂页面非常有用。你可以在基础模板中定义通用的布局结构,在子模板中覆盖特定的部分。
基础模板 base.html:
[root@localhost ~]# cd templates/
[root@localhost templates]# vim base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<header>
<h1>欢迎访问!</h1>
</header>
<div>
{% block content %}{% endblock %}
</div>
<footer>
<p>©2025-06-13 My website</p>
</footer>
</body>
</html>
子模板:
[root@localhost ~]# cd templates/
[root@localhost templates]# vim index.html
{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
<h2>ni hao,huan ying fang wen wo de wangzhan</h2>
{% endblock %}
[root@localhost ~]# vim app.py
##定义路由和视图函数
@app.route('/')
def greet():
return render_template('index.html')
代码解析:
{% extends’base.html’%} | 子模板继承了 base.html 模板 |
{% block title %}Home{% endblock ‰} | 覆盖父模板中的 title 块 |
{% block content %} | 定义页面的主要内容区域 |
三. Flask 表单处理与用户输入
Flask可以通过表单来获取用户输入,常见的做法是结合Flask-WTF扩展来简化表单处理和验证
Flask-WTF 为 Flask 提供了一个表单类,你可以在表单类中定义字段和验证规则
(1).安装 Flask-WTF
pip install flask-wtf
(2).创建一个简单的表单
[root@localhost ~]# vim biaodan.py
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)
app.run(host='0.0.0.0', port=5000, debug=True)
index.html 模块:
[root@localhost ~]# cd templates/
[root@localhost templates]# ls
base.html greet.html index.html
[root@localhost templates]# rm -rf *
[root@localhost templates]# vim index.html
<a!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask Form</title>
</head>
<body>
<h1>Enter your name:</h1>
<form method="POST">
{{ form.csrf_token }}
<label for="name">Name:</label>
{{ form.name() }}<br><br>
<button type="submit">Submit</button>
</form>
{% if form.name.data %}
<h2>Hello, {{ form.name.data }}!</h2>
{% endif %}
</body>
</html>
代码解析:
字段 | 含义 |
---|---|
{{ form.csrf token }} | Flask-WTF 会自动生成并验证 CSRF token,以防止跨站请求伪造攻求 |
{{ form.name()}} | 这是通过 Jinja2 模板渲染 NameForm 表单的字段。form.name()会生成对应的 HTML 标签 |
{% if form.name.data %} | 如果用户提交了表单并且 name 字段不为空,则显示欢迎信息 |
四. Flask 的项目结构与部署
(1).项目结构
随着应用的复杂度增加,Flask应用的结构通常会发生变化。一个典型的Flask 项目结构如下:
/my flask app
/app
/templates
index.html
/static
/css
/js
_init_.py
routes.py
forms.py
run .py
字符 | 含义 |
---|---|
/templates | 存放所有 HTML 模板文件 |
/static | 存放静态文件(如CSS、JS、图片等) |
_ init _.py | 初始化Flask应用。routes.py:定义所有路由和视图函数 |
routes.py | 定义所有路由和视图函数 |
forms.py | 定义表单类 |
(2).部署 Flask 应用
Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 web 服务器进行部署,常见的有
Gunicorn | 一个Python WSGI HTTP 服务器,常用于生产环境部署 |
Nginx | 作为反向代理,前端处理静态文件请求,转发动态请求到Flask应用。部署时,可以通过以下命令启动 Flask 应用 |
gunicorn -w 4 run:app |
---|
这将启动一个4工作线程的 Gunicorn 服务器,run 是指向 Flask 应用实例的模块