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 应用。

相关推荐
q5431470872 小时前
Java进阶总结——集合
java·开发语言
啥咕啦呛2 小时前
java打卡学习5:java基础学习
java·开发语言·学习
zhangzeyuaaa2 小时前
Python getter/setter 正确用法详解
开发语言·python
源码之家2 小时前
计算机毕业设计:Python智慧交通大数据分析平台 Flask框架 requests爬虫 出行速度预测 拥堵预测(建议收藏)✅
大数据·hadoop·爬虫·python·数据分析·flask·课程设计
南境十里·墨染春水2 小时前
C++ 笔记 深赋值 浅赋值(面向对象)
开发语言·jvm·c++·笔记
Shaoxi Zhang2 小时前
pm2运行项目实践记录(通过ecosystem.config.js配置并自动运行)
javascript·python·pycharm
华科大胡子2 小时前
开发者的临时文件自动化工具
python
Mr_Xuhhh2 小时前
算法题解合集:回文子串、不相邻取数、空调遥控
python
witAI2 小时前
**AI仿真人剧技术解析2025,专业评估与适配指南**
人工智能·python