“`markdown
Flask 核心概念与实战教程
Flask 是一个用 Python 编写的轻量级 Web 应用框架。它被称为“微框架”,因为它不包含 ORM、表单验证或处理其他 Web 开发任务的特定工具。相反,Flask 提供了核心功能,使得开发者可以灵活地选择自己喜欢的工具和库来构建应用。这使得 Flask 非常适合小型项目、API 开发以及作为学习 Web 开发的入门框架。
Flask 核心概念
1. 路由 (Routing)
路由是 Flask 应用的核心。它负责将 URL 请求映射到 Python 函数。当用户访问一个特定的 URL 时,Flask 会根据定义的路由规则,执行相应的函数,并返回结果。
@app.route() 装饰器
Flask 使用 @app.route() 装饰器来定义路由。
“`python
from flask import Flask
app = Flask(name)
@app.route(‘/’)
def hello_world():
return ‘Hello, World!’
@app.route(‘/about’)
def about():
return ‘这是关于页面。’
“`
变量规则 (Variable Rules)
路由规则可以包含变量部分,这些变量会作为参数传递给视图函数。
“`python
@app.route(‘/user/
def show_user_profile(username):
# show the user profile for that user
return f’User {username}’
@app.route(‘/post/
def show_post(post_id):
# show the post with the given id, the id is an integer
return f’Post {post_id}’
“`
<converter:variable_name> 语法允许你指定变量的类型(如 string (默认), int, float, path, uuid)。
2. 模板 (Templates – Jinja2)
Flask 使用 Jinja2 作为默认的模板引擎。模板允许你将 HTML 结构与 Python 代码分离,使页面渲染更加整洁和易于维护。
通常,模板文件存放在应用根目录下的 templates 文件夹中。
“`python
app.py
from flask import render_template
@app.route(‘/hello/’)
@app.route(‘/hello/
def hello(name=None):
return render_template(‘hello.html’, name=name)
“`
“`html
{% if name %}
Hello {{ name }}!
{% else %}
Hello, World!
{% endif %}
“`
Jinja2 模板的语法:
* {{ variable }}: 用于输出变量的值。
* {% control_structure %}: 用于控制结构,如 if/else、for 循环等。
* {# comment #}: 用于模板中的注释。
3. 请求和响应对象 (Request and Response Objects)
请求对象 (Request Object)
当一个请求到达服务器时,Flask 会自动创建一个 request 对象,它包含了所有关于当前请求的信息,如表单数据、查询参数、请求方法等。你可以从 flask 模块中导入它。
“`python
from flask import request
@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
username = request.form[‘username’]
password = request.form[‘password’]
return f’Username: {username}, Password: {password}’
return ”’
”’
“`
常用的 request 属性:
* request.method: 请求方法 (GET, POST 等)。
* request.args: URL 中的查询参数 (GET 请求)。
* request.form: 表单数据 (POST 请求)。
* request.json: JSON 数据 (如果请求体是 JSON)。
* request.files: 上传的文件。
* request.headers: 请求头。
响应对象 (Response Object)
视图函数返回的值会被 Flask 转换为一个响应对象。通常,你可以直接返回字符串、元组或 render_template 的结果。Flask 会自动处理这些返回值。
你也可以手动创建 Response 对象,以便更精细地控制响应,例如设置状态码、添加响应头等。
“`python
from flask import make_response
@app.route(‘/my-response’)
def my_response():
response = make_response(‘
This document carries a custom header!
‘)
response.headers[‘X-Something’] = ‘A value’
return response
“`
4. 蓝图 (Blueprints – 进阶概念)
对于大型应用,将所有视图函数都放在一个文件中会使代码难以管理。蓝图提供了一种模块化的方式来组织应用。它允许你将相关的视图、模板和静态文件分组到可重用的组件中。
“`python
myapp/auth.py (Blueprint for authentication)
from flask import Blueprint
auth_bp = Blueprint(‘auth’, name, url_prefix=’/auth’)
@auth_bp.route(‘/login’)
def login():
return ‘Login Page’
myapp/init.py (Main application file)
from flask import Flask
from .auth import auth_bp # Import blueprint
app = Flask(name)
app.register_blueprint(auth_bp) # Register blueprint
“`
5. 扩展 (Extensions – 进阶概念)
Flask 的一个强大之处在于其丰富的扩展生态系统。有许多社区贡献的扩展可以集成数据库、表单处理、用户认证等功能。
例如:Flask-SQLAlchemy (ORM)、Flask-WTF (表单)、Flask-Login (用户认证)。
“`python
from flask_sqlalchemy import SQLAlchemy
app = Flask(name)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///mydatabase.db’
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
“`
Flask 实战教程:构建一个简单的“Hello, Flask!”应用
本教程将引导你创建一个基本的 Flask 应用,包含一个主页和一个显示用户名的页面。
1. 环境准备
首先,确保你安装了 Python。然后,我们创建一个虚拟环境,这是 Python 项目的最佳实践,可以隔离项目依赖。
“`bash
创建虚拟环境
python -m venv venv
激活虚拟环境
Windows
.\venv\Scripts\activate
Linux/macOS
source venv/bin/activate
“`
激活虚拟环境后,安装 Flask:
bash
pip install Flask
2. 创建项目结构
在你的项目目录下,创建一个 app.py 文件和一个 templates 文件夹。
my_flask_app/
├── app.py
└── templates/
└── index.html
└── user.html
3. 编写 app.py
在 app.py 中编写以下代码:
“`python
from flask import Flask, render_template, request, redirect, url_for
创建 Flask 应用实例
app = Flask(name)
定义一个主页路由
@app.route(‘/’)
def index():
# 渲染 templates/index.html 模板
return render_template(‘index.html’)
定义一个带参数的路由,显示用户的名字
@app.route(‘/user/
def user_page(name):
# 渲染 templates/user.html 模板,并传递 name 变量
return render_template(‘user.html’, user_name=name)
定义一个处理表单提交的路由
@app.route(‘/greet’, methods=[‘GET’, ‘POST’])
def greet():
if request.method == ‘POST’:
user_name = request.form.get(‘username’)
if user_name:
# 重定向到 /user/
return redirect(url_for(‘user_page’, name=user_name))
else:
return redirect(url_for(‘index’)) # 如果没有输入名字,返回主页
return redirect(url_for(‘index’)) # GET 请求也返回主页
确保 app.py 可以作为脚本直接运行
if name == ‘main‘:
app.run(debug=True) # debug=True 会在代码修改时自动重载应用,并提供调试信息
“`
4. 编写模板文件
templates/index.html
“`html
欢迎来到 Flask 应用!
这是一个简单的 Flask 示例。
告诉我你的名字:
“`
templates/user.html
“`html
Hello, {{ user_name }}!
欢迎来到你的专属页面!
“`
5. 运行你的 Flask 应用
在终端中,确保你仍然在 my_flask_app 目录下并且虚拟环境已激活。然后运行 app.py:
bash
python app.py
你会在终端看到类似以下输出:
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: XXX-XXX-XXX
6. 访问应用
打开你的浏览器,访问 http://127.0.0.1:5000:
* 你将看到 index.html 页面。
* 在表单中输入你的名字并提交,它会重定向到 http://127.0.0.1:5000/user/你的名字,并显示个性化问候。
* 你也可以直接访问 http://127.0.0.1:5000/user/Gemini,查看 Gemini 用户的页面。
总结
通过这个教程,你已经了解了 Flask 的核心概念,包括路由、模板(Jinja2)、请求/响应对象,并通过一个简单的实战项目构建了一个基础的 Web 应用。Flask 的简洁和灵活性使其成为开发各种规模 Web 应用的强大工具。随着你对 Flask 的深入,你可以探索其蓝图、扩展以及更高级的特性来构建更复杂和功能丰富的应用。
“`