杰瑞科技汇

python web框架 flask

Flask 是一个用 Python 编写的轻量级 Web 应用框架,它被称为“微框架”(Micro-framework),不是因为它的功能少,而是因为它核心简单、高度灵活、可扩展性强,它没有像 Django 那样内置数据库抽象层、表单验证等功能,而是将这些选择权交给开发者,让你可以根据项目需求自由选择最适合的工具。

python web框架 flask-图1
(图片来源网络,侵删)

Flask 的核心思想与特点

核心思想:

  • 简单易用: Flask 的 API 设计非常直观,上手极快。
  • 轻量级: 核心代码库非常小,没有多余的依赖。
  • 高度灵活: “约定优于配置”的理念体现得淋漓尽致,你可以自由选择数据库、ORM、模板引擎等。
  • 扩展性强: 拥有一个活跃的社区,提供了大量的官方和第三方扩展(Extensions),可以轻松添加各种功能,如用户认证、数据库集成、RESTful API 等。

主要特点:

  1. Werkzeug 和 Jinja2: Flask 的基石。
    • Werkzeug: 一个强大的 WSGI 工具库,处理了 HTTP 请求、响应、路由等底层细节,Flask 在其上构建了更友好的 API。
    • Jinja2: 一个现代化的、功能齐全的模板引擎,用于将 Python 逻辑与前端 HTML 分离。
  2. 开发服务器和调试器: 内置的开发服务器非常方便,并且有一个交互式的调试器,在出错时能提供详细的堆栈信息,便于开发。
  3. 单元测试支持: Flask 内置了对单元测试的支持,让编写和维护测试变得容易。
  4. RESTful 请求处理: 轻松构建 RESTful API,@app.route 装饰器可以指定 HTTP 方法(GET, POST, PUT, DELETE 等)。
  5. Cookies 和 Session: 内置了对 Cookies 和基于 Cookies 的 Session 的支持。

快速上手:安装与第一个应用

安装 Flask

你需要安装 Flask,推荐使用虚拟环境来管理项目依赖。

# 创建并激活一个虚拟环境 (推荐)
python -m venv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
# 安装 Flask
pip install Flask

创建第一个 Flask 应用

创建一个名为 app.py 的文件,并写入以下代码:

# 1. 导入 Flask 类
from flask import Flask
# 2. 创建一个 Flask 应用实例
# __name__ 是一个 Python 预定义变量,它表示当前模块的名称。
# Flask 用这个名称来确定应用的根目录,以便之后能找到资源文件。
app = Flask(__name__)
# 3. 定义一个路由和视图函数
# @app.route 是一个装饰器,它告诉 Flask 哪个 URL 应该触发我们的函数。
# '/' 是网站的根路径。
@app.route('/')
def hello_world():
    # 视图函数的返回值就是响应给用户的内容。
    # 默认情况下,这个返回值会被当作 HTML 来处理。
    return '<h1>Hello, Flask World!</h1>'
# 4. 运行应用
# if __name__ == '__main__': 确保这个脚本只有在直接运行时才会启动开发服务器。
if __name__ == '__main__':
    # app.run() 启动 Flask 的开发服务器。
    # debug=True 会在代码修改后自动重载服务器,并开启调试模式。
    app.run(debug=True)

运行应用

在终端中运行 app.py

python app.py

你会看到类似下面的输出:

python web框架 flask-图2
(图片来源网络,侵删)
 * 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: ...

打开你的浏览器,访问 http://127.0.0.1:5000,你就能看到 "Hello, Flask World!" 了。


Flask 的核心概念详解

a. 路由

路由负责将 URL 映射到处理该请求的视图函数上。

# 基本路由
@app.route('/user')
def user():
    return 'This is the user page'
# 动态路由
# <username> 是一个变量部分,它会作为关键字参数传递给视图函数。
@app.route('/user/<username>')
def show_user_profile(username):
    # 显示用户名的个人资料页面
    return f'User: {username}'
# 带有数据类型的动态路由
# <int:post_id> 确保传入的是整数,如果不是会返回 404 错误。
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'
# HTTP 方法
# 默认只响应 GET 请求,可以通过 methods 参数指定其他方法。
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 处理登录逻辑
        return 'Processing Login...'
    else:
        # 显示登录表单
        return 'Show Login Form'

b. 视图函数

视图函数是处理请求并返回响应的 Python 函数,响应可以是简单的字符串、HTML、JSON 数据,或者更复杂的对象。

