首先,对不起这个长期问题,我希望你们中的一些人能够耐心等待.
TL; DR:如何在systemd中正确加载django设置?
我按照本指南Deploying Django Channels Using Daphne,所以我可以运行一些实时应用程序(使用WebSockets).如果没有nginx,并从命令行运行worker(python manage.py runworker)和接口(daphne),我可以访问正确的渠道使用者类,如下面的日志中所示(这些是从javascript客户端触发的) :
2017-10-09 21:10:35,210 - DEBUG - worker - Got message on websocket.connect (reply daphne.response.CYeWgnNQoY!mwuQrazQtv)
2017-10-09 21:10:35,211 - DEBUG - runworker - websocket.connect
2017-10-09 21:10:35,211 - DEBUG - worker - Dispatching message on websocket.connect to api.consumers.OrderConsumer
2017-10-09 21:10:48,132 - DEBUG - worker - Got message on websocket.receive (reply daphne.response.CYeWgnNQoY!mwuQrazQtv)
2017-10-09 21:10:48,132 - DEBUG - runworker - websocket.receive
2017-10-09 21:10:48,132 - DEBUG - worker - Dispatching message on websocket.receive to api.consumers.OrderConsumer
这些事件由以下javascript调用触发:
ws = new WebSocket("ws://localhost:8000/order/1/")
ws.send("test")
使用nginx,并在systemd上运行接口和worker,尽管使用完全相同的触发器输入,但仍获得以下日志.
2017-10-09 20:38:35,503 - DEBUG - worker - Got message on websocket.connect (reply daphne.response.PPGuXtBmQD!EgUfaNZjUj)
2017-10-09 20:38:35,503 - DEBUG - runworker - websocket.connect
2017-10-09 20:38:35,503 - DEBUG - worker - Dispatching message on websocket.connect to channels.routing.connect_consumer
2017-10-09 20:38:42,993 - DEBUG - worker - Got message on websocket.receive (reply daphne.response.PPGuXtBmQD!EgUfaNZjUj)
2017-10-09 20:38:42,993 - DEBUG - runworker - websocket.receive
2017-10-09 20:38:42,993 - DEBUG - worker - Dispatching message on websocket.receive to channels.routing.null_consumer
请注意,接收通道正被路由到null_consumer.我认为这里的问题只是channel.routing没有很好地设置.由于我在两个版本中都使用相同的设置(Django设置文件),这可能意味着设置本身未正确加载.请考虑以下文件.
## rest-api/farmaApp/settings.py
...
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'asgi_redis.RedisChannelLayer',
'CONFIG': {
'hosts': [('localhost', 6379)],
},
'ROUTING': 'farmaApp.routing.channel_routing',
}
}
...
哪个应该设置channel.routing到:
## rest-api/farmaApp/routing.py
from channels.routing import route
from api.consumers import ws_connect, ws_disconnect, OrderConsumer
channel_routing = [
route('websocket.connect', ws_connect, path=r'^/users/'),
route('websocket.disconnect', ws_disconnect, path=r'^/users/'),
OrderConsumer.as_route(path=r'^/order/(?P<order_id>[\d+])/'),
]
同样,我不认为配置本身是错误的,因为它没有systemd.最后,这是我的系统配置:
## /etc/systemd/system/daphne.service
[Unit]
Description=daphne daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/rest-api
Environment=DJANGO_SETTINGS_MODULE=farmaApp.settings
ExecStart=/home/ubuntu/rest-api/env/bin/daphne --access-log /home/ubuntu/rest-api/access.log -b 0.0.0.0 -p 8001 farmaApp.asgi:channel_layer
[Install]
WantedBy=multi-user.target
## /etc/systemd/system/django_worker.service
[Unit]
Description=django_worker daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/rest-api
Environment=DJANGO_SETTINGS_MODULE=farmaApp.settings
ExecStart=/home/ubuntu/rest-api/env/bin/python manage.py runworker -v 2
[Install]
WantedBy=multi-user.target
请注意我根据链接指南将DJANGO_SETTINGS_MODULE变量导出到环境的两个配置文件.我认为这不符合预期.
解决方法:
我刚刚部署了我的django频道应用程序,以下系统服务文件为我工作而不使用主管:
/etc/systemd/system/django-channels-daphne.service
[Unit]
Description=daphne server script for my project
After=network.target
[Service]
User=webuser
Group=webuser
WorkingDirectory=/path/to/myproject
Environment=DJANGO_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Environment=DJANGO_ALLOWED_HOSTS=myapp.chatbot.ai
ExecStart=/path/to/python/virtualenv/bin/daphne -b 0.0.0.0 -p 8000 myproject.asgi:channel_layer
Restart=always
[Install]
WantedBy=multi-user.target
/etc/systemd/system/django-channels-runworker.service
[Unit]
Description=python runworker server for myproject
After=network.target
[Service]
User=webuser
Group=webuser
WorkingDirectory=/path/to/myproject
Environment=DJANGO_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Environment=DJANGO_ALLOWED_HOSTS=myapp.chatbot.ai
ExecStart=/path/to/python/virtualenv/bin/python /path/to/myproject/manage.py runworker --threads 4
Restart=always
[Install]
WantedBy=multi-user.target
/path/to/myproject/myproject/asgi.py
import os
import channels
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
channel_layer = channels.asgi.get_channel_layer()
/path/to/myproject/myproject/settings.py中的一些行:
ALLOWED_HOSTS = [os.environ['DJANGO_ALLOWED_HOSTS']]
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
原文地址:https://codeday.me/bug/20191006/1859485.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。