问题标签 [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.
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-Language
HTTP 标头。- 否则,它将使用全局
LANGUAGE_CODE
设置。对于 API 客户端,最合适的通常是使用
Accept-Language
标头;除非使用会话身份验证,否则会话和 cookie 将不可用,通常更好的做法是更喜欢Accept-Language
API 客户端的标头而不是使用语言 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"
上面请求中包含的内容):
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。
python - 使用 SSL 使用 Daphne + NGINX 部署 Django 通道
我有一个工作配置的 nginx 代理到 django 频道的上游 daphne 服务器。但是,当我将网站移动到 ssl 时,我开始遇到 websocket 请求的问题 403 错误。这是来自我的错误日志:
并从访问日志中:
我的 nginx 配置如下:
这是我的 requirements.txt:
任何见解将不胜感激。
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:
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 响应。
如果您需要更多信息,请帮助并告诉我。
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 文件:
我花了一整天的时间来解决这个问题,但什么也没发生。
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 运行时无法正确启动。
websocket - 为什么我需要使用 daphne 进行反向代理?
我红了很多关于使用 django 频道和 daphne 的教程,每个人都使用 nginx(或 apache,没关系)作为反向代理?为什么需要反向代理?我不能只使用达芙妮进行生产吗?
azure - nginx 作为 daphne 的反向代理:找不到 404
这是我的 nginx.conf:
我的服务器是天蓝色的虚拟机。
当我去http://13.65.102.226/proxy/时,它给出了 404 not found 。
这是我的supervisord.conf:
有什么建议么?
django - Nginx+daphne WebSocket 连接收不到
我使用 nginx 作为 daphne 的反向代理来使用 django 频道。
这是我的 nginx.conf
在达芙妮的日志中:
但是WebSocket在客户端的连接没有收到任何消息
你能帮助我吗?
更新:
客户端代码(我在 Swift 中使用 Starscream 库进行 WebSocket 连接):
路由.py:
消费者.py:
res_user 来自:https ://gist.github.com/leonardoo/9574251b3c7eefccd84fc38905110ce4