我有一个项目,在其中使用渠道,并且在本地一切正常,但是当我在Heroku上部署时,每次尝试连接时我得到403。最初,我以为问题是Heroku,因为我在本地进行了测试,甚至在本地使用了Heroku的数据库和Redis实例,并且一切正常。
但是,当我使用ngrok打开到本地主机的公共隧道时,我发现结果与Heroku中的结果相同。对于每个请求,我得到403并尝试对其进行调试没有太大帮助,因为事件循环有时会突然获得控制权,或者会出现超时错误。设置完全相同,只是其中一个正在本地访问,而另一个正在远程访问。
这就是我开始达芙妮的方式:
daphne weout.asgi:application --port 8000 --bind 0.0.0.0 -v 3
。
我的lib版本:
- Django == 2.0.7
- channels == 2.2.0
- channels-redis == 2.4.0
- daphne == 2.3.0
在Daphne的通用性设置为最大的情况下,这是我尝试连接时得到的:
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,489 [asyncio] DEBUG: poll 101.195 ms took 0.023 ms: 1 events
Nov 22 07:16:34 weout-staging app/web.1 10.12.43.130:10299 - - [22/Nov/2019:15:16:33] "WSCONNECTING /api/v1/ws/" - -
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,513 [daphne.http_protocol] DEBUG: Upgraded connection ['10.x.x.x',10299] to WebSocket
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,648 [asyncio] WARNING: Executing <Task pending coro=<AsyncConsumer.__call__() running at /app/.heroku/python/lib/python3.6/site-packages/channels/consumer.py:59> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7fe01e6979d8>()] created at /app/.heroku/python/lib/python3.6/asyncio/base_events.py:276> created at /app/.heroku/python/lib/python3.6/site-packages/daphne/server.py:209> took 0.131 seconds
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,655 [daphne.server] INFO: failing WebSocket opening handshake ('access denied')
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,656 [daphne.server] WARNING: dropping connection to peer tcp4:10.12.43.130:10299 with abort=False: access denied
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,656 [daphne.ws_protocol] DEBUG: WebSocket ['10.x.x.x',10299] rejected by application
Nov 22 07:16:34 weout-staging app/web.1 10.12.43.130:10299 - - [22/Nov/2019:15:16:33] "WSREJECT /api/v1/ws/" - -
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,660 [aioredis] DEBUG: Parsing Redis URI 'redis://xxxx@xxxxx'
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,660 [aioredis] DEBUG: Creating tcp connection to ('xxx.compute.amazonaws.com',14059)
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,663 [asyncio] DEBUG: Get address info xxx,type=<SocketKind.SOCK_STREAM: 1>
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,667 [asyncio] DEBUG: Getting address info xxx.compute.amazonaws.com:14059,type=<SocketKind.SOCK_STREAM: 1> took 3.777 ms: [(<AddressFamily.AF_INET: 2>,<SocketKind.SOCK_STREAM: 1>,6,'',('x.x.x.x',14059))]
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,669 [daphne.ws_protocol] DEBUG: WebSocket closed for ['10.x.x.x',10299]
Nov 22 07:16:34 weout-staging app/web.1 10.12.43.130:10299 - - [22/Nov/2019:15:16:33] "WSDISCONNECT /api/v1/ws/" - -
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,671 [asyncio] DEBUG: connect <socket.socket fd=16,family=AddressFamily.AF_INET,type=2049,proto=6,laddr=('0.0.0.0',0)> to ('x.x.x.x',14059)
我使用Daphne为我的常规Django视图和websocket使用者提供服务。一切都适用于Django视图,因此仅当连接到使用者时才会出现问题
有人远程访问Dapnhe时是否有类似的问题? 刚开始,我尝试将uvicorn和gunicorn搭配使用,但是它们有bug when the consumer is closed during the initial connection phase,所以我改回了Daphne