谁是你项目服务开发最佳的web框架选择:Django or Flask or FastAPI?

在实际的项目开发中或多或少不可避免会遇到web服务开发,在python中目前有三大比较主流的web服务框架:Django、Flask和FastAPI。在我自己以往的项目开发经历中主要使用的是Flask,最近正好有项目需要用到FastAPI框架,就想着整体梳理记录下。

一、Django框架

Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。它提供了一个全功能的框架,包括一个强大的ORM(对象关系映射)、一个全面的安全机制、一个内置的管理员界面以及许多其他功能,这使得它非常适合开发复杂的数据驱动型Web应用。

Django官方项目地址在这里,如下所示:

接近8w的star量,足可见其受欢迎程度。

Django框架是一个高级的Python Web框架,用于快速开发安全、可维护的网站和Web应用。以下是关于Django框架的详细介绍:

1. 起源和背景

  • Django最初由一个在2003年到2005年间负责创建和维护报纸网站的网络团队开发。
  • 在创建了许多网站后,团队开始考虑并重用许多常见的代码和设计模式,最终演变成了一个通用的Web开发框架。
  • Django于2005年7月被开源,并于2008年9月发布了第一个正式版本1.0。

2. 特点和优势

  • 高效快速开发:Django功能强大,包含许多内置功能和工具,可快速开发复杂的Web应用程序。
  • 优秀的安全性:Django能够最大限度地防止常见的Web安全漏洞,如SQL注入、跨站脚本攻击等。
  • 易于维护:Django采用了模块化的设计原则,并通过优秀的命名规范、数据模型和快速模板语言等特性让维护变得非常容易。
  • 可扩展性:Django提供了许多可插拔的组件,如中间件、后端、模板引擎等,支持大型项目的扩展。
  • 社区支持:Django是一个非常活跃的开源项目,拥有大型的社区支持,开发者可以轻松地找到解决问题的帮助。

3. 核心组件

  • 模型(Model):提供了用于处理数据、查询和实现业务逻辑的工具。
  • 模板(Template):负责如何把页面(HTML)展示给用户。
  • 视图(View):负责业务逻辑,并在适当时候调用Model和Template。
  • URL分发器:将URL的页面请求分发给不同的View处理,View再调用相应的Model和Template。

4. 主要功能

  • 强大的ORM(对象关系映射):允许开发人员使用Python代码来操作数据库,无需编写复杂的SQL语句。
  • 自带的管理后台:使开发人员可以轻松地创建、编辑和管理数据库中的数据。
  • URL分发和视图处理:使用URL分发机制将请求映射到相应的视图函数或类。
  • 模板引擎:提供了丰富的模板标签和过滤器,使开发人员能够轻松地生成动态的HTML页面。

5. 应用场景

  • Web应用开发:Django框架可以快速开发功能丰富的网站和Web应用。
  • 内容管理系统(CMS):Django提供了强大的数据库操作和模型管理功能,适合用于构建CMS。
  • 电子商务网站:Django框架提供了完整的用户认证和权限管理功能,适合用于开发电子商务网站。
  • 社交网络网站:Django框架可以轻松地处理用户注册、登录、社交分享等功能。

6. 设计哲学

Django的设计哲学是“不要重复自己”(DRY),即尽量减少代码的冗余和重复。它鼓励开发者使用简洁、明确、可重用的代码来构建Web应用。

7. 优点

功能全面,内置大量常用功能,减少重复开发。
安全性高,内置防护措施。
社区支持丰富,文档完善。

8.缺点:

学习曲线较陡峭,需要熟悉大量概念和工具。
在处理高并发时可能面临性能问题。

9.代码实例

Django框架需要使用django-admin命令创建项目结构,然后定义应用模型、视图和模板。

# 创建Django项目
django-admin startproject demoProject

# 进入项目目录
cd demoProject

# 创建Django应用
python manage.py startapp demoapp

Django的ORM允许开发者以Python类的形式定义数据模型,这些类随后会被转换成数据库表。

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.username

通过运行python manage.py makemigrationspython manage.py migrate,Django会自动创建和管理数据库表。

Django的视图是接收Web请求并返回Web响应的Python函数。Django使用模板来生成动态HTML响应,模板中可以使用Django模板语言来实现复杂的逻辑。

from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    return render(request, 'template.html', {'message': 'This is My Django Project!'})

Django提供了强大的表单功能,支持表单的渲染、数据验证和错误处理。

from django import forms

class UserForm(forms.Form):
    sex= forms.CharField(label='性别')
    username = forms.CharField(label='用户名', max_length=100)
    phone= forms.CharField(label='手机号', max_length=20)
    email = forms.EmailField(label='邮箱')

