Python异步编程|ASGI 与 Django(附源码)

这篇具有很好参考价值的文章主要介绍了Python异步编程|ASGI 与 Django(附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

异步服务网关接口(Asynchronous Server Gateway Interface,ASGI)秉承WSGI统一网关接口原则,在异步服务、框架和应用之间提供一个标准接口,同时兼容WSGI。

01、ASGI

ASGI是根据统一接口的思想重新设计的新标准,你可能会有疑问,为什么不直接升级WSGI而去创造新的标准呢?

WSGI是基于HTTP短连接的网关接口,一次调用请求必须尽快处理完毕并返回结果,这种模式并不适用于长连接,例如HTML 5新标准中的技术SSE(Server-Sent Events)和WebSocket,WSGI及传统阻塞型IO 编程模型并不擅长处理这类请求。就算强行升级WSGI以支持异步IO,可是如果配套的技术(如Apache服务器)没有提供相应的支持也是没有意义的。既然Python异步IO 编程模型已经走在了前面,那就制定一个全新的标准ASGI以最优雅的方式支持并使用最新的技术。

ASGI接口是一个异步函数,它要求传入3个参数,分别为 scope、receive和send,示例代码如下:

async def app(scope, receive, send):
    pass

其中scope是一个字典(dict),包括连接相关的信息,图1所示是一个请求中的scope所包括信息的断点调试截图。

receive是一个异步函数,用于读取前端发来的信息,一条读取到的信息结构如下:

{
    'type':'http.request',
    'body':b"",
    'more_body':False
}

该信息中包括3个字段,分别为类型(type)、内容(body)和是否还有更多内容(more_body),其中通过type 可以用来判断该信息是什么类型,如HTTP 请求、生命周期、WebSocket请求等,body是该信息中包括的数据,此数据采用二进制格式,more_body指明当前数据是否已经发送完毕,如果发送完毕,则more_body的值为False,这样便可以用来分段传输大文件。

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

■ 图1  断点截图

 send也是一个异步函数,用于向前端发送信息,所发送的信息结构与从前端接收的信息结构类似。一个向前端发送简单信息的示例代码如下:

async def app(scope, receive, send):
#向前端发送HTTP协议头,包括了HTTP状态与协议头
    await send({
        'type':'http.response.start',
        'status':200,
        'headers':[
            [b'content-type', b'text/html'],
        ]
  })
#向前端发送数据,如果数据庞大,还可以分段发送
    await send({
        'type':'http.response.body',
        'body':b"Hello World",
        'more_body':False
    })

除了常规数据通信外,ASGI 还规定了生命周期管理接口,可以用于侦听服务器的启动与关闭。在实际开发工作中,这非常有用,可以用来执行初始化工作与收尾工作,生命周期管理的运用代码如下:

async def app(scope, receive, send):
    request_type = scope['type']
    if request_type == 'lifespan':
        while True:
            message = await receive()
            if message['type'] == 'lifespan.startup':
                await send({'type':'lifespan.startup.complete'})
            elif message['type'] == 'lifespan.shutdown':
                await send({'type':'lifespan.shutdown.complete'})
                break

当scpoe['type']的类型是lifespan时,意味着该请求的类型是生命周期,该请求会在服务器启动之初发生,接下来应该实现对生命周期的管理。

通过无限循环不断侦听请求状态的变化,当读到message[t' ype']是lifespan.startup时执行初始化操作,在操作完成后向前端(协议层)发送lifespan.startup.complete信息,协议层可理解为服务器已经启动完成,可以正常接受浏览器请求了。

当读到message['type']是lifespan.shutdown时,意味服务要关闭,可能是由于服务器管理员执行了关闭指令,那么在这里就需要执行收尾工作,例如释放相应资源等。在收尾完成后向协议层发送lifespan.shutdown.complete信息,表明此时协议层可以放心地关闭服务器。

一个完整的基于ASGI的 Hello World 示例代码如下:

async def app(scope, receive, send):
    request_type = scope['type']
    if request_type == 'http':
        await send({
            'type':'http.response.start',
            'status':200,
            'headers':[
                [b'content-type', b'text/html'],
            ]
        })
        await send({
            'type':'http.response.body',
            'body':b"Hello World",
            'more_body':False
        })
    elif request_type == 'lifespan':
        while True:
            message = await receive()
            if message['type'] == 'lifespan.startup':
                await send({'type':'lifespan.startup.complete'})
            elif message['type'] == 'lifespan.shutdown':
                await send({'type':'lifespan.shutdown.complete'})
                break
    else:
        raise NotImplementedError()

02、Uvicorn

Uvicorn是ASGI的一个协议层实现,一个轻量级的ASGI服务器,基于uvloop 和httptools实现,运行速度极快。

uvloop是一个高效的基于异步IO 的事件循环框架,底层实现由libuv承载。libuv是一个使用C语言开发的支持高并发的异步IO 库,由Node.js的作者开发,作为Node.js的底层IO 库实现,如今已经发展得相当成熟稳定。

要使用Uvicorn需要先通过命令pip install uvicorn安装该依赖项,项目结构如图2所示。

接下来在终端输入uvicorn asgi:app以启动该服务器,效果如图3所示

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

■ 图2  ASGI项目文件结构

 文章来源地址https://www.toymoban.com/news/detail-622060.html

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

 ■ 图3  启动ASGI服务器

服务器启动后,可使用浏览器通过http://127.0.0.1:8000访问该站点,结果如图4所示。

为了向用户提供更加安全的服务,现代网站都需要支持HTTPS,Uvicorn 也提供了对HTTPS的支持,使用起来也相当方便。

首先准备好HTTPS证书文件,如图5所示。

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

■图4  页面访问结果

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

 ■ 图5 证书文件所在目录

接下来通过命令uvicorn--ssl-certfile ./ssl/cert.pem--ssl-keyfile ./ssl/cert.key asgi:app来启动该服务器,如图6所示。

Python异步编程|ASGI 与 Django(附源码),Python,django,服务器,python,原力计划

■ 图6  以HTTPS方式启动服务器

容器化对应的 Dockerfile 文件内容如下:

FROM python:3-slim

RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uvicorn

容器化对应的docker-compose.yml内容如下:

services:
  web:
    build:.
    restart:always
    tty:true
    ports:
      - "8000:8000"
    volumes:
      - ".:/opt/"
    working_dir:"/opt/"
    command:uvicorn --host 0.0.0.0 asgi:app

 03、源码

 

到了这里,关于Python异步编程|ASGI 与 Django(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django进行docker服务器部署

    Django是一个广泛使用的Python Web框架,而Docker是一个增强应用程序部署的流行容器平台。结合这两个技术,可以轻松地部署和维护Django应用程序。在本文中,我们将探讨如何使用Docker在服务器上部署Django应用程序。 1、安装Docker和Docker Compose 在开始之前,需要先安装Docker和Doc

    2024年02月13日
    浏览(51)
  • django部署到centos服务器上

    步骤一 更新系统和安装依赖, 步骤二:创建并激活虚拟环境 在终端中执行以下命令: 可以不创建虚拟环境, 步骤三:安装Django和其他必需的库 在虚拟环境中执行以下命令: 步骤四:克隆项目源代码 使用git命令克隆Django项目源代码到合适的目录: 其实如果是本地的项目,

    2024年02月12日
    浏览(39)
  • 阿里云服务器搭建django+区块链

    djago搭建参考:https://www.bilibili.com/read/cv10030536/ 成功搭建后加入区块链部分,其中遇到的问题: 1.区块链相关代码: tip:注意路径和要引入的包 2.证书拷贝问题 说是证书配置问题,按照fisco bcos的教程把fisco下的证书文件重新复制的sdk的bin目录下,把bin目录里面的内容删除掉

    2024年01月19日
    浏览(42)
  • 云服务器下如何部署Django项目详细操作步骤

    前期本人完成了“编写你的第一个 Django 应用程序”,有了一个简单的项目代码,在本地window系统自测没问题了,接下来就想办法部署到服务器上,可以通过公网访问我们的Django项目。将开发机器上运行的开发版软件实际安装到服务器上进行长期运行,这是使用 Django 框架进行

    2024年02月09日
    浏览(52)
  • 基于Django的计算机编程技术学习与服务平台

    临近毕业,又到了赶毕设的时候了,本次介绍分享一下自己的毕业设计项目吧。 项目主题:基于Django的计算机技术编程技术学习与服务平台 实现功能: 1.登入:用户的登陆注册 2.Python教程:实现用户的Python技术文章的浏览收藏转发以及评论的功能 3.IT散文:实现用户对散文博

    2024年01月22日
    浏览(42)
  • docker+django+ubuntu服务器 测试质量管理平台部署

      然后setting.py中增加服务器ip地址 0.0.0.0开放所有 其中setting.py注意 DEBUG = False 是False的话js和css的静态文件不会生效 在此注意一下!!!!!!! 2.拉取git的项目代码 构建成镜像 镜像run成容器 其中8888是容器内部的端口号,8886是对外开放的端口号  没有报错说明就是成功了 最后直接访

    2024年02月01日
    浏览(54)
  • springboot和Django哪一个做web服务器框架更好

    目录 一、两者特点 二、各自优势 编程语言 : Spring Boot:使用 Java 编程语言。 Django:使用 Python 编程语言。 生态系统和社区支持 : Spring Boot:具有庞大的 Java 生态系统和强大的社区支持。适用于大型企业应用。 Django:有活跃的 Python 社区,提供丰富的库和扩展。适用于快速

    2024年02月14日
    浏览(48)
  • Ubuntu纯净服务器系统使用Nginx+uwsgi部署django项目

    当前文章依赖最新的ubuntu-22.04.3-live-server-amd64服务器系统,python3-10版本,django为5.0版! 该服务器系统我们可以通过虚拟机来在本地安装,也可以使用云服务器,操作方式方法大同小异! 这里我们以开源项目baykeshop为基础来演示! 开源地址:baykeShop: baykeshop是一款python栈采用

    2024年01月17日
    浏览(48)
  • 将本地Django项目部署到服务器上(Ubuntu20.04)

    最近因为项目的需求开始正在搭建一个个人网站。在本地完成了项目后端的内容后需要部署到服务器上以供用户访问。因为后端使用的是Django框架,就在网上找了很多有关将Django项目部署到网站上的教程。由于本人在网络这块属于小白,原理了解甚少,在一边参照各种教程一

    2024年02月03日
    浏览(52)
  • Windows服务器,通过Nginx部署VUE+Django前后端分离项目

    基本说明 安装 Nginx 部署 VUE 前端 部署 Django 后端 Django admin 静态文件(CSS,JS等)丢失的问题 总结 本文介绍了在 windows 服务器下,通过 Nginx 部署 VUE + Django 前后端分离项目。本项目前端运行在 80 端口,服务器端运行在 8000 端口。因此本项目使用 Django 的 runserver 命令进行部署

    2024年02月05日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包