【Python Web】一文搞懂 Flask 框架:从入门到实战的完整指南

随着 Python 在 Web 开发领域的流行,Flask 作为一个轻量级的 Web 框架,因其简单、灵活和易于扩展的特点,成为了很多开发者的首选。无论是小型项目、原型开发还是大型应用的构建,Flask 都能提供极大的自由度和便利。在本文中,我们将从入门到实战,全面介绍 Flask 框架的使用,帮助你快速掌握 Flask 并实现一个功能齐全的 Web 应用。

一、Flask 简介

Flask 是一个基于 Python 的轻量级 Web 框架,遵循了 WSGI(Web Server Gateway Interface) 标准。它由 Armin Ronacher 创建,并且被设计为尽可能简单、可扩展和灵活。Flask 不会强制你使用特定的项目结构和组件,而是提供了可选的扩展来满足不同的需求。

Flask 的特点

  • 轻量级:Flask 核心非常小,只有最基础的功能,开发者可以根据需要选择扩展。
  • 灵活性高:Flask 提供了高度的自定义和灵活性,可以根据项目需求轻松调整。
  • 易于上手:Flask 提供简单的 API 和强大的文档支持,非常适合初学者。

二、Flask 安装与环境配置

1. 安装 Flask

首先,你需要安装 Flask,可以通过 pip 命令来安装:

pip install Flask

为了更好地管理你的项目环境,建议使用 虚拟环境 来隔离依赖。

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate

# 安装 Flask
pip install Flask

2. 创建第一个 Flask 应用

创建一个简单的 Flask 应用,展示如何使用 Flask 提供的功能。

文件结构

/my_flask_app
    ├── app.py

在 app.py 文件中编写以下代码:

from flask import Flask

# 创建 Flask 应用
app = Flask(__name__)

# 定义路由和视图函数
@app.route('/')
def hello_world():
    return 'Hello, World!'

# 运行应用
if __name__ == '__main__':
    app.run(debug=True)

代码解析

  • Flask(__name__):创建 Flask 应用实例。
  • @app.route('/'):装饰器,表示访问根路径时调用 hello_world 函数。
  • app.run(debug=True):启动 Flask 应用,debug=True 表示开启调试模式,方便开发时查看错误和修改。

运行 python app.py 后,访问 http://127.0.0.1:5000/ 即可看到输出 “Hello, World!”。

三、Flask 路由和视图函数

在 Flask 中,路由(Route)是 URL 和视图函数之间的映射关系。通过路由和视图函数的结合,Flask 能够处理 HTTP 请求并返回响应。

1. 路由定义

Flask 路由可以指定不同的 HTTP 方法,如 GETPOSTPUT 等。默认情况下,Flask 会将路由绑定到 GET 请求。

@app.route('/home', methods=['GET'])
def home():
    return 'Welcome to the Home Page!'

2. 动态路由

Flask 支持动态路由,你可以在 URL 中定义参数,传递给视图函数。

@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

访问 /user/John 将会显示 “User John”。

3. 请求方法限制

Flask 支持对路由方法进行限制,例如限制只接受 POST 请求。

@app.route('/submit', methods=['POST'])
def submit():
    return 'Form Submitted'

四、Flask 模板引擎 Jinja2

Flask 内置了 Jinja2 模板引擎,允许你将 HTML 页面与 Python 代码进行分离。你可以使用模板继承、条件语句、循环等功能来生成动态网页。

1. 使用模板渲染 HTML

首先创建 templates 文件夹存放 HTML 文件。在 templates 文件夹下,创建 index.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>Welcome to {{ title }}!</h1>
</body>
</html>

然后在 app.py 中渲染该模板:

from flask import render_template

@app.route('/')
def home():
    return render_template('index.html', title='Flask Web App')

在这个例子中,Flask 会将 title 变量传递给模板,并渲染成最终的 HTML。

2. 模板继承

Jinja2 提供了模板继承功能,允许你创建一个基础模板,其他模板可以继承该模板。

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Web App{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Welcome to My Web App</h1>
    </header>
    <main>
        {% block content %}{% endblock %}
    </main>
</body>
</html>

home.html

{% extends "base.html" %}

{% block content %}
    <p>This is the home page content.</p>
{% endblock %}

在 app.py 中渲染 home.html

@app.route('/')
def home():
    return render_template('home.html')

五、Flask 表单处理

Flask 提供了强大的表单处理功能,可以通过表单收集用户输入并进行验证。你可以使用 Flask 扩展 Flask-WTF 来简化表单操作。

1. 安装 Flask-WTF

pip install Flask-WTF

2. 创建表单

在 app.py 中创建一个简单的表单,收集用户的用户名和密码:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])

3. 处理表单数据

from flask import render_template, redirect, url_for
from flask import Flask
from flask_wtf import FlaskForm

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        return redirect(url_for('welcome'))
    return render_template('login.html', form=form)

4. 前端显示表单

在 templates/login.html 中显示表单:

<form method="POST">
    {{ form.hidden_tag() }}
    <div>{{ form.username.label }} {{ form.username() }}</div>
    <div>{{ form.password.label }} {{ form.password() }}</div>
    <button type="submit">Login</button>
</form>

六、Flask 数据库集成

Flask 支持多种数据库,常见的有 SQLiteMySQLPostgreSQL 等。Flask 通过扩展 Flask-SQLAlchemy 提供了 ORM 支持,使得数据库操作变得更加简洁。

1. 安装 Flask-SQLAlchemy

pip install Flask-SQLAlchemy

2. 配置数据库

在 app.py 中配置数据库连接:

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
db = SQLAlchemy(app)

3. 创建模型

定义一个 User 模型类:

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)

4. 使用数据库

添加新用户:

@app.route('/add_user')
def add_user():
    user = User(username='john', email='john@example.com')
    db.session.add(user)
    db.session.commit()
    return 'User added'

七、Flask 项目部署

Flask 项目

可以通过多种方式部署到生产环境中,常见的有 GunicornuWSGI 配合 Nginx,或者使用 Heroku 等云平台。

1. 使用 Gunicorn 部署

pip install gunicorn
gunicorn app:app

2. 配置 Nginx 和 uWSGI

将 Flask 应用与 Nginx 配合使用,可以通过 uWSGI 实现高效的 Web 服务器代理。

八、总结

Flask 是一个非常适合初学者和开发小型 Web 应用的框架。它提供了灵活的路由、模板渲染、表单处理、数据库集成等功能,并且通过扩展可以轻松地添加更多的功能。本文介绍了 Flask 的基本使用,包括从环境配置、路由处理、表单验证、数据库集成等方面的内容,希望能帮助你快速上手 Flask 并开发自己的 Web 应用。

如果你对 Web 开发充满兴趣,Flask 绝对是一个值得学习和深度挖掘的框架。