Python之Flask开发框架(第一篇) — 从安装到第一个应用

本文聚焦于 Flask 的基础入门,涵盖安装、第一个应用、基本概念、项目结构、路由与视图函数。

引言

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它被设计为"微型"框架,但并不意味着它功能薄弱;相反,Flask 提供了构建 Web 应用所需的核心组件,同时保持了极高的灵活性和可扩展性。对于初学者来说,Flask 的学习曲线平缓,能让你快速理解 Web 开发的核心概念;对于高级开发者,Flask 又能通过丰富的扩展支持复杂应用的开发。

本教程将带你从零开始,完成 Flask 的安装,创建第一个 Flask 应用,并深入解析 Flask 的基本概念、项目结构、路由与视图函数。


1. Flask 安装

在开始之前,请确保你的电脑上已经安装了 Python 3.8 或更高版本。推荐使用虚拟环境来隔离项目依赖。

1.1 创建虚拟环境

bash 复制代码
# 在项目目录下执行
python -m venv venv

1.2 激活虚拟环境

  • Windows :

    bash 复制代码
    venv\Scripts\activate
  • macOS / Linux :

    bash 复制代码
    source venv/bin/activate

1.3 安装 Flask

bash 复制代码
pip install flask

安装完成后,可以通过以下命令验证是否成功:

bash 复制代码
python -c "import flask; print(flask.__version__)"

如果正确输出版本号(如 2.3.x),说明安装成功。


2. Flask 第一个应用

我们来创建一个最简单的 Flask 应用,只需几行代码。

2.1 创建 app.py

python 复制代码
from flask import Flask

# 创建 Flask 实例
app = Flask(__name__)

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

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

2.2 运行应用

bash 复制代码
python app.py

终端会输出类似以下内容:

复制代码
 * Serving Flask app 'app'
 * Debug mode: on
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)

打开浏览器访问 http://127.0.0.1:5000,你将看到 Hello, World!

2.3 代码解析

  • Flask(__name__):创建一个 Flask 应用实例。__name__ 是当前模块的名称,Flask 用它来定位模板和静态文件的位置。
  • @app.route('/'):这是一个装饰器 ,用于将 URL 路径 / 与下面的函数绑定。当用户访问根路径时,Flask 会调用该函数。
  • return 'Hello, World!':视图函数返回的字符串将作为 HTTP 响应体发送给客户端。
  • app.run(debug=True):启动内置的开发服务器。debug=True 开启调试模式,代码修改后服务器会自动重启,并在出错时显示详细的错误页面。

3. Flask 基本概念

在深入开发之前,我们需要理解 Flask 中的几个核心概念。

3.1 应用(Application)

Flask 应用是 Flask 类的一个实例。它负责接收 HTTP 请求,根据路由规则分发到对应的视图函数,并将响应返回给客户端。

3.2 路由(Route)

路由是将 URL 映射到 Python 函数的机制。Flask 使用 @app.route 装饰器来定义路由。路由不仅可以匹配静态路径,还可以包含动态部分。

python 复制代码
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'

3.3 视图函数(View Function)

视图函数是处理请求并返回响应的函数。它可以是普通的 Python 函数,其返回值会自动转换为 HTTP 响应对象。

3.4 请求(Request)

当客户端发送请求时,Flask 会创建一个 request 对象,其中包含了请求的所有信息(如请求头、表单数据、查询参数等)。通过 from flask import request 导入后即可在视图函数中使用。

3.5 响应(Response)

视图函数的返回值可以是字符串、字典、元组或 Response 对象。Flask 会自动将其转换为一个标准的 HTTP 响应。

python 复制代码
# 返回字符串
return 'Hello'

# 返回状态码
return 'Not Found', 404

# 返回字典(自动转为 JSON)
return {'key': 'value'}

4. Flask 项目结构

随着项目规模增长,良好的项目结构至关重要。这里介绍一种常见的 Flask 项目布局,即使是一个简单应用,也建议遵循这种结构,以便将来扩展。

复制代码
my_flask_project/
├── app/
│   ├── __init__.py      # 应用工厂
│   ├── routes.py        # 路由与视图
│   ├── models.py        # 数据模型
│   ├── forms.py         # 表单类
│   ├── templates/       # 模板文件
│   └── static/          # 静态文件(CSS, JS, 图片)
├── config.py            # 配置文件
├── run.py               # 启动入口
└── requirements.txt     # 依赖列表

4.1 使用应用工厂

app/__init__.py 中定义一个函数,用于创建应用实例。这样做可以方便地加载不同配置、进行测试。

python 复制代码
from flask import Flask

def create_app(config_class=None):
    app = Flask(__name__)
    
    if config_class:
        app.config.from_object(config_class)
    
    # 注册路由
    from app import routes
    routes.init_app(app)
    
    return app

