问题标签 [daphne]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
933 浏览

django - django-cors-headers 在 i18n 开启时不起作用

我有一个工作环境:

  • django==1.10
  • django-rest-framework==3.5.3
  • djangorestframework-jsonapi==2.1.1
  • channels(最新的)
  • daphne(最新)而不是gunicorn.

我在docker 环境中nginx用作上面的代理服务器。daphne

我正在构建一个angular 2连接到上述后端的单独 SPA,并且我正在使用django-cors-headers==2.0.2它来允许来自该 Web 应用程序的连接。

它适用于:USE_I18N = False

当我设置 Django 的USE_I18N = False. 当尝试对后端进行身份验证时,我发送一个 POST 请求,相当于:

curl -H "Content-Type: application/vnd.api+json" -X POST -d '{"data": {"type": "obtainJSONWebTokens", "attributes": {"email":"admin@email.com", "password":"password"}}}' http://localhost/api/auth/login/ --verbose

卷曲的输出:

我收到了我应该收到的 JWT 令牌。一切正常。

它失败了:USE_I18N = True

但是,相同的连接在USE_I18N = True.

卷曲的输出:

客户端返回的错误是:

XMLHttpRequest cannot load http://localhost/api/auth/login/. Redirect from 'http://localhost/api/auth/login/' to 'http://localhost/en/api/auth/login/' has been blocked by CORS policy: Request requires preflight, which is disallowed to follow cross-origin redirect.

相关设置:

似乎不是客户端请求失败,而是从“ http://localhost/api/auth/login/ ”重定向到“ http://localhost/en/api/auth/login/ ”,Django在其中添加了'en' 到 URL。

有人可以对此有所了解吗?

我搜索了django-cors-headers相关问题,但没有一个是针对这种与 I18N 明显不兼容的问题。该库在没有 I18N 的情况下工作正常,只是没有打开它。

编辑 2017-03-21

鉴于接受的答案中所述的限制,我选择简单地避免 Django 的语言 URL 重定向。在使用USE_I18N = True时,我完全避免i18n_patterns在根 URLconf 中。

事实上,Django Rest Framework 声明这是 API 客户端的最佳实践:

如果您想允许每个请求的语言首选项,您需要将其包含django.middleware.locale.LocaleMiddleware在您的MIDDLEWARE_CLASSES设置中。

您可以在 Django 文档中找到有关如何确定语言首选项的更多信息。供参考,方法是:

  • 首先,它在请求的 URL 中查找语言前缀。
  • 否则,它会LANGUAGE_SESSION_KEY在当前用户的会话中查找密钥。
  • 如果做不到这一点,它会寻找一个 cookie。
  • 如果做不到这一点,它会查看Accept-LanguageHTTP 标头。
  • 否则,它将使用全局LANGUAGE_CODE设置。

对于 API 客户端,最合适的通常是使用Accept-Language标头;除非使用会话身份验证,否则会话和 cookie 将不可用,通常更好的做法是更喜欢Accept-LanguageAPI 客户端的标头而不是使用语言 URL 前缀。

因此,我保持上述设置相同,但在根目录中更改了以下内容URLconf

所以,现在,做:

curl -H "Content-Type: application/vnd.api+json" -H "Accept-Language: pt" -X POST -d '{"data": {"type": "obtainJSONWebTokens", "attributes": {"email":"admin@email.com", "password":"password"}}}' http://localhost:8000/api/auth/login/ --verbose

以请求的语言返回预期的响应(请注意"Accept-Language: pt"上面请求中包含的内容):

0 投票
3 回答
3923 浏览

python - 需要登录 Django Channels 套接字?

我正在尝试 Django 1.10 中的 Channels 并设置了一些消费者。

我尝试为它创建一个 login_required 装饰器,在执行它之前关闭连接,以防止客人进入这个私有套接字。之后还集成了单元测试来对其进行测试,但它们一直失败,因为它一直让客人进来(到处都是匿名用户错误)。

此外,有时登录和注销会话时不会清除,它会让旧用户进入。

装饰师:

这是消费者代码:

奇怪的是,当注释掉 client.send(signal.message)) 转发之间的所有逻辑时,它工作得很好并且单元测试通过(意味着客人被阻止并且身份验证代码不运行 [因此 AnonymousUser 错误])。有任何想法吗?

这里也是测试:

我是否接近这个错误,如果我是,我该如何正确地做到这一点(需要身份验证)?

编辑:集成了一个动作系统来尝试一些东西,看起来 Django 频道根本没有从 HTTP 中获取任何会话。

只是返回假。

EDIT2:我看到它现在可以工作了,我尝试将 localhost 更改为 127.0.0.1 并证明它现在可以工作。有没有办法让它将 localhost 检测为有效域,以便通过会话进行端口?

EDIT3:原来我发现了 localhost vs 127.0.0.1 cookie 问题哈哈。为了不浪费赏金,您将如何亲自在消息/频道中实现 auth login_required?

edit4:虽然我仍然不知道为什么这件事不起作用,但这是我最终围绕这个问题改变我的应用程序的方式:

我创建了一个动作系统。进入时,套接字不会执行任何操作,直到您通过 JSON 向其发送 AUTHENTICATE 操作。我在 guest_actions 和 user_actions 中分离了登录操作。一旦通过身份验证,它就会设置会话并且您可以使用 user_actions。