个人在以往的项目开发中还是比较少使用到这个Django框架的,不过在其他一些项目中也有所接触到,诸如:音乐推荐系统、书籍推荐系统等等,Django感觉比较全面比较适合做一个完整的系统应用,而不单单是作为一个web服务接口开发的模块。

二、Flask框架

Flask是一个用Python编写的轻量级Web应用框架。它被设计为简单易用,核心框架非常小,但可以通过添加多种扩展来增强其功能,使其既适用于构建小型项目,也能够处理复杂的应用程序。Flask的灵活性让开发者能够以最少的代码实现丰富的Web应用功能。

官方项目地址在这里,如下所示:

接近7w的star量,非常强了。

Flask框架是一个使用Python编写的轻量级Web应用框架,它以其简单、灵活、易于扩展和安全性高等特点受到广大开发者的喜爱。以下是关于Flask框架的详细介绍:

1、核心特性

  1. 轻量级:Flask的核心构成比较简单,没有默认使用的数据库和窗体验证工具,开发者可以根据需要自行添加。这种轻量级的设计使得Flask框架更加灵活,易于上手和使用。
  2. 可扩展性:Flask提供了丰富的扩展库,开发者可以根据需求选择合适的扩展来扩展功能。这种设计方式使得Flask框架具有很强的可定制性,能够满足不同项目的需求。
  3. 安全性:Flask框架注重安全性,提供了多种安全措施,如防止跨站脚本攻击(XSS)和SQL注入等。此外,Flask还支持使用各种身份验证和授权机制,如OAuth、JSON Web Tokens等,保障应用的安全性。
  4. 易于上手:Flask的文档齐全,易于理解。同时,Flask社区活跃,有许多优秀的第三方库和资源可供参考和使用。这些因素使得开发者可以快速上手并开发出高效的Web应用。
  5. 支持多环境部署:Flask支持在多种环境下部署应用,如开发环境、测试环境和生产环境。这种灵活性使得开发者可以根据需要选择合适的部署环境,提高开发效率和应用的稳定性。

2、主要功能和用途

  1. 路由系统:Flask提供了一个路由系统,可以将不同的URL路径映射到相应的处理函数上。当用户访问特定的URL时,Flask会调用相应的处理函数,并返回响应。
  2. 模板引擎:Flask内置了一个基于Jinja2的模板引擎,开发者可以使用模板来渲染HTML页面。通过将动态数据传递给模板,并使用模板语言来定义页面的结构和样式,开发者可以轻松地创建和管理Web页面的外观和布局。
  3. URL构建:Flask提供了URL构建功能,允许开发者通过在URL中添加参数来创建动态链接。这使得开发者可以轻松地为Web应用程序创建导航链接和其他交互功能。
  4. 错误处理:Flask支持错误处理机制,允许开发者为特定的HTTP错误定义处理函数。当Web应用程序遇到错误时,Flask会自动调用相应的错误处理函数,并返回适当的响应。
  5. 插件和扩展:Flask支持第三方插件和扩展,这些插件和扩展可以增强Flask的功能。例如,开发者可以使用Flask-SQLAlchemy扩展来管理数据库操作,或使用Flask-Login扩展来添加用户身份验证功能。

3、优点

  • 轻量级,代码量少,灵活性高,适合快速开发小型应用程序。
  • 易于学习和使用,文档清晰简洁。
  • 可扩展性强,支持丰富的扩展库。
  • 社区支持良好,有丰富的资源和支持。

4、缺点

  • 功能相对较少,需要依赖扩展库来实现一些功能。
  • 缺乏一些高级功能,如自带的ORM、表单验证等。
  • 不适合开发大型复杂的应用程序。

5、代码实例

借助于flask框架,可以非常简单的实现自己的web服务模块,如下:

from flask import Flask

app = Flask(__name__)

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

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

基于Jinja2可以实现模板渲染展示,如下:

from flask import render_template

@app.route('/search/<id>')
def user(name):
    return render_template('template.html', id=id)

Flask本身不包括数据库抽象层或ORM,但允许使用Flask-SQLAlchemy等扩展来操作数据库。

from flask_sqlalchemy import SQLAlchemy

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

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    price = db.Column(db.String(10), unique=True, nullable=False)

    def __repr__(self):
        return '<Price %r>' % self.price



import sqlite3

import pytest

from flaskr.db import get_db


def test_get_close_db(app):
    with app.app_context():
        db = get_db()
        assert db is get_db()

    with pytest.raises(sqlite3.ProgrammingError) as e:
        db.execute("SELECT 1")

    assert "closed" in str(e.value)


def test_init_db_command(runner, monkeypatch):
    class Recorder:
        called = False

    def fake_init_db():
        Recorder.called = True

    monkeypatch.setattr("flaskr.db.init_db", fake_init_db)
    result = runner.invoke(args=["init-db"])
    assert "Initialized" in result.output
    assert Recorder.called

