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操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...