4.2 分离路由

将路由定义放在 routes.py 中,并通过 init_app 函数注册到应用上。

python 复制代码
# app/routes.py
def init_app(app):
    @app.route('/')
    def index():
        return 'Hello from structured app!'

4.3 启动文件

run.py 作为项目启动入口:

python 复制代码
from app import create_app

app = create_app()

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

5. Flask 路由详解

路由是 Web 应用的入口。Flask 的路由系统灵活而强大。

5.1 基本路由

python 复制代码
@app.route('/')
def index():
    return 'Home'

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

5.2 动态路由

在 URL 中使用 <variable> 来捕获路径中的值。默认类型为 string

python 复制代码
@app.route('/user/<username>')
def profile(username):
    return f'Hello, {username}'

Flask 支持多种转换器:

转换器 说明
string 默认,匹配除 / 外的任意字符串
int 匹配整数
float 匹配浮点数
path 匹配包含 / 的字符串
uuid 匹配 UUID 字符串
python 复制代码
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'

5.3 HTTP 方法

路由默认只响应 GET 请求。可以通过 methods 参数指定支持的 HTTP 方法。

python 复制代码
from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return '处理登录'
    else:
        return '显示登录表单'

5.4 路由构建(URL 反向生成)

使用 url_for 函数可以根据视图函数名生成 URL,避免硬编码。

python 复制代码
from flask import url_for

@app.route('/')
def index():
    login_url = url_for('login')  # 结果为 '/login'
    return f'Login at {login_url}'

对于动态路由:

python 复制代码
url_for('profile', username='alice')  # 结果为 '/user/alice'

6. Flask 视图函数深入

视图函数是应用的核心逻辑所在,理解其返回值与请求处理机制十分重要。

6.1 返回 JSON 数据

在构建 API 时,常需要返回 JSON。Flask 提供了 jsonify 函数,它能自动设置正确的 Content-Type 并返回 JSON。

python 复制代码
from flask import jsonify

@app.route('/api/user')
def api_user():
    return jsonify({'name': 'Alice', 'age': 30})

6.2 重定向

使用 redirect 函数可以重定向到其他 URL。

python 复制代码
from flask import redirect, url_for

@app.route('/old')
def old_page():
    return redirect(url_for('new_page'))

6.3 中止请求

使用 abort 函数可以提前终止请求并返回指定的 HTTP 错误码。

python 复制代码
from flask import abort

@app.route('/secret')
def secret():
    if not user_authorized():
        abort(403)  # 返回 403 Forbidden
    return 'Secret content'

6.4 请求对象

request 对象包含了当前请求的所有信息。常用属性:

python 复制代码
from flask import request

@app.route('/submit', methods=['POST'])
def submit():
    # 获取表单数据
    name = request.form.get('name')
    
    # 获取查询参数(GET 参数)
    page = request.args.get('page', default=1, type=int)
    
    # 获取 JSON 数据
    data = request.get_json()
    
    # 获取请求头
    user_agent = request.headers.get('User-Agent')
    
    return 'OK'

6.5 会话(Session)

Flask 提供了会话功能,用于在多次请求之间保存用户数据。会话数据默认存储在客户端的加密 cookie 中。

python 复制代码
from flask import session

app.secret_key = 'your-secret-key'  # 必须设置,用于签名

@app.route('/set')
def set_session():
    session['user'] = 'alice'
    return 'Session set'

@app.route('/get')
def get_session():
    user = session.get('user', 'Guest')
    return f'User: {user}'

总结

本篇教程我们完成了以下内容:

  1. 安装 Flask :使用虚拟环境隔离项目,并通过 pip 安装。
  2. 第一个应用:创建了最简单的"Hello, World!"应用,并解析了各部分的含义。
  3. 基本概念:介绍了应用、路由、视图函数、请求与响应的核心概念。
  4. 项目结构:讲解了如何组织 Flask 项目,并介绍了应用工厂模式。
  5. 路由详解 :包括基本路由、动态路由、HTTP 方法、url_for 反向生成。
  6. 视图函数深入:涵盖了返回 JSON、重定向、请求对象、会话等常用操作。

这些知识构成了 Flask 开发的基础,下一篇教程中,我们将深入探讨 模板渲染表单处理数据库操作,带你构建功能更完整的 Web 应用。

相关推荐
卷毛的技术笔记4 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥4 小时前
匿名函数 lambda + 高阶函数
java·python·算法
isyangli_blog4 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008114 小时前
FastAPI APIRouter
开发语言·python
Benszen4 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆4 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木4 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r4 小时前
Java调用链MCP分析工具
java·python·ai编程
杨充5 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~5 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言