使用daphne部署django channles websocket 项目

2023-12-13 23:08

本文主要是介绍使用daphne部署django channles websocket 项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概述

在上一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14361893.html

开发了一个django channles websocket 项目,用的是asgi。官方推荐使用asgi服务器daphne,来处理websocket请求

daphne

Daphne 是一个纯Python编写的应用于UNIX环境的由Django项目维护的ASGI服务器。它扮演着ASGI参考服务器的角色。

安装 Daphne

你可以通过 pip 来安装 Daphne

python -m pip install daphne

在 Daphne 中运行 Django

一旦 Daphne 安装完毕,你就可以使用 daphne 命令了,它将用来启动 Daphne 服务进程。在最简单的情形下,Daphne 加上包含一个 ASGI 应用模块的位置和应用的名称(以冒号分隔)。

对于一个典型的 Django 项目,可以像下面这样来启动 Daphne

daphne myproject.asgi:application

它将开启一个进程,监听 127.0.0.1:8000。这需要你的项目位于 Python path 上。为了确保这点,你应该在与 manage.py 文件相同的路径中运行这个命令。

如果需要更改运行端口,使用以下命令:

daphne myproject.asgi:application -b 0.0.0.0 -p 8000

说明:

-b 监听地址

-p 监控端口

二、实际项目运行

在上一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/14361893.html

已经开发好了,但是直接使用daphne运行,会遇到以下错误:

比如1:

django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

比如2:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

解决方法

修改asgi.py,增加django.setup()

import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_demo.settings')
django.setup()from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
# Import other Channels classes and consumers here.
from channels.routing import ProtocolTypeRouter, URLRouter
# from apps.websocket_app.urls import websocket_urlpatterns
from websocket_demo.urls import websocket_urlpatterns# application = get_asgi_application()
application = ProtocolTypeRouter({# Explicitly set 'http' key using Django's ASGI application."http": get_asgi_application(),'websocket': AuthMiddlewareStack(URLRouter(websocket_urlpatterns)),
})

注意:django.setup()要置顶,不能在底部,否则使用daphne启动会报上面的错误。

运行项目

注意:要在manage.py同级目录下执行此命令

daphne websocket_demo.asgi:application -b 0.0.0.0 -p 8000

三、nginx+daphne+supervise

官方文档:https://channels.readthedocs.io/en/stable/deploying.html#configuring-the-asgi-application

根据官方文档,推荐使用nginx+daphne+supervise

环境说明

操作系统:centos 7.5

ip地址:192.168.31.165

supervise

yum install -y supervisor

生成配置文件

echo_supervisord_conf > /etc/supervisord.conf 

修改配置文件/etc/supervisord.conf,最后一行增加

[include]
files = supervisord.d/*.ini

表示配置文件读取supervisord.d目录下所有后缀为.ini的文件。

创建配置目录,并创建配置文件

mkdir /etc/supervisord.d/
vi /etc/supervisord.d/asgi.ini

内容如下:

[fcgi-program:asgi]
# TCP socket used by Nginx backend upstream
socket=tcp://localhost:8000# Directory where your site's project files are located
directory=/tmp/internal_tools# Each process needs to have a separate socket file, so we use process_num
# Make sure to update "mysite.asgi" to match your project name
command=/virtualenvs/venv1/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers internal_tools.asgi:application# Number of processes to startup, roughly the number of CPUs you have
numprocs=4# Give each process a unique name so they can be told apart
process_name=asgi%(process_num)d# Automatically start and recover processes
autostart=true
autorestart=true# Choose where you want your log to go
stdout_logfile=/var/log/asgi.log
redirect_stderr=true

注意:红色部分,请根据实际情况修改。

启动supervisord

supervisord -c /etc/supervisord.conf

查看asgi运行状态

# supervisorctl 
asgi:asgi0                       RUNNING   pid 17567, uptime 0:00:04
asgi:asgi1                       RUNNING   pid 17566, uptime 0:00:04
asgi:asgi2                       RUNNING   pid 17569, uptime 0:00:04
asgi:asgi3                       RUNNING   pid 17568, uptime 0:00:04

可以看到,有4个进程。如果状态不是RUNNING,请查看ini配置文件,是否正常。

nginx

nginx安装就很简单了,一条命令解决

yum install -y nginx

修改虚拟配置文件/etc/nginx/conf.d/asgi.conf

upstream channels-backend {server localhost:8000;
}
server {listen 8093;    location / {try_files $uri @proxy_to_app;}location @proxy_to_app {proxy_pass http://channels-backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Host $server_name;}
}

注意红色部分,upstream 是asgi的监听端口。在server里面的8093是对外端口,也可以改成别的,根据实际情况而定。

最后加载nginx配置文件

nginx -s reload

扩展

如果是前后端分离架构,在vue代码中,配置nginx的服务器地址即可,比如:

Vue.prototype.$apihost = "http://192.168.31.165:8093"
Vue.prototype.$websockethost = "ws://192.168.31.165:8093"

注意:daphne不光可以处理asgi,它也可以处理wsgi,没有必要部署uswgi来处理wsgi了。

总之:nginx+daphne+supervise就可以处理django的所有功能了。

本文参考链接:

https://stackoverflow.com/questions/53683806/django-apps-arent-loaded-yet-when-using-asgi

https://docs.djangoproject.com/zh-hans/3.1/howto/deployment/asgi/daphne/

https://blog.csdn.net/qq_41854273/article/details/89332836

https://www.cnblogs.com/chenjw-note/p/12516097.html

这篇关于使用daphne部署django channles websocket 项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/490272

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho