Django ASGI服务
1. ASGI简介
在Django中, ASGI(Asynchronous Server Gateway Interface)的引入使得Django应用能够支持异步编程.
从Django 3.0开始, Django就增加了对ASGI的支持, 但直到Django 3.1才正式推荐在生产环境中使用ASGI.
ASGI是一个用于Python的异步Web服务器的标准接口, 它允许你运行异步的Django应用.
要启动Django的ASGI服务器, 通常需要使用一个支持ASGI的服务器, 如Daphne, Uvicorn或Hypercorn.
以下是使用Uvicorn作为ASGI服务器来启动Django应用的基本步骤:
* 1. 确保Django版本: 首先, 确保Django版本是3.1或更高, 因为这些版本才正式支持ASGI.
* 2. 设置ASGI应用: 在Django项目的settings.py文件中, 确保已经设置了ASGI_APPLICATION变量,它应该指向项目中的asgi.py文件中的application对象.
# settings.py # awsi配置
ASGI_APPLICATION = 'MyDjango.asgi.application'
# 这里的'your_project'是Django项目的名称.
* 3. 检查asgi.py: 在Django项目的根目录下, 有一个asgi.py文件.这个文件是Django自动生成的, 用于配置ASGI应用, 它通常看起来像这样:
# asgi.py
import os
from django.core.asgi import get_asgi_application # 确保这个文件中的DJANGO_SETTINGS_MODULE环境变量正确设置为了项目设置模块.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyDjango.settings') application = get_asgi_application()
* 4. 安装ASGI服务器: 接下来, 需要安装一个ASGI服务器.以Uvicorn为例, 可以通过pip安装它: pip install uvicorn
* 5. 启动ASGI服务器: 最后, 使用Uvicorn(或其他ASGI服务器)来启动你的Django应用.在命令行中, 运行命令: uvicorn MyDajngo.asgi:application --host 0.0.0.0 --port 8000 .这里的'MyDajngo'是的Django项目的名称,--host 0.0.0.0表示服务器将监听所有可用的网络接口, --port 8000指定了服务器将使用的端口号.注意: 在settings.py文件中设置了ASGI_APPLICATION = 'MyDjango.asgi.application', 是可以直接通过快捷按钮启动的.

* 6. 访问应用: 现在, Django应用已经以异步方式在ASGI服务器上运行了.可以在浏览器中访问: http://127.0.0.1:8000 来查看应用.
由于ASGI是异步的, 需要修改视图和其他代码来利用异步编程的优势.
Django的ORM本身并不支持异步操作, 因此如果需要在异步视图中进行数据库操作,
可能需要使用支持异步的数据库客户端库, 如databases或aiopg.此外, 虽然ASGI为Django应用带来了异步编程的可能性, 但它并不是必需的.
如果应用不需要异步特性, 仍然可以像往常一样使用WSGI服务器(如Gunicorn或uWSGI)来运行你的Django应用.
Django的路由系统(URLs)和视图(Views)是以同步方式编写的, 即使使用ASGI来运行Django应用.
然而, 对于需要异步处理的功能, 如WebSocket连接和异步HTTP请求, 使用Django Channels是一个很好的解决方案.
2. Channels简介
Channels是一个允许编写异步消费者(consumers)的框架, 这些消费者可以处理WebSocket连接, 异步HTTP请求等.
Channels建立在ASGI之上, 允许编写真正的异步代码, 而不会阻塞Django的事件循环.
Channels提供了与Django路由系统相似的机制, 但它专注于异步操作.
在Channels中定义路由将不同的协议(如: HTTP, WebSocket)和路径映射到相应的异步消费者上.
以下是如何在Django项目中设置Channels的基本步骤:
* 1. 安装 Channels: pip install channels .
* 2. 修改项目的settings.py.将channels添加到INSTALLED_APPS中.设置ASGI_APPLICATION指向ASGI配置文件.由于Channels的功能依赖于Redis数据库, 因此还需要在settings.py中设置Channels的功能配置.
# settings.py
INSTALLED_APPS = [ ... 'channels',
]# ASGI配置
ASGI_APPLICATION = 'MyDjango.routing.application'# Channels配置
CHANNEL_LAYERS = {'default': {'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': {"hosts": [('127.0.0.1', 6379)], # Redis配置},},
}

* 3. 执行数据迁移, 因为Channels需要使用Django内置的会话Session机制, 用于区分和识别每个用户的身份信息.执行: Python manage.py migrate .

* 4. 在应用中定义Channels路由.在应用目录下创建一个routing.py文件, 并定义WebSocket路由.
# routing.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from index import routingos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyDjango.settings')application = ProtocolTypeRouter({"http": get_asgi_application(),"websocket": AuthMiddlewareStack(URLRouter(routing.websocket_urlpatterns)),
})

