Flask 使用教程:从入门到实践的完整指南

2025-01-17 15:13:24

Flask Logo

概述

Flask 是一个轻量级且灵活的 Python Web 框架,旨在帮助开发者快速构建高效、可扩展的 Web 应用程序。它由 Armin Ronacher 创建,并由 Pallets 团队维护。Flask 的设计理念是“微内核”,即核心功能保持简洁,而通过丰富的扩展库来实现复杂的功能需求。这种设计使得 Flask 成为了一个非常受欢迎的选择,适用于从小型项目到大型应用的各种场景。

本文将通过实际案例和代码示例,详细介绍如何使用 Flask 框架进行开发。我们将涵盖从项目初始化到路由定义、模板渲染、数据库连接、表单处理等多个方面,帮助开发者快速掌握 Flask 的核心概念和开发技巧。

安装与项目初始化

1. 安装 Flask

首先,确保你已经安装了 Python 和 pip。然后,通过以下命令安装 Flask:

pip install Flask

2. 创建新项目

创建一个新的 Flask 项目非常简单。首先,创建一个项目目录并进入该目录:

mkdir my-flask-app
cd my-flask-app

在项目目录中创建一个 app.py 文件,编写最简单的 Flask 应用:

from flask import Flask
app = Flask(__name__)

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

if __name__ == '__main__':
    app.run(debug=True)

运行应用程序:

python app.py

访问 http://127.0.0.1:5000/,你应该会看到 "Hello, World!" 的输出。

3. 项目结构

一个典型的 Flask 项目结构如下所示:

my-flask-app/
├── app.py
├── templates/
│   └── index.html
└── static/
    ├── css/
    └── js/
  • app.py:应用程序的入口文件。
  • templates/:存放 HTML 模板文件。
  • static/:存放静态资源文件,如 CSS 和 JavaScript。

路由与视图函数

1. 定义路由

路由用于将 URL 映射到视图函数。在 Flask 中,我们使用装饰器 @app.route() 来定义路由。例如:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Home Page'

@app.route('/about')
def about():
    return 'About Page'

2. 动态路由

Flask 支持动态路由,允许我们在 URL 中传递参数。例如:

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

3. HTTP 方法

默认情况下,路由只响应 GET 请求。我们可以通过指定 HTTP 方法来处理其他类型的请求。例如:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Login POST Request'
    else:
        return 'Login GET Request'

模板渲染

1. 创建模板

Flask 默认使用 Jinja2 模板引擎。我们可以在 templates/ 目录下创建 HTML 文件。例如,创建一个 index.html 文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Flask App</title>
</head>
<body>
    <h1>Welcome to the Flask App</h1>
    <p>{{ message }}</p>
</body>
</html>

2. 渲染模板

在视图函数中,我们可以使用 render_template() 函数来渲染模板,并传递变量给模板。例如:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html', message='Hello, Flask!')

if __name__ == '__main__':
    app.run(debug=True)

数据库连接

1. 安装 SQLAlchemy

SQLAlchemy 是一个流行的 ORM 库,支持多种数据库。首先,安装 SQLAlchemy 和 Flask-SQLAlchemy:

pip install flask-sqlalchemy

2. 配置数据库

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

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

@app.route('/')
def home():
    users = User.query.all()
    return render_template('index.html', users=users)

if __name__ == '__main__':
    app.run(debug=True)

3. 创建数据库

在终端中运行以下命令来创建数据库:

flask shell
>>> from app import db
>>> db.create_all()

表单处理

1. 安装 WTForms

WTForms 是一个用于处理表单验证的库。首先,安装 Flask-WTF:

pip install flask-wtf

2. 创建表单类

创建一个表单类来定义表单字段和验证规则。例如:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, Email

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Sign Up')

3. 渲染表单

在模板中渲染表单:

<!-- templates/register.html -->
<form method="POST" action="">
    {{ form.hidden_tag() }}
    <div>
        {{ form.username.label }}<br>
        {{ form.username(size=32) }}<br>
    </div>
    <div>
        {{ form.email.label }}<br>
        {{ form.email(size=32) }}<br>
    </div>
    <div>
        {{ form.password.label }}<br>
        {{ form.password(size=32) }}<br>
    </div>
    <div>
        {{ form.submit() }}
    </div>
</form>

4. 处理表单提交

在视图函数中处理表单提交:

from flask import Flask, render_template, redirect, url_for, flash
from forms import RegistrationForm

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        flash(f'Account created for {form.username.data}!', 'success')
        return redirect(url_for('home'))
    return render_template('register.html', title='Register', form=form)

扩展库与中间件

1. 安装扩展库

Flask 拥有丰富的扩展库,涵盖了从身份验证到缓存、日志记录等多个方面。常用的扩展库包括:

  • Flask-Login:用于用户会话管理。
  • Flask-Mail:用于发送电子邮件。
  • Flask-Caching:用于缓存数据。
  • Flask-Migrate:用于数据库迁移。

例如,安装 Flask-Login:

pip install flask-login

2. 使用扩展库

app.py 中集成 Flask-Login:

from flask_login import LoginManager, UserMixin, login_user, logout_user, current_user, login_required

login_manager = LoginManager(app)
login_manager.login_view = 'login'

class User(UserMixin, db.Model):
    # ...

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user and user.check_password(form.password.data):
            login_user(user, remember=form.remember.data)
            return redirect(url_for('home'))
        else:
            flash('Login Unsuccessful. Please check email and password', 'danger')
    return render_template('login.html', title='Login', form=form)

@app.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('home'))

@app.route('/account')
@login_required
def account():
    return render_template('account.html', title='Account')

实战案例:构建 RESTful API

1. 创建 API 路由

创建一个 API 模块来处理 RESTful 请求。例如:

from flask import Blueprint, jsonify, request
from models import Post

api = Blueprint('api', __name__)

@api.route('/posts', methods=['GET'])
def get_posts():
    posts = Post.query.all()
    return jsonify([post.to_dict() for post in posts])

@api.route('/posts', methods=['POST'])
def create_post():
    data = request.json
    post = Post(title=data['title'], content=data['content'])
    db.session.add(post)
    db.session.commit()
    return jsonify(post.to_dict()), 201

2. 注册 API 蓝图

app.py 中注册 API 蓝图:

from flask import Flask
from api import api

app = Flask(__name__)
app.register_blueprint(api, url_prefix='/api')

if __name__ == '__main__':
    app.run(debug=True)

结论

通过本文的介绍,我们详细学习了如何使用 Flask 框架构建高效、可扩展的 Python Web 应用程序。从项目初始化到路由定义、模板渲染、数据库连接、表单处理、扩展库集成以及构建 RESTful API,我们掌握了 Flask 的核心概念和开发技巧。希望这篇文章能够帮助你更好地理解 Flask 并应用于实际项目中。

pallets
用于构建网络应用程序的Python微服务框架,简单易用。
Python
BSD-3-Clause
69.0 k