0 投票
3 回答
5547 浏览

python - 使用 SSL 使用 Daphne + NGINX 部署 Django 通道

我有一个工作配置的 nginx 代理到 django 频道的上游 daphne 服务器。但是,当我将网站移动到 ssl 时,我开始遇到 websocket 请求的问题 403 错误。这是来自我的错误日志:

并从访问日志中:

我的 nginx 配置如下:

这是我的 requirements.txt:

任何见解将不胜感激。

0 投票
1 回答
507 浏览

nginx - Docker 端口映射。在容器中运行达芙妮

我有点困惑。我以这种方式在本地启动达芙妮:daphne common.asgi:channel_layer --port 8338一切都“没问题”。当我使用curl -v 127.0.0.1:8338得到以下输出

但是当我尝试使用端口分配启动 docker 容器时,并没有说 8338 端口已经被使用:

在 daphne 已经启动的情况下,运行上面的代码是“好的”。所以在我看来,端口分配不正确。

我错过了什么?

所以这产生了下一个问题,我无法通过 nginx 将信号重定向到 websockets 到我的 docker 容器。因为端口 8338 上没有任何内容(仅启动容器时)。这是 nginx.conf:

0 投票
2 回答
1202 浏览

python - aws 上的 django 频道:daphne 和工作人员正在运行,但 websocket taret 不健康

我一直在关注这篇文章 - https://blog.mangoforbreakfast.com/2017/02/13/django-channels-on-aws-elastic-beanstalk-using-an-alb/

让我的 django-channels 应用程序在 aws 上运行 ..但只有非 websockets 请求得到处理。

我的频道层设置是:

正如文章中提到的,我有两个目标群体。一条转发路径 / 到端口 80 和 /ws/* 到 5000。

我的 supervisord.conf 是 -

当我在 aws 日志上检查 supervisorctl status 的结果时,它显示它们运行良好。但我仍然得到 ws 的 404 响应。

如果您需要更多信息,请帮助并告诉我。

0 投票
1 回答
3497 浏览

django - 如何在 unix 套接字上绑定 Daphne?

到目前为止,我已经使用Gunicorn和这个配置文件 systemd:

并且Nginx代理请求这个 unix 套接字。

尝试达芙妮,我意识到我无法指定--env DJANGO_SETTINGS_MODULE='config.settings.production'

但是我在中指定了这个变量asgi.py,就一切正常。

当我运行 . 时gunicorn service,立即创建了套接字本身,请求来自nginx.

当我尝试对 Daphne 做同样的事情时,我得到一个错误:

6 月 26 日 11:48:32 p435061.kvmvps daphne[8447]:ValueError:int() 的无效文字,基数为 8:'/var/www/user/user.sock'

unix.sock但是当我尝试运行Daphne和创建systemd文件时,我无法弄清楚如何使用

更新

我更改了设置文件,它给出了一些奇怪的东西,但它有效:

systemctl status daphne 返回:

但是 nginx 发誓缺少 *.sock 文件:

我花了一整天的时间来解决这个问题,但什么也没发生。

0 投票
0 回答
1272 浏览

python - 为什么Daphne在通过supervisor运行时失败,但在命令行运行时工作?

我正在尝试使用主管来管理 AWS 中的 Django 应用程序的 Daphne 服务器和一些工作人员。我一直在关注本教程。我的supervisord.conf样子是这样的:

我的自定义配置文件位于并且看起来像这样(我在添加工人之前/etc/supervisor/conf.d/company_name.conf试图让工作):server_interface

当我运行此命令时:/home/web/venv/bin/daphne -b 127.0.0.1 -p 8000 company_name.asgi:channel_layer从命令行 while in /home/web/api-server/company_name/,它工作正常并且服务器启动。当我运行时supervisorctl start server_interface,我在 sdterr 日志中看到以下输出:

运行printenv显示设置的必要环境变量,这可以从 Daphne 从命令行正常启动的事实得到证实,但我无法弄清楚为什么它在通过 Supervisor 运行时无法正确启动。

0 投票
1 回答
266 浏览

websocket - 为什么我需要使用 daphne 进行反向代理?

我红了很多关于使用 django 频道和 daphne 的教程,每个人都使用 nginx(或 apache,没关系)作为反向代理?为什么需要反向代理?我不能只使用达芙妮进行生产吗?

0 投票
1 回答
474 浏览

azure - nginx 作为 daphne 的反向代理:找不到 404

这是我的 nginx.conf:

我的服务器是天蓝色的虚拟机。

当我去http://13.65.102.226/proxy/时,它给出了 404 not found 。

这是我的supervisord.conf:

有什么建议么?

0 投票
0 回答
456 浏览

django - Nginx+daphne WebSocket 连接收不到

我使用 nginx 作为 daphne 的反向代理来使用 django 频道。

这是我的 nginx.conf

在达芙妮的日志中:

但是WebSocket在客户端的连接没有收到任何消息

你能帮助我吗?

更新:

客户端代码(我在 Swift 中使用 Starscream 库进行 WebSocket 连接):

路由.py:

消费者.py:

res_user 来自:https ://gist.github.com/leonardoo/9574251b3c7eefccd84fc38905110ce4