Django 19年历程:廉颇老矣 尚能饭否

298 阅读4分钟

Django 框架发布于 2005 年,至今已经有 19 年的历史。它是一个用 Python 编写的开放源代码的 Web 应用框架,采用了 MVC(Model-View-Controller)的框架模式,也有很多人把它称为 MTV(Model-Template-View)模式。

Django 框架的主要目的是简便、快速地开发数据库驱动的网站。它强调代码复用,多个组件可以很方便地以“插件”形式服务于整个框架,Django 有许多功能强大的第三方插件,你甚至可以很方便地开发出自己的工具包。这使得 Django 具有很强的可扩展性。它还强调快速开发和 DRY(Do Not Repeat Yourself)原则。

然而,历经 19年。Python web开发框架也翻天覆地的变化。先有 pydantic 的横空出世,后有 FASTApi 的横扫宇宙。以下是一些 Python Web 框架中的后起之秀:

FastAPI:它以高性能、简洁的代码风格和强大的类型提示功能而受到广泛关注。能自动生成交互式文档,并且对异步编程有很好的支持。

Sanic:这是一个异步的 Web 框架,在处理高并发方面表现出色,适合构建高性能的 Web 应用。

Starlette:它为构建高性能的 asyncio 应用提供了基础,常被用作其他框架的底层核心。

嘿呀,咱都用了 5 年的 Django 啦,那它还能陪咱再战多少年呢?这可不好说呀,毕竟它的魅力可是杠杠的呢!

Django 为了应对这些危机,社区推出了 DRF 以及 Django-ninja。后者据说已经被官方考虑被收编。

DRF(Django REST Framework) 很多老鸟都熟悉的,是 Django 生态系统中最常用的 API 框架之一,它提供了丰富的功能和强大的序列化器。至于 django-ninja 嘛,那可真是有它的独特之处哟!和 DRF 还有 FASTapi 相比,它就像一个机灵的小精灵。它让代码变得更加简洁明了,就像魔法一样,让开发变得轻松又有趣。它能快速构建 API,还能带来别样的惊喜呢!比如它的简洁语法,让我们写代码的时候就像在玩游戏一样轻松愉快。

Django-ninja 是一个轻量级的 API 框架,它与其他 API 框架相比,有以下一些特点:

  • 与 Django 的集成:Django-ninja 是基于 Django 开发的,可以与 Django 的 ORM(对象关系映射)、Admin 后台等功能无缝集成。这使得开发者可以在使用 Django 的强大功能的同时,享受到 Ninja 的简洁和高效。
  • 类似 FastAPI 的语法:Django-ninja 借鉴了 FastAPI 的语法风格,采用了注解路由和参数校验等特性,使得 API 的定义更加清晰和简洁。同时,它也支持异步编程,提高了 API 的性能。
  • 自动生成文档:Django-ninja 可以自动生成 API 文档,方便开发者查看和测试 API。这对于团队协作和接口文档的维护非常有帮助。
  • 灵活性和可扩展性:虽然 Django-ninja 提供了很多便利的功能,但它仍然保持了 Django 的灵活性和可扩展性。开发者可以根据自己的需求自定义路由、中间件、序列化器等。

CRUD - Create, Retrieve, Update, Delete (增删改查)是持久存储的四项基本功能。以下是 Django-ninja 的 CRUD 例子

from datetime import date
from typing import List
from ninja import NinjaAPI, Schema
from django.shortcuts import get_object_or_404
from employees.models import Employee


api = NinjaAPI()


class EmployeeIn(Schema):
    first_name: str
    last_name: str
    department_id: int = None
    birthdate: date = None


class EmployeeOut(Schema):
    id: int
    first_name: str
    last_name: str
    department_id: int = None
    birthdate: date = None


@api.post("/employees")
def create_employee(request, payload: EmployeeIn):
    employee = Employee.objects.create(**payload.dict())
    return {"id": employee.id}


@api.get("/employees/{employee_id}", response=EmployeeOut)
def get_employee(request, employee_id: int):
    employee = get_object_or_404(Employee, id=employee_id)
    return employee


@api.get("/employees", response=List[EmployeeOut])
def list_employees(request):
    qs = Employee.objects.all()
    return qs


@api.put("/employees/{employee_id}")
def update_employee(request, employee_id: int, payload: EmployeeIn):
    employee = get_object_or_404(Employee, id=employee_id)
    for attr, value in payload.dict().items():
        setattr(employee, attr, value)
    employee.save()
    return {"success": True}


@api.delete("/employees/{employee_id}")
def delete_employee(request, employee_id: int):
    employee = get_object_or_404(Employee, id=employee_id)
    employee.delete()
    return {"success": True}

以及它开箱即用的在线 API 文档,就可以直接扔给前端啦。

image.png

image.png

我觉得有了 Django-nina , 至少还能在战斗 5年。你们觉得呢?

Django-ninja 官方文档