在实际的项目开发中或多或少不可避免会遇到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 makemigrations
和python 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、核心特性
- 轻量级:Flask的核心构成比较简单,没有默认使用的数据库和窗体验证工具,开发者可以根据需要自行添加。这种轻量级的设计使得Flask框架更加灵活,易于上手和使用。
- 可扩展性:Flask提供了丰富的扩展库,开发者可以根据需求选择合适的扩展来扩展功能。这种设计方式使得Flask框架具有很强的可定制性,能够满足不同项目的需求。
- 安全性:Flask框架注重安全性,提供了多种安全措施,如防止跨站脚本攻击(XSS)和SQL注入等。此外,Flask还支持使用各种身份验证和授权机制,如OAuth、JSON Web Tokens等,保障应用的安全性。
- 易于上手:Flask的文档齐全,易于理解。同时,Flask社区活跃,有许多优秀的第三方库和资源可供参考和使用。这些因素使得开发者可以快速上手并开发出高效的Web应用。
- 支持多环境部署:Flask支持在多种环境下部署应用,如开发环境、测试环境和生产环境。这种灵活性使得开发者可以根据需要选择合适的部署环境,提高开发效率和应用的稳定性。
2、主要功能和用途
- 路由系统:Flask提供了一个路由系统,可以将不同的URL路径映射到相应的处理函数上。当用户访问特定的URL时,Flask会调用相应的处理函数,并返回响应。
- 模板引擎:Flask内置了一个基于Jinja2的模板引擎,开发者可以使用模板来渲染HTML页面。通过将动态数据传递给模板,并使用模板语言来定义页面的结构和样式,开发者可以轻松地创建和管理Web页面的外观和布局。
- URL构建:Flask提供了URL构建功能,允许开发者通过在URL中添加参数来创建动态链接。这使得开发者可以轻松地为Web应用程序创建导航链接和其他交互功能。
- 错误处理:Flask支持错误处理机制,允许开发者为特定的HTTP错误定义处理函数。当Web应用程序遇到错误时,Flask会自动调用相应的错误处理函数,并返回适当的响应。
- 插件和扩展: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. 关键特性
- 快速高效:基于Starlette和Pydantic构建,具有高性能和低延迟的特点。支持异步处理请求,利用Python的协程提高并发性能。在路由匹配、请求处理和内存占用等方面均表现出卓越的性能。
- 简单易用:使用标准的Python类型注解来定义API的输入和输出参数,无需编写大量的文档和验证代码。同时提供了自动生成的交互式API文档,使得开发者可以更加高效地构建和部署API服务。
- 数据验证:利用Pydantic提供的数据验证功能,可以自动验证请求数据的格式和类型,并进行数据转换。
- 依赖注入:支持依赖注入,可以方便地将依赖项注入到处理函数中,例如数据库连接、配置等。
- 类型检查:利用Python类型提示和Pydantic的数据模型,可以在开发过程中进行类型检查,减少错误和调试时间。
- 中间件支持:支持使用中间件扩展框架的功能,例如认证、日志记录等。
- 标准化:支持OpenAPI规范,可以生成符合规范的API文档和客户端代码。
3. 性能对比
- 相较于Flask和Tornado等其他Python Web框架,FastAPI在路由性能、请求处理性能和内存占用等方面均表现出显著的优势。
4. 优点与特色
- 快速开发:提供了简洁、易读的代码结构,使得开发者能够快速构建应用程序。同时,支持自动生成文档,大大提高了开发效率。
- 高性能:在路由匹配、请求处理和内存占用等方面均表现出卓越的性能,能够满足各种规模的应用程序需求。
- 异步支持:支持异步编程,使得应用程序能够更好地利用系统资源,提高并发处理能力。
- 类型提示:充分利用了Python 3.6+的类型提示功能,提高了代码的可读性和可维护性。同时,类型提示也有助于发现潜在的错误,减少运行时错误的风险。
- 易于扩展:设计鼓励模块化开发,使得应用程序易于扩展和维护。此外,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框架来构建自己的个性化应用。