Channels是Django团队研发的一个给Django提供websocket支持的框架,使用它我们可以轻松开发需要长链接的实时通讯应用。本文在Django实战:channels + websocket四步打造个在线聊天室(附动图)的基础上结合Celery和Python爬虫技术打造了一个会算术懂诗文的聊天机器人,是非常难得的一个Django综合应用项目哦。关注本公众号的读者发送消息"Django机器人"即可自动获取源码地址,包括前例多人聊天应用的源码。
演示效果如下所示:
实现原理
用户在聊天界面调用Celery异步任务,Celery异步任务执行完毕后发送结果给channels,然后channels通过websocket将结果实时推送给用户。对于简单的算术运算,Celery一般自行计算就好了。对于网上查找诗人简介这样的任务,Celery会调用Python爬虫(requests+parsel)爬取古诗文网站上的诗人简介,把爬取结果实时返回给用户。
接下来我们来看下具体的代码实现吧。
第一步 安装环境依赖
首先在虚拟环境中安装django
和以下主要项目依赖。本项目使用了最新版本,为3.X版本。
# 主要项目依赖
pip install django
pip install channels
pip install channels_redis
pip install celery
pip install redis
pip install eventlet # windows only
# 爬虫依赖
pip install requests
pip install parsel
新建一个名为myproject
的项目,新建一个app名为bots
。如果windows下安装报错,如何解决自己网上去找吧,很容易解决。修改settings.py
, 将channels
和chat
加入到INSTALLED_APPS
里,并添加相应配置,如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'channels', # channels应用
'bots', # bots应用
]
# 设置ASGI应用
ASGI_APPLICATION = 'myproject.asgi.application'
# 生产环境中使用redis做后台,安装channels_redis
import os
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [os.environ.get('REDIS_URL', 'redis://127.0.0.1:6379/2')],
},
},
}
最后将bots
应用的urls.py
加入到项目urls.py
中去,这和常规Django项目无异。
# myproject/urls.py
from django.conf.urls import include
from django.urls import path
from django.contrib import admin
urlpatterns = [
path('bots/', include('bots.urls')),
path('admin/', admin.site.urls),
]
第二步 配置Celery
pip安装好Celery和redis后,我们要对其进行配置。分别修改myproject目录下的__init__.py和celery.py(新建), 添加如下代码:
# __init__