Python Flask Web开发教程 – wiki大全

My sincere apologies. I’ve made a mistake in assuming the write_file tool was available based on a previous erroneous invocation. I see now from the tool_code that write_file is not in the registry of available tools.

Given that I cannot write to a file, I will output the article content directly in this response.


Python Flask Web开发教程:从入门到实践

1. Flask 简介

Flask 是一个用 Python 编写的轻量级 Web 应用框架。它被称为“微框架”,因为它不包含 ORM(对象关系映射)或特定的表单验证工具等高级功能。然而,Flask 提供了构建 Web 应用所需的核心功能,并且高度可扩展。这意味着开发者可以根据项目需求自由选择合适的库和工具,从而实现更大的灵活性。

为什么选择 Flask?
* 轻量与灵活: 核心小巧,不强制依赖特定库,方便集成。
* 易学易用: API 简洁明了,文档友好,适合初学者快速上手。
* 高度可扩展: 社区活跃,拥有丰富的扩展,可以轻松添加数据库支持、认证、表单处理等功能。
* 良好的文档: 官方文档非常详细和清晰。

2. 环境搭建

在开始 Flask 开发之前,需要确保您的系统安装了 Python 和 pip(Python 的包管理器)。推荐使用 Python 3。

2.1 创建虚拟环境

为了隔离项目依赖,强烈建议为每个 Flask 项目创建一个独立的虚拟环境。

“`bash

创建虚拟环境 (名为 ‘venv’,也可以是其他名称)

python -m venv venv

激活虚拟环境

Windows

.\venv\Scripts\activate

macOS/Linux

source venv/bin/activate
“`

激活虚拟环境后,您的命令行提示符前会显示 (venv),表明您当前正在虚拟环境中工作。

2.2 安装 Flask

在激活的虚拟环境中,使用 pip 安装 Flask:

bash
pip install Flask

3. 你的第一个 Flask 应用:Hello, World!

现在,我们来创建一个最简单的 Flask 应用。在项目根目录下创建一个名为 app.py 的文件。

“`python

app.py

from flask import Flask

创建 Flask 应用实例

app = Flask(name)

定义一个路由(URL 路径)

@app.route(‘/’)
def hello_world():
return ‘Hello, World!’

当直接运行此脚本时,启动开发服务器

if name == ‘main‘:
app.run(debug=True) # debug=True 会在代码修改后自动重启服务器,并提供调试信息
“`

运行应用:

在命令行中,确保虚拟环境已激活,然后运行:

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

在浏览器中访问 http://127.0.0.1:5000,您将看到 “Hello, World!”。

4. 路由 (Routing)

路由是定义 URL 模式和处理这些 URL 的函数之间映射的方式。

“`python

app.py (在 hello_world 函数后添加)

@app.route(‘/about’)
def about():
return ‘This is the About page.’

@app.route(‘/user/‘)
def show_user_profile(username):
# username 会作为参数传递给函数
return f’User: {username}’

@app.route(‘/post/‘)
def show_post(post_id):
# post_id 会被转换为整数类型
return f’Post ID: {post_id}’
“`

  • @app.route('/'): 将根 URL (/) 映射到 hello_world 函数。
  • @app.route('/about'): 将 /about 映射到 about 函数。
  • @app.route('/user/<username>'): 这是一个带变量的路由。<username> 会捕获 URL 中的一部分作为字符串,并传递给 show_user_profile 函数。
  • @app.route('/post/<int:post_id>'): 同样是带变量的路由,但通过 <int:post_id> 指定 post_id 应该是一个整数。Flask 会自动进行类型转换。

5. 模板 (Templates)

在实际的 Web 应用中,我们通常需要渲染复杂的 HTML 页面,而不是简单地返回字符串。Flask 使用 Jinja2 模板引擎来实现这一点。

5.1 创建模板文件夹

app.py 同级目录下,创建一个名为 templates 的文件夹。Flask 会自动在这个文件夹中查找模板文件。

5.2 创建一个 HTML 模板

templates 文件夹内,创建一个 index.html 文件。

“`html







{{ title }}

欢迎来到 Flask 应用!

{{ content }}

{% if user %}

你好, {{ user.name }}!

{% else %}

请登录。

{% endif %}

    {% for item in items %}

  • {{ item }}
  • {% endfor %}


“`

5.3 在 Flask 应用中使用模板

修改 app.py 以使用 render_template 函数。

“`python

app.py

from flask import Flask, render_template # 导入 render_template

app = Flask(name)

@app.route(‘/’)
def home():
# 传递变量到模板
return render_template(
‘index.html’,
title=’首页’,
content=’这是一个使用 Flask 和 Jinja2 模板渲染的页面。’,
user={‘name’: ‘Guest’},
items=[‘苹果’, ‘香蕉’, ‘橙子’]
)

@app.route(‘/dashboard’)
def dashboard():
return render_template(
‘index.html’,
title=’仪表盘’,
content=’这是仪表盘页面,欢迎回来!’,
user={‘name’: ‘Admin’},
items=[‘用户管理’, ‘订单列表’, ‘系统设置’]
)

… 其他路由 …

if name == ‘main‘:
app.run(debug=True)
“`

现在访问 http://127.0.0.1:5000http://127.0.0.1:5000/dashboard,您将看到渲染后的 HTML 页面,其中 {{ ... }}{% ... %} 部分已经被 Flask 传入的数据替换。

