【问题标题】:WebSocket dosn't work with postman (django channels)WebSocket 不适用于邮递员(django 频道)
【发布时间】:2022-12-15 06:36:50
【问题描述】:

我有一个在我的 mac 上本地运行的 Django 项目。 我使用通道来创建 websocket 连接。

一件有趣的事情发生了: 当我尝试通过 .html 文件连接时,网络套接字工作:

我的模板.html

const ws = new WebSocket(
                'ws://'
                + window.location.host
                +'/ws/test/?token='
                +'**mytoken**'
            );'

我可以发送和接收消息。 但是相同的 URL 在邮递员或 https://websocketking.com/ 中不起作用

首先,我认为这是因为我在本地运行服务器。 但是在真正的服务器上也有同样的问题。

我可以从 html 页面创建聊天,但不可能从“外部”连接。

我搜索了所有 stackoverflow 并实施了所有内容 - 但无济于事。

asgi.py

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'spacetime.settings.dev')
django.setup()


from channels.routing import ProtocolTypeRouter,get_default_application
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from django.urls import path, re_path
from django_channels_jwt_auth_middleware.auth import JWTAuthMiddlewareStack





from myapp import consumers, routing

 
application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': AllowedHostsOriginValidator(
        JWTAuthMiddlewareStack(
            URLRouter(
                routing.websocket_urlpatterns
            )
        )
    ),
})

设置

ASGI_APPLICATION = 'spacetime.asgi.application'
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],
        },
    },
}

INSTALLED_APPS = [
    'daphne',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    ***
]

vscode 控制台

Django version 4.1.2, using settings 'spacetime.settings.dev'
Starting ASGI/Daphne version 4.0.0 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

从 html 文件连接时的 vscode 控制台

HTTP GET /my/socket/view/ 200 [0.01, 127.0.0.1:60258]
WebSocket HANDSHAKING /ws/test/ [127.0.0.1:60260]
WebSocket CONNECT /ws/test/ [127.0.0.1:60260]

https://websocketking.com/ 连接时的 xcode 控制台

WebSocket HANDSHAKING /ws/test/ [127.0.0.1:60759]
WebSocket REJECT /ws/test/ [127.0.0.1:60759]
WebSocket DISCONNECT /ws/test/ [127.0.0.1:60759]

邮差

Request URL: http://127.0.0.1:8000/ws/test/?token=**mytoken**
Request Method: GET
Status Code: 403 Access denied
Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: 0VRmdvoFhma7lndljwIY6w==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: 127.0.0.1:8000
Response Headers

令牌没问题

https://websocketking.com/

Could not connect to "ws://127.0.0.1:8000/ws/test/?token=**mytoken**". You may be able to find more information using Inspector/Dev Tools on this page.

Connecting to ws://127.0.0.1:8000/ws/test/?token=**mytoken**

任何想法为什么它不适用于邮递员?

【问题讨论】:

    标签: django websocket postman django-channels daphne


    【解决方案1】:

    我不知道它是否会有所不同,但请尝试将您的 channel_layers 配置设置为

    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels_redis.core.RedisChannelLayer",
            "CONFIG": {
                "hosts": [("127.0.0.1", 6379)],
            },
        },
    }
    

    【讨论】:

    • 抱歉不行。它不起作用(((
    • 在 allowed_hosts 中是“127.0.0.1”吗?
    • 这个错误代码 403 意味着连接请求没有发送到 daphne 服务器,这在部署我的项目后遇到了这个错误,问题出在 asgin:application 上)
    • 所以如果你不添加 127.0.0.1 到 allowed_hosts 添加它,并且在部署中将你的 asgi:app:websocket 从 AllowedHostsOriginValidator 切换到 OriginValidator 很重要
    • 是的,'127.0.0.1' 在 ALLOWED_HOSTS 中,'localhost' 也......
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2019-08-25
    • 2021-08-21
    • 2022-08-15
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多