官方的项目中也有很多实例感兴趣的话可以参考一下,就我自身而言,使用flask框架的频度是最高的,开发轻量级的接口模块非常的方便实用。

三、FastAPI框架

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.8+ 并基于标准的 Python 类型提示。官方给的是基于python3.8+实现的,但是在我自己实际测试过程中发现python3.6也都是可以正常使用的。
官方介绍的FastAPI框架具备的关键特性:

快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
高效编码:提高功能开发速度约 200% 至 300%。
更少 bug:减少约 40% 的人为(开发者)导致错误。
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
简单:设计的易于使用和学习,阅读文档的时间更短。
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:生产可用级别的代码。还有自动生成的交互式文档。
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

官方文档在这里,如下所示:

FastAPI是一个现代、快速(高性能)的Web框架,特别适用于构建基于Python的API。官方项目地址在这里,如下所示:

超过7w的star量,在趋势上是超过了flask,但是暂时弱于Django的,不过未来有望登顶榜首,据官方介绍,FastAPI是号称可以和Go并肩的高性能框架,现在很多大模型部署中也都有使用到FastAPI框架。

以下是关于FastAPI框架的详细介绍:

1. 框架概述

  • 简介:FastAPI基于Python 3.6+的类型提示,利用Starlette和Pydantic这两个流行的库。它旨在提供最佳的开发体验和生产就绪功能,同时保持其简洁、易读和易于维护的特性。
  • 设计目标:提高开发速度、代码可维护性和生产环境的性能表现。

2. 关键特性

  1. 快速高效:基于Starlette和Pydantic构建,具有高性能和低延迟的特点。支持异步处理请求,利用Python的协程提高并发性能。在路由匹配、请求处理和内存占用等方面均表现出卓越的性能。
  2. 简单易用:使用标准的Python类型注解来定义API的输入和输出参数,无需编写大量的文档和验证代码。同时提供了自动生成的交互式API文档,使得开发者可以更加高效地构建和部署API服务。
  3. 数据验证:利用Pydantic提供的数据验证功能,可以自动验证请求数据的格式和类型,并进行数据转换。
  4. 依赖注入:支持依赖注入,可以方便地将依赖项注入到处理函数中,例如数据库连接、配置等。
  5. 类型检查:利用Python类型提示和Pydantic的数据模型,可以在开发过程中进行类型检查,减少错误和调试时间。
  6. 中间件支持:支持使用中间件扩展框架的功能,例如认证、日志记录等。
  7. 标准化:支持OpenAPI规范,可以生成符合规范的API文档和客户端代码。

3. 性能对比

  • 相较于Flask和Tornado等其他Python Web框架,FastAPI在路由性能、请求处理性能和内存占用等方面均表现出显著的优势。

4. 优点与特色

  1. 快速开发:提供了简洁、易读的代码结构,使得开发者能够快速构建应用程序。同时,支持自动生成文档,大大提高了开发效率。
  2. 高性能:在路由匹配、请求处理和内存占用等方面均表现出卓越的性能,能够满足各种规模的应用程序需求。
  3. 异步支持:支持异步编程,使得应用程序能够更好地利用系统资源,提高并发处理能力。
  4. 类型提示:充分利用了Python 3.6+的类型提示功能,提高了代码的可读性和可维护性。同时,类型提示也有助于发现潜在的错误,减少运行时错误的风险。
  5. 易于扩展:设计鼓励模块化开发,使得应用程序易于扩展和维护。此外,FastAPI支持与各种数据库和缓存系统的集成,为开发者提供了丰富的功能。

5. 社区支持

  • FastAPI作为一个新兴的Web框架,得到了广泛的社区支持。随着越来越多的开发者采用FastAPI,社区将不断壮大和完善,为开发者提供更多优质的资源和支持。

6. 使用方式

  • 安装FastAPI通常通过pip进行:pip install fastapi。同时,需要一个ASGI服务器来运行FastAPI应用,如Uvicorn或Hypercorn。
# 使用pip安装
$ pip install fastapi
pip install "uvicorn[standard]"   

7. 示例代码

  • 一个简单的FastAPI示例代码如下:

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

如果需要异步的话可以这样写:

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

下面是put方法:

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

在以往项目中还未使用过FastAPI框架,今天简单来使用了一下发现,这个框架最直观的体验就是文档的展现,不需要人工取编写或者是维护,自动生成类似Swagger风格的文档,实例如下:

docs:

redoc:

这一点上我觉得还是比较nice的。

另外一点是框架的速度还是比较ok的,相较于经常使用到的flask框架来说,速度更快一些。

感兴趣的话也都可以尝试下,根据自己的实际需求或者是喜好选择合适的web框架来构建自己的个性化应用。

  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值