Jinja2 模板语法要点:
* {{ variable }}: 用于输出变量的值。
* {% statement %}: 用于执行控制流语句,如 if/elsefor 循环等。
* {# comment #}: 模板中的注释。

6. 静态文件 (Static Files)

静态文件(如 CSS、JavaScript、图片)通常放在一个名为 static 的文件夹中,与 templates 文件夹一样,Flask 会自动识别它。

6.1 创建静态文件文件夹

在项目根目录下,创建一个名为 static 的文件夹。
static 文件夹内,创建一个 style.css 文件。

“`css
/ static/style.css /
body {
font-family: Arial, sans-serif;
margin: 20px;
background-color: #f4f4f4;
color: #333;
}

h1 {
color: #0056b3;
}

p {
line-height: 1.6;
}
“`

6.2 在模板中链接静态文件

修改 index.html,使用 url_for 函数来正确引用静态文件。

“`html







{{ title }}

欢迎来到 Flask 应用!

{{ content }}

{% if user %}

你好, {{ user.name }}!

{% else %}

请登录。

{% endif %}

    {% for item in items %}

  • {{ item }}
  • {% endfor %}


“`

url_for('static', filename='style.css') 会生成指向 static/style.css 的正确 URL。

7. 处理表单 (Forms)

Web 应用常常需要用户输入数据。Flask 可以很方便地处理 HTML 表单提交的数据。

7.1 创建一个表单模板

templates 文件夹内,创建一个 form.html 文件。

“`html







提交表单

提交你的信息




{% if message %}

{{ message }}

{% endif %}

“`

7.2 在 Flask 应用中处理表单

修改 app.py 以处理 GET 和 POST 请求。

“`python

app.py

from flask import Flask, render_template, request, redirect, url_for # 导入 request, redirect, url_for

app = Flask(name)

… 其他路由 …

@app.route(‘/form’, methods=[‘GET’, ‘POST’])
def handle_form():
if request.method == ‘POST’:
name = request.form[‘name’]
email = request.form[’email’]
# 在这里可以处理数据,例如保存到数据库
print(f’Received form submission: Name={name}, Email={email}’)
return render_template(‘form.html’, message=’表单提交成功!’, name=name, email=email)
return render_template(‘form.html’)

if name == ‘main‘:
app.run(debug=True)
“`

  • methods=['GET', 'POST']: 指定该路由可以处理 GET 和 POST 请求。
  • request.method == 'POST': 检查请求方法是否为 POST。
  • request.form['name']: 获取表单中 name 字段的值。
  • redirect(url_for('some_route')): 重定向到另一个 URL。

现在访问 http://127.0.0.1:5000/form,填写并提交表单,您将在控制台看到输出,并在页面上看到成功消息。

8. 数据库集成(简介)

Flask 本身不包含数据库工具,但可以很容易地与各种数据库(如 SQLite, PostgreSQL, MySQL)以及 ORM(如 SQLAlchemy, Peewee)集成。

使用 Flask-SQLAlchemy (示例):

首先安装:pip install Flask-SQLAlchemy

“`python

app_db.py (这是一个单独的例子,不与之前的 app.py 混淆)

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(name)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///site.db’ # 使用 SQLite 数据库
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)
email = db.Column(db.String(120), unique=True, nullable=False)

def __repr__(self):
    return '<User %r>' % self.username

在应用上下文中创建数据库表

with app.app_context():
db.create_all()

@app.route(‘/add_user//‘)
def add_user(username, email):
new_user = User(username=username, email=email)
db.session.add(new_user)
db.session.commit()
return f’User {username} added!’

@app.route(‘/users’)
def list_users():
users = User.query.all()
user_list = [f'{user.username} ({user.email})’ for user in users]
return ‘
‘.join(user_list)

if name == ‘main‘:
app.run(debug=True)
“`

运行 app_db.py,然后访问 /add_user/testuser/[email protected]/users 即可看到效果。

9. 部署 (Deployment)

Flask 应用在开发环境中使用内置的开发服务器 (app.run())。但在生产环境中,您需要一个更强大、更安全的 WSGI 服务器,例如 Gunicorn (Linux/macOS) 或 Waitress (Windows),并结合 Nginx/Apache 等反向代理服务器。

部署流程通常涉及:
1. 安装 Gunicorn/Waitress。
2. 配置您的 WSGI 服务器来运行 Flask 应用。
3. 配置 Nginx/Apache 作为反向代理,处理静态文件,并将动态请求转发给 WSGI 服务器。
4. 使用 Supervisor 或 Systemd 管理进程。

10. 总结与下一步

本教程涵盖了 Flask Web 开发的基础知识:
* Flask 框架的安装与简介
* 创建“Hello, World!”应用
* 定义路由和处理不同 URL
* 使用 Jinja2 模板渲染 HTML
* 管理静态文件(CSS, JS, 图片)
* 处理 HTML 表单提交

接下来您可以学习:
* Flask 扩展: 探索 Flask-Login (用户认证), Flask-WTF (表单处理), Flask-Migrate (数据库迁移) 等。
* 蓝图 (Blueprints): 组织大型应用的代码结构。
* 会话 (Sessions): 在请求之间存储用户特定信息。
* 消息闪现 (Flashing Messages): 向用户显示一次性消息。
* 错误处理: 自定义 404, 500 错误页面。
* 单元测试: 为您的应用编写测试。

Flask 是一个功能强大且愉快的框架,通过不断学习和实践,您可以用它构建出各种复杂的 Web 应用。祝您编程愉快!

滚动至顶部