目录
一:Flack框架
1.Flask 框架概述
(1)安装 Flask
(2)创建你的第一个 Flask 应用
(3)运行 Flask 应用
2.Flask 路由与视图函数
(1)动态路由
(2)支持多种 HTTP 请求方法
(3)使用 Jinja2 模板渲染 HTML
(4)模板继承与块
3.Flask 表单处理与用户输入:
(1)安装 Flask-WTF:
(2)创建一个简单的表单
(3)表单验证
4.Flask 的项目结构与部署
(1)项目结构
(2)部署 Flask 应用
5.小案例:简单博客应用
(1)项目结构
(2)app.py代码
(3)index.html模板
(4)代码解析:
(5)运行博客应用:
Flask 作为一个微框架,强调简单性和灵活性。它依赖于两个重要的 Python 库来提供核心功能:
Werkzeug:这是 Flask 的底层库,提供了 WSGI 接口、HTTP 请求和响应处理、路由等核心功能。
Jinja2:一个功能强大的模板引擎,用于动态生成 HTML 页面。
Flask 的设计目的是让开发者能够快速开发应用,并提供了灵活的方式进行扩展。如果你不需要复杂的功能,Flask 的核心本身已经足够满足需求。如果你需要更多高级特性,可以通过 Flask 的扩展库进行补充。
安装 Flask 非常简单,只需使用 Python 的包管理工具 pip 即可:
pip3 install flask
安装完成后,你可以通过创建一个简单的 Flask 应用来验证是否安装成功。
Flask 的应用结构非常简单,只需创建一个 Python 文件,并通过 Flask () 类来实例化应用对象。以下是一个最简单的 Flask 应用示例:
from flask import Flask
#创建Flask应用实例
app = Flask(__name__)
#定义路由和视图函数
@app.route('/')
def hrllo_world():
return 'Hello,World'
#启动应用
if__name__ == '__name__':
app.run(debug=True)
代码解析:
代码/配置 | 说明 |
---|---|
Flask(__name__) |
创建 Flask 应用实例,__name__ 参数用于帮助 Flask 在不同模块间进行配置。 |
@app.route('/') |
定义路由和视图函数的映射。'/' 是根路径,访问根 URL 时会调用对应的视图函数 hello_world() 。 |
return 'Hello, World!' |
视图函数返回一个字符串响应,Flask 会将其作为 HTTP 响应返回给客户端。 |
app.run(debug=True) |
启动 Flask 开发服务器,debug=True 启用调试模式,支持自动重载和显示详细错误信息。 |
保存上述代码为 app.py,然后在命令行中运行:
python3 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}!'
代码解析:
当用户访问 /greet/John 时,name 的值将为 John,返回的响应为 Hello, John!。
Flask 不仅支持 GET 请求,还支持其他常见的 HTTP 请求方法,如 POST、PUT、DELETE 等。你可以通过 methods 参数来指定允许的请求方法:
pp.route('/submit', methods=['POST'])
def submit():
return 'Form submitted successfully!'
代码解析:
methods=['POST']:只允许 POST 请求访问此路由。如果用户通过 GET 请求访问,Flask 会返回 405 Method Not Allowed 错误。
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)
代码解析:
render_template ('greet.html', name=name):Flask 会加载 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 %}
代码解析:
代码片段 | 解析说明 |
---|---|
{% extends 'base.html' %} |
子模板继承 base.html 模板 |
{% block title %}Home{% endblock %} |
覆盖父模板中的 title 块 |
{% block content %} |
定义页面的主要内容区域 |
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 = 'sbcgt'
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)
代码解析:
代码相关内容 | 解析说明 |
---|---|
FlaskForm |
继承自 FlaskForm 类,用于定义表单字段 |
StringField('Name', validators=[DataRequired()]) |
定义文本输入字段,名为 Name ,借助 DataRequired() 验证器保证该字段提交时不能为空 |
form.validate_on_submit() |
用于检查表单是否通过验证且处于提交状态(即用户提交表单后,验证字段是否符合规则 ) |
index.html
模板
Flask Form
Enter your name:
{% if form.name.data %}
{% endif %}
代码解析:
代码片段 | 解析说明 |
---|---|
{{ form.csrf_token }} |
Flask - WTF 自动生成并验证 CSRF token,防范跨站请求伪造攻击 |
{{ form.name() }} |
借助 Jinja2 模板渲染 NameForm 表单的 name 字段,生成对应的 HTML 输入框 |
{% if form.name.data %} |
条件判断逻辑,用户提交表单且 name 字段数据非空时,执行后续显示内容逻辑 |
Flask 表单处理的强大之处在于它的验证机制。通过 wtForms,你可以非常方便地为表单字段添加各种验证规则。比如,除了 DataRequired (),你还可以使用:
验证规则写法 | 验证功能说明 |
---|---|
Length(min=2, max=50) |
校验输入内容长度在 2 - 50 之间 |
Email() |
校验输入是否为有效的电子邮箱地址 |
EqualTo('password') |
校验当前字段与名为 password 字段的值是否相等 |
随着应用的复杂度增加,Flask 应用的结构通常会发生变化,一个典型的 Flask 项目结构如下:
# 项目目录结构
mv_flask_app/
├── app/
│ ├── templates/ # 模板目录
│ │ └── index.html # 主模板文件
│ ├── static/ # 静态资源目录
│ │ ├── css/ # CSS 样式文件
│ │ └── js/ # JavaScript 文件
│ ├── __init__.py # 应用包初始化文件
│ ├── routes.py # 路由定义文件
│ └── forms.py # 表单定义文件
└── run.py # 应用启动文件
文件 / 目录名 | 作用说明 |
---|---|
templates |
存放所有 HTML 模板文件 |
static |
存放静态文件(如 CSS、JS、图片等) |
__init__.py |
初始化 Flask 应用 |
routes.py |
定义所有路由和视图函数 |
forms.py |
定义表单类 |
Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 Web 服务器进行部署。常见的有:
Gunicorn:一个 Python WSGI HTTP 服务器,常用于生产环境部署。
Nginx:作为反向代理,前端处理静态文件请求,转发动态请求到 Flask 应用。
部署时,可以通过以下命令启动 Flask 应用:
gunicorn -w 4 run:app
这将启动一个 4 工作线程的 gunicorn 服务,run 是指向 Flask 应用实例的模块。
在上文中,我们已经介绍了 Flask 的核心概念和基本操作,现在,我们结合这些知识,创建一个简单的博客应用,允许用户提交文章并展示在页面上。
# 项目目录结构
mv_flask_app/
├── app/
│ ├── templates/ # 模板目录
│ │ └── index.html # 主模板文件
│ ├── static/ # 静态资源目录
│ │ ├── css/ # CSS 样式文件
│ │ └── js/ # JavaScript 文件
│ ├── __init__.py # 应用包初始化文件
│ ├── routes.py # 路由定义文件
│ └── forms.py # 表单定义文件
└── run.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 %}
功能模块 | 实现说明 |
---|---|
数据存储 | 用 Python 的 posts 列表存提交的文章,单篇文章以含 title 、content 的字典表示 |
表单提交 | 用户表单提交文章时,Flask 把标题和内容添加至 posts 列表 |
模板渲染 | Flask 借 render_template 把文章渲染到 index.html ,用 {% for post in posts %} 循环展示 |
1.将 app.py 和 index.html 保存到相应文件夹中。
2.在命令行中运行 Flask 应用:
python app.py
3.访问 http://127.0.0.1:5000/,你将看到一个简单的博客界面,能够提交文章并查看已发布的内容。
注意:
和前面的实验一起做的时候这里可能访问报错,如果有错误,清理一下缓存即可。