天天看点

python web框架大盘点

作者:王观影

大家说起python,首先想到的就是慢,再就是性能差,最后是一把大锁(全局解释器锁)限制了速度,导致又慢性能又差!

首先看看python慢的原因:

  • Python 是解释型语言而不是编译型语言;
  • 是因为 Python 是一种动态类型的语言,边解释边执行;
  • 全局解释器锁(Global Interpreter Lock)(GIL)的原因,导致不能使用多核CPU并发执行;

但是python的优点更多,下边来说说python的亮点:

  • python易于编程,语法简单
  • python开源,每个人都可以构建修改
  • Python 是高级语言

这里所说的高级,是指 Python 封装较深,屏蔽了很多底层细节,比如 Python 会自动管理内存(需要时自动分配,不需要时自动释放)。

  • Python 是解释型语言

解释型语言一般都是跨平台的(可移植性好)

  • Python 是面向对象的编程语言

面向对象(Object Oriented)是大多数“现代”语言(即第三代编程语言)都具备的特性,否则在开发中大型程序时会捉襟见肘。

Python 虽然支持面向对象,但它并不强制你使用这种特性。Java 是典型的面向对象的编程语言,它强制必须以类和对象的形式来组织代码。

  • Python 功能强大(模块众多)

Python 的模块众多,基本实现了所有的常见的功能,从简单的字符串处理,到复杂的 3D 图形绘制,借助 Python 模块都可以轻松完成。

Python 社区发展良好,除了 Python 官方提供的核心模块,很多第三方机构也会参与到模块的开发中,这其中就有 Google(谷歌)、Facebook(脸书)、Microsoft(微软) 等软件巨头。

  • Python 可扩展性强

Python 的可扩展性体现在它的模块,Python 具有脚本语言中最丰富、强大的库或模块,这些库或模块覆盖了文件操作、图形界面编程、网络编程、数据库访问等绝大部分应用场景。

值得注意的是,这些类库的底层代码不一定都是 Python,还有很多 C/C++ 的身影。

比如当需要一段关键代码运行速度更快时,就可以使用 C/C++ 语言实现,然后在 Python 中调用它们。Python 能把其它语言“粘”在一起,所以被称为“胶水语言”。

Python 依靠其良好的扩展性,在一定程度上弥补了运行效率慢的缺点。

  • 用途广泛

Python是一个万能的编程语言,无所不能,可谓法力无边!

Web开发、网络爬虫、人工智能、数据分析、自动化运维、系统编程、图形处理、数学处理、文本处理、数据库编程、网络编程、多媒体应用、游戏开发

  • 最受开发者欢迎,有图为证

以下是TIOBE的统计结果:

python web框架大盘点
python web框架大盘点

今天来盘点一下python有哪些web框架,以及常用的和性能最棒的有哪些;

python的web框架有很多,比较流行的框架有:Django,Flask,Tornado,Sanic, Bottle, web.py, CherryPy, twisted, Wheezy Web, web2py, AIOHTTP, Falcon, Bottle, FastAPI等等。

如此多的web框架,怎么才能选择到合适的呢?

首选想必是Django或flask吧, 再或者是Tornado这三大框架吧!

首先说Django这个老大哥:

Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。

特点:大而全,自带的功能特别特别特别的多,类似于航空母舰;

不足之处:有时候过于笨重

其次说flask这个暂且为二哥的框架:

Flask是一个使用 Python编写的轻量级Web应用框架。其 WSGI工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm Flask-WTForm 来验证表单数据,用 SQLAlchemy Flask-SQLAlchemy 来对你的数据库进行控制。

如此多的介绍,一句话概况特点:短小精悍!

不足之处:比较依赖于第三方的开发者。

接下来再说说三哥Tornado:

Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,因此Tornado 是实时 Web 服务的一个 理想框架。

特点:异步非阻塞,支持高并发,牛逼到甚至可以开发游戏服务器!

不足之处:模板和数据库部分有很多第三方的模块可供选择,这样不利于封装为一个功能模块,这句话是在网上找的,暂且不做评论。

web框架top3介绍完了,再重点说下后起之秀FastAPI。FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.6+ 构建 API。非常高的性能,与 NodeJS 和 Go 相当(感谢 Starlette 和 Pydantic)。可用的最快的 Python 框架之一。减少大约 40% 的人为(开发人员)引发的错误。简短,简单,直观,健壮。

再看看各大web框架的性能比拼:

fastapi排在第三位,排在第一位的是Starlette;而fastapi的框架正是在Starlette的基础上开发而来,站在巨人的肩膀上,当然登高望远!

当然不足之处也挺明显,fastapi比较年轻,社区较小,第三方的教程相对较少。

python web框架大盘点

介绍一下FastAPI的特性:

关键特性:

  • 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。*
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。*
  • 智能:极佳的编辑器支持。处处皆可

自动补全,减少调试时间。

  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

创建一个简单的fastapi项目看看:

from fastapi import FastAPI, Request, Response, HTTPException
from sql_app import models
from sql_app.db import engine, SessionLocal
from app.demo1 import demo1
from app.demo2 import router

def create_app():
    app = FastAPI(title="fast_demo", description="fast api demo", version="1.0.0")

    @app.middleware("http")
    async def db_session_middleware(request: Request, call_next):
        response = Response("Internal server error", status_code=500)
        try:
            request.state.db = SessionLocal()
            response = await call_next(request)
        finally:
            request.state.db.close()
        return response

    # 挂载子路由
    app.include_router(prefix="/api", router=demo1)
    app.include_router(router=router, prefix="/api/v1")
    return app


# uvicorn main:app --reload 启动
app = create_app()

# Dependency
def get_db(request: Request):
    return request.state.db

if __name__ == '__main__':
    import uvicorn
    uvicorn.run("main:app", host="0.0.0.0",  port=8000, reload=True)           

demo1.py

demo1 = APIRouter(tags=["demo1"])

@demo1.get("/")
async def index():
    # return "hello fastapi"
    return {"msg": "hello fastapi"}


@demo1.get("/items/me")
async def read_item_me():
    return {"item": "me"}


@demo1.get("/items/{item_id}")
async def read_item(item_id: str, q: Optional[str] = Query(None, max_length=5), short: bool = False):
    """查询参数和字符串校验"""
    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update({"desc": "This is an amazing item that has a long description"})
    return item           

启动项目

uvicorn main:app --reload

通过交互式 API 文档查看接口:

python web框架大盘点
python web框架大盘点
  • 执行接口
python web框架大盘点