c. 模板

为了将业务逻辑和表现层分离,Flask 使用 Jinja2 模板引擎。

python web框架 flask-图3
(图片来源网络,侵删)
  1. 创建模板文件夹:在你的项目根目录下创建一个名为 templates 的文件夹。

  2. 创建模板文件:在 templates 文件夹中创建一个 index.html 文件。

    <!-- templates/index.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{ title }}</title>
    </head>
    <body>
        <h1>Hello, {{ name }}!</h1>
        <p>This is a paragraph from a template.</p>
    </body>
    </html>
  3. 在 Flask 中渲染模板:使用 render_template 函数。

    from flask import render_template
    @app.route('/home')
    def home():
        # render_template 会自动在 templates 文件夹中查找文件
        return render_template('index.html', title='Home Page', name='Flask Learner')

    模板中的 用于输出变量值。

d. 静态文件

CSS、JavaScript、图片等静态文件应该存放在一个名为 static 的文件夹中。

/my_flask_app
├── app.py
├── static/
│   ├── css/
│   │   └── style.css
│   └── js/
│       └── main.js
└── templates/
    └── index.html

在 HTML 中引用这些文件:

<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="{{ url_for('static', filename='js/main.js') }}"></script>

url_for('static', filename='...') 是 Flask 提供的函数,用于生成静态文件的 URL。

e. 请求与响应

在 Flask 中,你可以通过全局的 request 对象来访问当前请求的所有信息(如请求头、表单数据、JSON 数据等)。

from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        # request.form 是一个类似字典的对象,包含 POST 请求的表单数据
        if request.form['username'] == 'admin' and request.form['password'] == 'secret':
            return 'Login Successful!'
        else:
            error = 'Invalid Credentials. Please try again.'
    # GET 请求或登录失败时,显示登录表单
    return render_template('login.html', error=error)

Flask 扩展

Flask 的强大之处在于其丰富的扩展生态系统。

  • Flask-SQLAlchemy: 集成了 SQLAlchemy,这是一个强大的 Python SQL 工具包和对象关系映射器。
  • Flask-Login: 处理用户会话管理,包括用户登录、注销、记住我等功能。
  • Flask-WTF: 集成了 WTForms,用于处理 Web 表单的创建、验证和渲染。
  • Flask-Migrate: 基于 Alembic 的数据库迁移工具,用于管理数据库模式的变更。
  • Flask-RESTful: 用于快速构建 RESTful API。
  • Flask-JWT-Extended: 用于处理 JSON Web Tokens (JWT)。

Flask vs. Django:如何选择?

这是一个常见的问题,两者都是优秀的 Python Web 框架,但设计哲学不同。

特性 Flask Django
定位 微框架 全栈框架
核心理念 “约定优于配置”,灵活、轻量 “包含电池”,开箱即用
数据库 无内置,需用扩展(如SQLAlchemy) 内置 ORM 和强大的 Admin 后台
模板引擎 Jinja2 自带的 Django Templates
表单处理 无内置,需用扩展(如WTForms) 内置强大的 Forms 库
用户认证 无内置,需用扩展(如Flask-Login) 内置完整的用户认证系统
适用场景 - 小型项目
- API 服务
- 需要高度定制化的项目
- 初学者学习 Web 开发
- 大型、复杂的项目
- 内容管理系统
- 需要快速开发的项目
- 企业级应用

  • 选择 Flask,如果你:

    • 喜欢自由和控制权。
    • 项目规模不大,或者只需要构建一个 API。
    • 想要清晰地了解 Web 应用的每个部分是如何工作的。
    • 希望只引入项目真正需要的依赖。
  • 选择 Django,如果你:

    • 希望快速启动项目,不想自己配置太多东西。
    • 需要一个功能齐全的后台管理系统。
    • 项目需求复杂,涉及用户、数据库、管理等多种功能。
    • 团队协作,需要一个“官方”的、结构化的项目蓝图。

Flask 是一个功能强大且极其灵活的 Python Web 框架,它的“微”并不意味着功能弱,而是将选择权交给了开发者,对于初学者,它能让你快速理解 Web 应用的基本工作原理;对于经验丰富的开发者,它能让你构建出高度定制、性能卓越的应用,如果你正在寻找一个既能满足简单需求,又能支撑复杂项目的框架,Flask 绝对是一个值得学习的优秀选择。

分享:
扫描分享到社交APP
上一篇
下一篇