Flask 是一个轻量级的 Python Web 框架,它简单易用但功能强大,非常适合快速开发小型到中型的 Web 应用程序。以下是 Flask 的核心概念和用法讲解:
1. Flask 基本结构 #
# 导入Flask框架
from flask import Flask
# 创建Flask应用实例
app = Flask(__name__)
# 判断是否直接运行此文件
if __name__ == '__main__':
# 启动Flask开发服务器
app.run()2. 路由和视图函数 #
Flask 使用 `@app.route()` 装饰器来定义路由:
# 导入Flask框架
from flask import Flask
# 创建Flask应用实例
app = Flask(__name__)
+# 定义根路由,当用户访问网站首页时调用此函数
+@app.route('/')
+# 定义首页视图函数
+def index():
+ # 返回首页内容
+ return '首页'
+
+# 定义关于页面路由,当用户访问 /about 路径时调用此函数
+@app.route('/about')
+# 定义关于页面视图函数
+def about():
+ # 返回关于页面的内容
+ return '关于我们'
# 判断是否直接运行此文件
if __name__ == '__main__':
# 启动Flask开发服务器
app.run()动态路由 #
# 导入Flask框架
from flask import Flask
# 创建Flask应用实例
app = Flask(__name__)
+# 定义用户资料页面路由,使用动态参数username
+@app.route('/user/<username>')
+# 定义显示用户资料的视图函数,接收username参数
+def show_user_profile(username):
+ # 返回包含用户名的页面内容
+ return f'用户: {username}'
+# 定义文章页面路由,使用动态参数post_id,指定为整数类型
+@app.route('/post/<int:post_id>')
+# 定义显示文章的视图函数,接收post_id参数
+def show_post(post_id):
+ # 返回包含文章ID的页面内容
+ return f'文章 ID: {post_id}'
# 判断是否直接运行此文件
if __name__ == '__main__':
# 启动Flask开发服务器
app.run()3. 请求和响应 #
处理请求数据 #
# 导入Flask框架和request模块,用于处理HTTP请求
from flask import Flask, request
# 创建Flask应用实例,__name__表示当前模块名
app = Flask(__name__)
# 定义登录页面路由,支持GET和POST两种HTTP请求方法
@app.route('/login', methods=['GET', 'POST'])
# 定义登录视图函数,处理用户登录逻辑
def login():
# 判断请求方法是否为POST(表单提交)
if request.method == 'POST':
# 从POST请求的表单数据中获取用户名
username = request.form['username']
# 从POST请求的表单数据中获取密码
password = request.form['password']
# 在控制台打印用户名和密码信息(用于调试)
print(f'用户名: {username}, 密码: {password}')
# 返回登录成功的消息给用户
return '登录成功'
else:
# 如果是GET请求,调用函数显示登录表单页面
return show_login_form()
# 定义显示登录表单的函数,返回HTML格式的登录页面
def show_login_form():
# 返回包含登录表单的完整HTML页面
return '''
<!doctype html>
<html>
<head><title>登录</title></head>
<body>
<h1>用户登录</h1>
<form method="POST">
<p>用户名: <input type="text" name="username" required></p>
<p>密码: <input type="password" name="password" required></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
'''
# 判断当前脚本是否作为主程序直接运行(而不是被导入)
if __name__ == '__main__':
# 启动Flask开发服务器,开始监听HTTP请求
app.run()返回响应 #
make_response 是 Flask 中用于创建自定义 HTTP 响应的函数,它提供了比直接返回字符串更灵活的响应控制。
基本用法 #
# 导入Flask框架和make_response模块,用于创建自定义HTTP响应
from flask import Flask, make_response
# 创建Flask应用实例,__name__表示当前模块名
app = Flask(__name__)
# 定义自定义响应页面路由,当用户访问 /custom-response 路径时调用此函数
@app.route('/custom-response')
# 定义自定义响应视图函数,创建带有自定义头部的HTTP响应
def custom_response():
# 使用make_response创建自定义响应对象,内容为'自定义响应'
response = make_response('自定义响应')
# 为响应添加自定义头部字段,设置X-Custom-Header的值为'Value'
response.headers['X-Custom-Header'] = 'Value'
# 返回自定义响应对象给客户端
return response
# 判断当前脚本是否作为主程序直接运行(而不是被导入)
if __name__ == '__main__':
# 启动Flask开发服务器,开始监听HTTP请求
app.run()4. 模板渲染 #
Flask 使用 Jinja2 模板引擎:
# 导入Flask框架和render_template模块,用于创建Web应用和渲染HTML模板
from flask import Flask, render_template
# 创建Flask应用实例,__name__表示当前模块名
app = Flask(__name__)
# 定义动态路由,当用户访问 /hello/<name> 路径时调用此函数,其中<name>是动态参数
@app.route('/hello/<name>')
# 定义hello视图函数,接收name参数并渲染模板
def hello(name):
# 使用render_template渲染hello.html模板,并将name变量传递给模板
return render_template('hello.html', name=name)
# 判断当前脚本是否作为主程序直接运行(而不是被导入)
if __name__ == '__main__':
# 启动Flask开发服务器,开始监听HTTP请求
app.run()对应的模板文件 templates\hello.html:
<!doctype html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>5. 静态文件 #
静态文件(CSS, JS, 图片)放在 static 目录下:
url_for() 是 Flask 框架中一个非常有用的函数,用于动态生成 URL。它可以帮助你避免在代码中硬编码 URL,使应用更易于维护和扩展。
url_for('static', filename='style.css') # 生成 /static/style.csstemplates\hello.html
<!doctype html>
<html>
<head>
<title>Hello</title>
+ <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>static\style.css
body{
color:red;
}6. 错误处理 #
# 导入Flask框架和render_template模块,用于创建Web应用和渲染HTML模板
from flask import Flask, render_template
# 创建Flask应用实例,__name__表示当前模块名
app = Flask(__name__)
# 定义动态路由,当用户访问 /hello/<name> 路径时调用此函数,其中<name>是动态参数
@app.route('/hello/<name>')
# 定义hello视图函数,接收name参数并渲染模板
def hello(name):
# 使用render_template渲染hello.html模板,并将name变量传递给模板
return render_template('hello.html', name=name)
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html', error=error), 404
# 判断当前脚本是否作为主程序直接运行(而不是被导入)
if __name__ == '__main__':
# 启动Flask开发服务器,开始监听HTTP请求
app.run()templates\404.html
<!doctype html>
<html>
<head>
<title>Hello</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<h1>{{ error }}</h1>
</body>
</html>7. 重定向和会话 #
# 导入Flask框架和相关模块,包括重定向、URL生成、会话管理和请求处理功能
from flask import Flask, redirect, url_for, session, request
# 创建Flask应用实例,__name__参数表示当前模块的名称
app = Flask(__name__)
# 设置应用密钥,用于加密会话数据,确保会话安全
app.secret_key = 'your-secret-key'
# 定义管理员检查函数,通过会话中的用户名判断是否为管理员
def is_admin():
# 从会话中获取用户名,如果等于'admin'则返回True,否则返回False
return session.get('username') == 'admin'
# 定义管理员页面路由,当用户访问/admin路径时调用此函数
@app.route('/admin')
def admin():
# 检查用户是否为管理员,如果不是则重定向到登录页面
if not is_admin():
return redirect(url_for('login'))
# 如果是管理员,返回管理员页面内容
return '管理员页面'
# 定义登录页面路由,支持GET和POST两种请求方法
@app.route('/login', methods=['GET', 'POST'])
def login():
# 如果是POST请求,处理登录表单提交
if request.method == 'POST':
# 从表单中获取用户输入的用户名和密码
username = request.form['username']
password = request.form['password']
# 验证用户名和密码是否正确(这里使用硬编码的admin/admin123)
if username == 'admin' and password == 'admin123':
# 登录成功,将用户名存储到会话中
session['username'] = username
# 重定向到管理员页面
return redirect(url_for('admin'))
# 登录失败,返回错误信息
return '登录失败,请重试'
# 如果是GET请求,返回登录表单HTML
return '''
<form method="post">
<p>用户名: <input type="text" name="username"></p>
<p>密码: <input type="password" name="password"></p>
<p><input type="submit" value="登录"></p>
</form>
'''
# 定义登出路由,当用户访问/logout路径时调用此函数
@app.route('/logout')
def logout():
# 从会话中删除用户名,清除用户登录状态
session.pop('username', None)
# 重定向到登录页面
return redirect(url_for('login'))
# 判断当前脚本是否作为主程序直接运行(而不是被其他模块导入)
if __name__ == '__main__':
# 启动Flask开发服务器,开始监听HTTP请求,默认端口为5000
app.run()8. REST API 开发 #
使用 Flask 构建 REST API:
# 导入Flask框架和jsonify模块,用于创建Web应用和返回JSON格式数据
from flask import Flask, jsonify
# 创建Flask应用实例,__name__参数表示当前模块的名称
app = Flask(__name__)
# 定义API路由,当用户访问/api/users路径时调用此函数,仅支持GET请求方法
@app.route('/api/users', methods=['GET'])
# 定义get_users视图函数,用于获取用户列表数据
def get_users():
# 创建用户数据列表,包含两个用户的ID和姓名信息
users = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]
# 将用户数据转换为JSON格式并返回,同时设置HTTP状态码为200(成功)
return jsonify(users), 200
# 判断当前脚本是否作为主程序直接运行(而不是被其他模块导入)
if __name__ == '__main__':
# 启动Flask开发服务器,开始监听HTTP请求,默认端口为5000
app.run()