目录
1:Flask框架概述
Flask 是一个基于 Python 的 轻量级 Web 框架,遵循 “微框架”(Microframework) 设计理念。它提供了 Web 开发的核心功能(如路由、请求/响应处理、模板渲染等),但不强制集成额外组件(如数据库 ORM、用户认证),开发者可以自由选择扩展来增强功能。
1.1:安装Flask
Linux自带python:
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
#信任更新源
pip3 config set install.trusted-host mirrors.aliyun.com
pip3 install --upgrade pip #设置更新源
history
网站编程:
Flask框架:
#安装Flask框架:
pip install flask
1.2:创建你的的一个Flask应用
创建一个测试文件vim aaa.py
from flask import Flask #导入模块
app=Flask(_name_) #创建一个flask应用
@app.route('/') #定义路由和视图函数
def hello_word():
return 'hello,word!\n'
#api应用层接口,默认监听5000端口
if _name_ == '_main_': #启动应用,创建入口
app.run(host='0.0.0.0',port=5000,debug=True) #debug=True启动调试模式
代码解析:
- Flask(name):创建 Flask 应用实例,__name__参数用于 Flask 了解当前模块的名称,通常我们使用这个参数来帮助 Flask 在不同模块间进行配置。
- @app.route ('/'):定义路由和视图函数的映射。'/' 是根路径,当用户访问根 URL 时,Flask 会调用 hello_world () 函数。
- return 'Hello, World!':视图函数返回一个简单的字符串响应,Flask 会将其作为 HTTP 响应返回给客户端。
- app.run (debug=True):启动 Flask 开发服务器,debug=True 表示启用调试模式,这样可以在开发过程中自动重载应用,并在发生错误时显示详细信息。
1.3:运行Flask应用
#运行程序
python3 aaa.py
#客户端访问
curl 192.168.10.101:5000
2:Flask路由与视图函数
2.1:动态路由
-
作用:处理URL中的可变部分,实现参数传递。
-
语法:
@app.route('/path/<variable>')
,<variable>
默认是字符串类型。 -
类型转换器:
-
:默认,接受任何不包含斜杠的文本。 string
-
int
:接受正整数。 -
float
:接受正浮点数。 -
path
:类似string
但包含斜杠。 -
uuid
:接受UUID字符串。
-
@app.route('/greet/<name>') #动态路由
de greet(name):
return f'hello,{name}\n' #f返回的是字符串
2.2:支持多种HTTP请求方法
-
默认方法:
GET
,可通过methods
参数指定其他方法(如POST
、PUT
、DELETE
等)。 -
获取请求方法:通过
request.method
判断当前请求类型。
#支持多种HTTP请求方法
@app.route('/submit',methods=['POST'])
def submit():
return 'Form submitted successfully!\n'
代码解析:
methods=['POST']
限制该路由只能通过 POST 请求访问。如果客户端发送 GET 请求到/submit
,会返回 405 Method Not Allowed 错误。
2.3:使用jinja2模板渲染HTML
-
步骤:
-
创建
templates
文件夹存放HTML模板。 -
使用
render_template()
函数渲染模板并传递变量。
-
-
变量传递:在模板中用
{{ variable }}
显示动态内容。 -
控制结构:支持
{% if %}``{% for %}
等逻辑语句。
mkdir templates #创建文件用于存放模块
cd templates/
vim greet.html
<html>
<head>
<meta charset='UTF-8'>
<title>zhangsan</title>
</head>
<body>
<h1>hello,{{ name }}</h1>
</body>
</html>
:set paste #取消自动缩进
#修改aaa.py
from flask import Flask,render_template #导入模块
#修改aaa.py中的动态路由
@app.route('/greet/<name>') #动态路由
de greet(name):
return render_template('greet.html',name=name)
客户端访问浏览器:
http://192.168.10.101
代码解析:
render_template('模板名.html', 变量名1=值1, 变量名2=值2, ...)
。模板文件需放在项目根目录下的templates
文件夹中。
2.4:模板继承与块
-
模板继承:通过
{% extends "base.html" %}
继承基础模板,避免重复代码。 -
块(Block):
-
基础模板中定义可替换块:
{% block block_name %}{% endblock %}
。 -
子模板中覆盖块内容:
{% block block_name %}New Content{% endblock %}
。
-
cd templates/
基础模板(父模版)vim base.html
<html>
<head>
<meta charset='UTF-8'>
<title>
{% block title %}My Website{% endblock %}
</title>
</head>
<body>
<header>
<h1>Welcome to My Website</h1>
</header>
<div>{% block content %}{% endblock %}</div>
<footer>
<p>©2025 My Website</p>
</footer>
</body>
</html>
#div:分区标签
子模版(子模版调用父模版)vim index.html
{% extends 'base.html' %}
{% block title %}Home{% endblock %}
{% block content %}
<h2>Welcome to the homepage!</h2>
{% endblock %}
3:Flask表单处理与用户输入
3.1:安装Flask-WTF
-
作用:Flask-WTF是简化表单处理的扩展,集成WTForms(表单验证和渲染库)。
-
安装:
pip install flask-wtf
3.2:创建一个简单的表单
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email
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)
代码解析:
- FlaskForm:继承自 FlaskForm 类,定义表单字段。
- StringField ('Name', validators=[DataRequired ()]):定义了一个文本输入字段,并且通过 DataRequired () 验证器确保字段不能为空。
- form.validate_on_submit ():检查表单是否通过验证并被提交。
index.html模板:
<html>
<head>
<meta charset='UTF-8'>
<title>zhangsan</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,{{ from.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 字段不为空,则显示欢迎信息。
3.3:表单验证
-
验证流程:
-
视图函数中创建表单实例。
-
调用
form.validate_on_submit()
检查请求是否为POST
且数据有效。 -
若验证通过,处理数据;否则返回模板显示错误。
-
-
错误显示:通过
form.field.errors
获取错误信息。
- Length (min=2, max=50):验证输入的长度。
- Email ():验证输入是否是有效的邮箱地址。
- EqualTo ('password'):验证两个字段的值是否相等。
4:Flask的项目结构与部署
4.1:项目结构
/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:定义所有路由和视图函数。
✓ forms.py:定义表单类。
4.2:部署Flask应用
Flask 应用的开发环境通常使用 Flask run 启动,但在生产环境中,我们需要通过更强大的 Web 服务器进行部署,常见的有:
- Gunicorn:一个 Python WSGI HTTP 服务器,常用于生产环境部署。
- Nginx:作为反向代理,前端处理静态文件请求,转发动态请求到 Flask 应用。
部署时,可以通过以下命令启动 Flask 应用:
gunicorn -w 4 run:app
5:小案例:简单博客应用
5.1:项目结构
blog_app/
│
├── app.py # 主应用文件
├── templates/ # 模板目录
│ └── index.html # 首页模板
├── static/ # 静态文件目录(可选)
│ ├── css/ # CSS样式文件
│ └── js/ # JavaScript文件
└── requirements.txt # 依赖文件(可选)
5.2: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)
5.3:index.html模板
<!DOCTYPE html>
<html>
<head>
<title>简单博客</title>
</head>
<body>
<h1>我的博客</h1>
<h2>添加新文章</h2>
<form action="/add" method="post">
<label for="title">标题:</label><br>
<input type="text" id="title" name="title" required><br>
<label for="content">内容:</label><br>
<textarea id="content" name="content" required></textarea><br>
<button type="submit">发布</button>
</form>
<h2>文章列表</h2>
{% if posts %}
<ul>
{% for post in posts %}
<li>
<h3>{{ post.title }}</h3>
<p>{{ post.content }}</p>
</li>
{% endfor %}
</ul>
{% else %}
<p>还没有文章,赶快添加一篇吧!</p>
{% endif %}
</body>
</html>
5.4:代码解析
- 数据存储:我们通过 Python 的 posts 列表存储所有提交的文章,每一篇文章由一个包含 title 和 content 的字典表示。
- 表单提交:当用户通过表单提交文章时,Flask 会将文章的标题和内容添加到 posts 列表中。
- 模板渲染:Flask 通过 render_template 将所有文章渲染到 index.html 模板中,使用 {% for post in posts %} 循环显示每一篇文章。
5.5:运行博客应用
- 将 app.py 和 index.html 保存到相应文件夹中。
- 在命令行中运行 Flask 应用:
python app.py- 访问http://127.0.0.1:5000/,你将看到一个简单的博客界面,能够提交文章并查看已发布的内容。