我正在尝试使用 asgi 而不是 wsgi 来运行我的 django 项目。我已经设置了我的 routing.py 和 asgi.py 如下:
路由.py
from django.conf.urls import url
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator,
OriginValidator
from channels.auth import AuthMiddlewareStack
from some.consumers import SomeConsumer
application = ProtocolTypeRouter({
'websocket': AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter(
[
url(r'^some_url/$', SomeConsumer),
]
)
)
)
})
Run Code Online (Sandbox Code Playgroud)
asgi.py
import os
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
application = get_default_application()
Run Code Online (Sandbox Code Playgroud)
现在,正如您所看到的,它是标准设置,并且在默认 django 服务器上运行良好,但是当我尝试与其他一些(daphne 或 uvicorn)一起运行时,它抛出了这个异常。
这是我的 INSTALLED_APPS
INSTALLED_APPS = [
'channels',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django_jenkins', …Run Code Online (Sandbox Code Playgroud) 我已使用 Django 通道(v. 2.1.5)在 Django(v. 2.0)驱动的网站上成功创建了一个 websocket。
一切都很好,但我想知道 CSRF 令牌怎么样。如果是 websocket 的话需要吗?文档说它足以用来OriginValidator防止此类线程,但我想确保这一点。我的意思是,CSRF 代币发生了什么?我是否只是通过安全通道发送数据而没有它,后端会自动检查所有内容?如果是这样那为什么呢?为什么简单的视图不能做到这一点?
我知道这是一个相当悬而未决的问题,但我无法找到任何具体的解释,如果有人有一个我会非常感激。