* 5. 设置WebSocket URL模式.在路由文件中定义WebSocket的URL模式.
# MyDjango的urls.py
from django.urls import path, include
from .consumers import IndexConsumer# 同步视图
urlpatterns = [path('', include(('index.urls', 'index'), namespace='index'))
]# 异步视图
websocket_urlpatterns = [# 调用as_asgi()启动异步视图path('ws/index/', IndexConsumer.as_asgi()),
]

* 6. 编写消费者.在应用目录下创建一个consumers.py文件, 并编写异步消费者.
# index/consumers.py
from channels.generic.websocket import AsyncWebsocketConsumer
import jsonclass IndexConsumer(AsyncWebsocketConsumer):# 连接async def connect(self):print("一个客户端连接了服务器")await self.accept() # 接受传入套接字# 断开async def disconnect(self, close_code):print("一个客户端断开了连接")pass# 收到, 接收从 WebSocket 发送的消息async def receive(self, text_data=None, bytes_data=None):text_data_json = json.loads(text_data) # 反序列化文本数据message = text_data_json['message'] # 取出聊天信息print(message)# 发送消息到 WebSocketawait self.send(text_data=json.dumps({ # 序列化聊天信息'message': message}))

异步方法的调用机:
* connect()方法: 当WebSocket客户端尝试连接到服务器时, Channels会自动调用connect()方法.可以在这个方法中执行一些初始化操作, 比如验证客户端身份, 设置会话变量等, 并通过调用await self.accept()来接受连接.
* disconnect()方法: 当WebSocket连接关闭时, Channels会自动调用disconnect()方法.可以在这个方法中执行一些清理操作.
* receive()方法: 当WebSocket客户端发送消息到服务器时, Channels会自动调用receive()方法, 并将接收到的消息作为参数传递.需要在这个方法中处理接收到的消息, 并可能通过await self.send()或await self.send_json()等方法向客户端发送响应.
3. WebSocket介绍
在Django Channels中, WebSocket并不是通过传统的HTTP请求来访问的,
因此不能直接通过浏览器地址栏(如输入:http://localhost:8000/ws/my-endpoint/)来访问WebSocket端点.WebSocket是一种在单个TCP连接上进行全双工通讯的协议, 它允许服务器和客户端之间建立持久的连接, 并通过这个连接进行数据的双向传输.
浏览器可以通过JavaScript的WebSocket API来建立与WebSocket服务器的连接.
这个API允许创建一个WebSocket对象, 并指定要连接的URL.
注意, 这个URL应该以: ws://(非加密)或wss://(加密)开头, 而不是 http://或https://.
然后, 可以使用这个对象来发送和接收数据.
以下是一个简单的例子, 展示了如何在浏览器中使用JavaScript来连接WebSocket服务器:
* 1. 编写路由, 后续可以通过: 127.0.0.1:8000 , 触发index视图函数.
# index/urls.pu
from django.urls import path
from .views import *urlpatterns = [# 访问异步视图path('', index, name='index'),
]

* 2. 编写视图函数.在视图函数中放回一个模板页码.

* 3. 编写模板页面.在模块页面中编写js代码, 使用WebSocket API来建立与WebSocket服务器的连接.
<!-- tempaltes的index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>访问异步视图</title>
</head>
<body>
<p>访问: 异步视图...</p>
<script>// 生成一个WebSocket对象var chatSocket = new WebSocket('ws://' + window.location.host + '/ws/index/');// 监听连接打开事件chatSocket.onopen = function (event) {console.log('WebSocket连接成功');// 连接建立后发送消息chatSocket.send(JSON.stringify({'message': '你好!'}));};// 接收信息chatSocket.onmessage = function (e) {try {var data = JSON.parse(e.data);var message = data['message'];alert(message);} catch (error) {console.error('解析消息时出错:', error);}};// 处理连接关闭事件chatSocket.onclose = function (event) {if (event.wasClean) {console.log('WebSocket连接正常关闭');} else {console.error('WebSocket连接异常关闭');}console.log('关闭代码:', event.code, '关闭原因:', event.reason);};// 处理连接错误事件chatSocket.onerror = function (error) {console.error('WebSocket发生错误:', error);};
</script>
</body>
</html>

* 4. 启动项目, 访问: 127.0.0.1:8000 , 执行index视图函数.视图函数返回的页面会执行js代码先访问: ws://127.0.0.0:8000/ws/index/ , 执行异步视图.

结论: 通过Django Channels, 可以编写异步的WebSocket消费者和其他类型的异步协议处理器, 从而充分利用ASGI的优势.
虽然Django的路由系统(URLs)和视图(Views)主要用于同步操作, 但Channels提供了与Django路由相似的机制, 专门用于异步操作.
相关文章:
Django ASGI服务
1. ASGI简介 在Django中, ASGI(Asynchronous Server Gateway Interface)的引入使得Django应用能够支持异步编程. 从Django 3.0开始, Django就增加了对ASGI的支持, 但直到Django 3.1才正式推荐在生产环境中使用ASGI. ASGI是一个用于Python的异步Web服务器的标准接口, 它允许你运…...
Servlet(2)
1、WebServlet 这个注解可以用来修饰一个Servlet类,可以简化配置,替代Web.xml中 的servlet配置 ①value属性 表示指定某个url-pattern ②urlPatterns属性 表示接受多个不同的url-pattern,多个值写在一对{}中,逗号分隔 补充;url-pattern…...
电竞玩家的云端盛宴!四大云电脑平台:ToDesk、顺网云、青椒云、极云普惠云实测大比拼
本文目录 一、云电脑概念及市场需求二、云电竞性能测试2.1 ToDesk云电脑2.2 顺网云2.3 青椒云2.4 极云普惠云电脑 三、四大云电脑平台综合配置对比3.1 CPU处理器3.2 GPU显卡3.3 内存 四、总结 一、云电脑概念及市场需求 在数字化时代的推动下,云计算技术日益成熟&a…...
基础复习(反射、注解、动态代理)
反射 反射,指的是加载类的字节码到内存,并以编程的方法解刨出类中的各个成分(成员变量、方法、构造器等)。 1.获取类的字节码 (3种方式) public class Test1Class{public static void main(String[] arg…...
OGG同步目标端中文乱码处理
现象说明: 源端字符集:AMERICAN_AMERICA.ZHS16GBK 目标端字符集:AMERICAN_AMERICA.AL32UTF8 源端同步过来的数据显示中文乱码。 查询数据库表中含有乱码的字段: select * from xx.xxxx a where to_char(a.crtopetime,yyyy-mm-…...
使用WPF调用Python进行图像灰度处理
1. 前言 在本文中,我们将通过WPF应用程序调用Python脚本进行图像灰度处理。我们将使用Python的OpenCV库来处理图像,并将其转换为灰度图像,然后通过WPF界面来启动Python进程并展示结果。 2. 准备工作 在开始之前,请确保系统已经…...
(二)测试工具
16. 如何进行浏览器兼容性测试? 正确回答通过率:38.0%[ 详情 ] 推荐指数: ★★★★★ 试题难度: 高难 1、兼容性测试含义 兼容性测试是指要测试的软件在不同的硬件平台上、不同的应用软件之间、不同的操作系统中、不同的网络环境中是否可以正常的运行、有无异常的测试过程…...
springboot 博客交流平台-计算机毕业设计源码56406
摘要 博客交流平台 作为一种重要的网络平台,为用户提供了展示自我、分享经验和与他人互动的空间。在国内外,研究者们关注博客交流平台 的各个方面,并取得了显著的进展。研究内容主要包括用户体验和界面设计、社交化和互动性、多媒体内容支持、…...
从0开始搭建vue + flask 旅游景点数据分析系统( 八):美化前端可视化图形
这一期来美化我们仅有的三个可视化图形(可怜),毕竟,帅是一辈子的事。 1 折线图改面积图(渐变色) 需求:折线图改为蓝色的面积图,并且有一点的渐变色。 这个非常简单,只…...
【前端面试】七、算法-迭代器和生成器
目录 1.迭代器 2.生成器 1.迭代器 lterator:也被称作游标Cursor,是一种设计模式。迭代器提供了一种遍历内容的方法(比如 JS 迭代器中的next),而不需要关心内部构造。 // 迭代器的遍历const s new Set([1,2,3,4,5])const it s.values()//…...
vs+qt一些问题
一直遇到的两个问题,今天解决了 1、 因为前后端分离,前端写完了,后端还在一直修改,但是每次都是单独打开的后端的sln,所以会出现这个,把前端的模块删掉就好了。 2、打开vs项目,很多报错&#…...
基于K8S配置Jenkins主从节点实例
基于K8S配置Jenkins主从节点实例 1.配置Jenkins主节点1.确认 Jenkins Pod 名称2.进入 Jenkins Pod:3.生成SSH密钥对4.将公钥复制到目标节点: 2.配置Jenkins的node1节点1.安装java2.配置 Jenkins node1节点的 Java 路径1.添加Java环境变量2.生效Java环境变…...
萱仔环境记录——git的安装流程
最近由于我有一个大模型的offer,由于我只在实验室的电脑上装了git,我准备在自己的笔记本上本地安装一个git,也给我的一个师弟讲解一下git安装和使用的过程,给我的环境安装章节添砖加瓦。 github是基于git的一个仓库托管平台。 g…...
品味食家巷蛋奶酪饼,感受西北美食魅力
在广袤的西北大地,美食的丰富多样令人叹为观止。而食家巷蛋奶酪饼,宛如一颗璀璨的明珠,散发着独特的魅力。 这款蛋奶酪饼,是传统工艺与现代口味的完美融合。而当你继续品尝,鸡蛋的鲜嫩和奶酪的浓郁醇厚便会在口中交融…...
常用的图像增强操作
我们将介绍如何用PIL库实现一些简单的图像增强方法。 [!NOTE] 初始化配置 import numpy as np from PIL import Image, ImageOps, ImageEnhance import warningswarnings.filterwarnings(ignore) IMAGE_SIZE 640[!important] 辅助函数 主要用于控制增强幅度 def int_param…...
探索TinyDB的轻量级魅力:Python中的微型数据库
文章目录 探索TinyDB的轻量级魅力:Python中的微型数据库背景:为何选择TinyDB?什么是TinyDB?如何安装TinyDB?5个简单的库函数使用方法3个场景下的应用实例常见问题与解决方案总结 探索TinyDB的轻量级魅力:Py…...
模型优化学习笔记—Adam算法
首先复习一下: 动量梯度下降: 1、算出dw、db 2、计算指数加权(移动)平均 vdw k *vdw (1-k)*dw vdb k *vdb (1-k)*db 3、梯度下降 w w - r*vdw b b - r*vdb RMSprop: 1、算出dw和db 2、算指数平均值&am…...
车辆出险报告(h5)-车辆出险记录接口-车辆相关接口
接口简介:通过vin及行驶证查询车辆出险、理赔、事故记录接口。查询成功率99%,返回URL地址的查询报告。 不能对返回的报告进行任何的修改,否则由用户自行承担相应的责任 报告结果只保留30天,如需永久保存,请您查询后自行保存 接口地…...
C基础项目(学生成绩管理系统)
目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令 2.开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提…...
C# 设计模式之原型模式
总目录 前言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
