日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Django實(shí)現(xiàn)聊天機(jī)器人

瀏覽:54日期:2024-09-05 13:05:34
目錄實(shí)現(xiàn)原理第一步 安裝環(huán)境依賴第二步 配置Celery第三步 編寫機(jī)器人聊天主頁面第四步 編寫后臺(tái)websocket路由及處理方法第五步 編寫Celery異步任務(wù)第六步 運(yùn)行看效果小結(jié)

演示效果如下所示:

Django實(shí)現(xiàn)聊天機(jī)器人

實(shí)現(xiàn)原理

用戶在聊天界面調(diào)用Celery異步任務(wù),Celery異步任務(wù)執(zhí)行完畢后發(fā)送結(jié)果給channels,然后channels通過websocket將結(jié)果實(shí)時(shí)推送給用戶。對(duì)于簡(jiǎn)單的算術(shù)運(yùn)算,Celery一般自行計(jì)算就好了。對(duì)于網(wǎng)上查找詩人簡(jiǎn)介這樣的任務(wù),Celery會(huì)調(diào)用Python爬蟲(requests+parsel)爬取古詩文網(wǎng)站上的詩人簡(jiǎn)介,把爬取結(jié)果實(shí)時(shí)返回給用戶。

接下來我們來看下具體的代碼實(shí)現(xiàn)吧。

第一步 安裝環(huán)境依賴

首先在虛擬環(huán)境中安裝django和以下主要項(xiàng)目依賴。本項(xiàng)目使用了最新版本,為3.X版本。

# 主要項(xiàng)目依賴 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

新建一個(gè)名為myproject的項(xiàng)目,新建一個(gè)app名為bots。如果windows下安裝報(bào)錯(cuò),如何解決自己網(wǎng)上去找吧,很容易解決。修改settings.py, 將channels和chat加入到INSTALLED_APPS里,并添加相應(yīng)配置,如下所示:

INSTALLED_APPS = [ ’django.contrib.admin’, ’django.contrib.auth’, ’django.contrib.contenttypes’, ’django.contrib.sessions’, ’django.contrib.messages’, ’django.contrib.staticfiles’, ’channels’, # channels應(yīng)用 ’bots’, # bots應(yīng)用 ] # 設(shè)置ASGI應(yīng)用 ASGI_APPLICATION = ’myproject.asgi.application’# 生產(chǎn)環(huán)境中使用redis做后臺(tái),安裝channels_redisimport osCHANNEL_LAYERS = { 'default': {'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': { 'hosts': [os.environ.get(’REDIS_URL’, ’redis://127.0.0.1:6379/2’)],}, },}

最后將bots應(yīng)用的urls.py加入到項(xiàng)目urls.py中去,這和常規(guī)Django項(xiàng)目無異。

# 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后,我們要對(duì)其進(jìn)行配置。分別修改myproject目錄下的__init__.py和celery.py(新建), 添加如下代碼:

# __init__.pyfrom .celery import app as celery_app__all__ = (’celery_app’,)# celery.pyimport osfrom celery import Celery# 設(shè)置環(huán)境變量os.environ.setdefault(’DJANGO_SETTINGS_MODULE’, ’myproject.settings’)# 實(shí)例化app = Celery(’myproject’)# namespace=’CELERY’作用是允許你在Django配置文件中對(duì)Celery進(jìn)行配置# 但所有Celery配置項(xiàng)必須以CELERY開頭,防止沖突app.config_from_object(’django.conf:settings’, namespace=’CELERY’)# 自動(dòng)從Django的已注冊(cè)app中發(fā)現(xiàn)任務(wù)app.autodiscover_tasks()# 一個(gè)測(cè)試任務(wù)@app.task(bind=True)def debug_task(self): print(f’Request: {self.request!r}’)

接著修改settings.py, 增加如下Celery配置:

# Celery配置CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'CELERY_TIMEZONE = TIME_ZONE# celery內(nèi)容等消息的格式設(shè)置,默認(rèn)jsonCELERY_ACCEPT_CONTENT = [’application/json’, ]CELERY_TASK_SERIALIZER = ’json’CELERY_RESULT_SERIALIZER = ’json’

完整Celery配置見:Django進(jìn)階:萬字長(zhǎng)文教你使用Celery執(zhí)行異步和周期性任務(wù)(多圖)

第三步 編寫機(jī)器人聊天主頁面

本例我們只需要利用django普通視圖函數(shù)編寫1個(gè)頁面,用于展示首頁(index)與用戶交互的聊天頁面。這個(gè)頁面對(duì)應(yīng)的路由及視圖函數(shù)如下所示:

# bots/urls.py from django.urls import path from . import views urlpatterns = [ path(’’, views.index, name=’index’), ] # bots/views.py from django.shortcuts import render def index(request): return render(request, ’bots/index.html’, {})

接下來我們編寫模板文件index.html,它的路徑位置如下所示:

bots/ __init__.py templates/ bots/ index.html urls.py views.py

index.html內(nèi)容如下所示。

<!DOCTYPE html><html><head> <meta charset='utf-8'/> <title>Django+Channels+Celery聊天機(jī)器人</title></head><body><textarea id='chat-log' cols='100' rows='20' readonly></textarea><br/><input type='text' size='100' placeholder='輸入`help`獲取幫助信息.'/><br/><input id='chat-message-submit' type='button' value='Send'/> <script> var wss_protocol = (window.location.protocol == ’https:’) ? ’wss://’: ’ws://’; var chatSocket = new WebSocket(wss_protocol + window.location.host + ’/ws/bots/’); chatSocket.onopen = function(e) {document.querySelector(’#chat-log’).value +=(’歡迎來到大江狗Django聊天機(jī)器人. 請(qǐng)輸入`help`獲取幫助信息.n’)} chatSocket.onmessage = function(e) {var data = JSON.parse(e.data);var message = data[’message’];document.querySelector(’#chat-log’).value += (message + ’n’); }; chatSocket.onclose = function(e) {document.querySelector(’#chat-log’).value +=(’Socket closed unexpectedly, please reload the page.n’)}; document.querySelector(’#chat-message-input’).focus(); document.querySelector(’#chat-message-input’).onkeyup = function(e) {if (e.keyCode === 13) { // enter, return document.querySelector(’#chat-message-submit’).click();} }; document.querySelector(’#chat-message-submit’).onclick = function(e) {var messageInputDom = document.querySelector(’#chat-message-input’);var message = messageInputDom.value;chatSocket.send(JSON.stringify({ ’message’: message})); messageInputDom.value = ’’; };</script></body></html>第四步 編寫后臺(tái)websocket路由及處理方法

當(dāng) channels 接受 WebSocket 連接時(shí), 它也會(huì)根據(jù)根路由配置去查找相應(yīng)的處理方法。只不過channels的websocket路由不在urls.py中配置,處理函數(shù)也不寫在views.py。在channels中,這兩個(gè)文件分別變成了routing.py和consumers.py。

在bots應(yīng)用下新建routing.py, 添加如下代碼。它的作用是將發(fā)送至ws/bots/的websocket請(qǐng)求轉(zhuǎn)由BotConsumer處理。

from django.urls import re_pathfrom . import consumerswebsocket_urlpatterns = [ re_path(r’ws/bots/$’, consumers.BotConsumer.as_asgi()),]

注意:定義websocket路由時(shí),推薦使用常見的路徑前綴 (如/ws) 來區(qū)分 WebSocket 連接與普通 HTTP 連接, 因?yàn)樗鼘⑹股a(chǎn)環(huán)境中部署 Channels 更容易,比如nginx把所有/ws的請(qǐng)求轉(zhuǎn)給channels處理。

與Django類似,我們還需要把這個(gè)app的websocket路由加入到項(xiàng)目的根路由中去。編輯myproject/asgi.py, 添加如下代碼:

# myproject/asgi.pyimport osfrom channels.auth import AuthMiddlewareStackfrom channels.routing import ProtocolTypeRouter, URLRouterfrom django.core.asgi import get_asgi_applicationimport chat.routingimport bots.routingos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')application = ProtocolTypeRouter({ 'http': get_asgi_application(), # websocket請(qǐng)求使用的路由 'websocket': AuthMiddlewareStack(URLRouter( bots.routing.websocket_urlpatterns) )})

接下來在bots應(yīng)用下新建consumers.py, 添加如下代碼:

import jsonfrom asgiref.sync import async_to_syncfrom channels.generic.websocket import WebsocketConsumerfrom . import tasksCOMMANDS = { ’help’: {’help’: ’命令幫助信息.’, }, ’add’: {’args’: 2,’help’: ’計(jì)算兩個(gè)數(shù)之和, 例子: `add 12 32`.’,’task’: ’add’ }, ’search’: {’args’: 1,’help’: ’通過名字查找詩人介紹,例子: `search 李白`.’,’task’: ’search’ },}class BotConsumer(WebsocketConsumer): def receive(self, text_data):text_data_json = json.loads(text_data)message = text_data_json[’message’]response_message = ’請(qǐng)輸入`help`獲取命令幫助信息。’message_parts = message.split()if message_parts: command = message_parts[0].lower() if command == ’help’:response_message = ’支持的命令有:n’ + ’n’.join( [f’{command} - {params['help']} ’ for command, params in COMMANDS.items()]) elif command in COMMANDS:if len(message_parts[1:]) != COMMANDS[command][’args’]: response_message = f’命令`{command}`參數(shù)錯(cuò)誤,請(qǐng)重新輸入.’else: getattr(tasks, COMMANDS[command][’task’]).delay(self.channel_name, *message_parts[1:]) response_message = f’收到`{message}`任務(wù).’ async_to_sync(self.channel_layer.send)( self.channel_name, {’type’: ’chat.message’,’message’: response_message }) def chat_message(self, event):message = event[’message’]# Send message to WebSocketself.send(text_data=json.dumps({ ’message’: f’[機(jī)器人]: {message}’}))

上面代碼中最重要的一行如下所示。BotConsumer在接收到路由轉(zhuǎn)發(fā)的前端消息后,對(duì)其解析,將當(dāng)前頻道名和解析后的參數(shù)一起交由Celery異步執(zhí)行。Celery執(zhí)行任務(wù)完成以后會(huì)將結(jié)果發(fā)到這個(gè)頻道,這樣就實(shí)現(xiàn)了channels和Celery的通信。

getattr(tasks, COMMANDS[command][’task’]).delay(self.channel_name, *message_parts[1:])第五步 編寫Celery異步任務(wù)

在bots目錄下新建`tasks.py`,添加如下代碼:

from asgiref.sync import async_to_syncfrom celery import shared_taskfrom channels.layers import get_channel_layerfrom parsel import Selectorimport requestschannel_layer = get_channel_layer()@shared_taskdef add(channel_name, x, y): message = ’{}+{}={}’.format(x, y, int(x) + int(y)) async_to_sync(channel_layer.send)(channel_name, {'type': 'chat.message', 'message': message}) print(message)@shared_taskdef search(channel_name, name): spider = PoemSpider(name) result = spider.parse_page() async_to_sync(channel_layer.send)(channel_name, {'type': 'chat.message', 'message': str(result)}) print(result)class PoemSpider(object): def __init__(self, keyword):self.keyword = keywordself.url = 'https://so.gushiwen.cn/search.aspx' def parse_page(self):params = {’value’: self.keyword}response = requests.get(self.url, params=params)if response.status_code == 200: # 創(chuàng)建Selector類實(shí)例 selector = Selector(response.text) # 采用xpath選擇器提取詩人介紹 intro = selector.xpath(’//textarea[starts-with(@id,'txtareAuthor')]/text()’).get() print('{}介紹:{}'.format(self.keyword, intro)) if intro:return introprint('請(qǐng)求失敗 status:{}'.format(response.status_code))return '未找到詩人介紹。'

以上兩個(gè)任務(wù)都以channel_name為參數(shù),任務(wù)執(zhí)行完畢后通過channel_layer的send方法將結(jié)果發(fā)送到指定頻道。

注意:

- 默認(rèn)獲取channel_layer的方式是調(diào)用接口:channels.layers.get_channel_layer()。如果是在consumer中調(diào)用接口的話可以直接使用self.channel_layer。

- 對(duì)于channel layer的方法(包括send()、group_send(),group_add()等)都屬于異步方法,這意味著在調(diào)用的時(shí)候都需要使用await,而如果想要在同步代碼中使用它們,就需要使用裝飾器asgiref.sync.async_to_sync

第六步 運(yùn)行看效果

如果不出意外,你現(xiàn)在的項(xiàng)目布局應(yīng)該如下所示。說實(shí)話,整個(gè)項(xiàng)目一共沒幾個(gè)文件,Python的簡(jiǎn)潔和效率真是出了名的好啊。

Django實(shí)現(xiàn)聊天機(jī)器人

連續(xù)運(yùn)行如下命令,就可以看到我們文初的效果啦。

# 啟動(dòng)django測(cè)試服務(wù)器 python manage.py makemigrations python manage.py migrate python manage.py runserver # windows下啟動(dòng)Celery需eventlet # 啟動(dòng)Celery前確定redis服務(wù)已開啟哦 Celery -A myproject worker -l info -P eventlet小結(jié)

本文我們使用Django + Channels + Celery + Redis打造了一個(gè)聊天機(jī)器人,既會(huì)算算術(shù),還會(huì)查古詩文。借用這個(gè)實(shí)現(xiàn)原理,你可以打造非常有趣的實(shí)時(shí)聊天應(yīng)用哦,比如在線即時(shí)問答,在線客服,實(shí)時(shí)查詢訂單,Django版的siri美女等等。

Django Channels + Websocket + Celery聊天機(jī)器人項(xiàng)目源碼地址:https://github.com/shiyunbo/django-channels-chatbot

以上就是Django實(shí)現(xiàn)聊天機(jī)器人的詳細(xì)內(nèi)容,更多關(guān)于Django 聊天機(jī)器人的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日本精品| 理论片午夜视频在线观看| 国产精品久久久久久av公交车| 精品久久久亚洲| 亚洲18在线| 免费国产亚洲视频| 欧美日韩精品在线一区| 久久婷婷丁香| 国产精品97| 亚洲综合丁香| 中文一区一区三区免费在线观 | 一级成人国产| 蜜臀精品一区二区三区在线观看 | 日本欧美在线看| 国精品一区二区| 国产精品88久久久久久| 午夜在线观看免费一区| 亚洲视频国产| 日韩精品欧美精品| 91麻豆精品| 老司机免费视频一区二区三区| 中文一区在线| 久久最新视频| 日韩中文字幕区一区有砖一区| 欧美www视频在线观看| 国产精品国产一区| 亚洲二区在线| 亚洲精选av| 国产精品一区二区99| 久久久精品区| 99视频精品全国免费| 在线成人直播| 日本不卡一二三区黄网| 免费在线成人| 久久久精品久久久久久96| 国产一区二区精品| 国产亚洲一区二区三区啪| 久久久久久婷| 在线综合亚洲| 国产精品久久久久9999高清| 国产精品原创| 先锋影音国产一区| 国产精品网在线观看| 亚洲毛片视频| 国产一区一一区高清不卡| 亚洲一级二级| 91国内精品| 亚洲成人va| 日韩国产精品久久久久久亚洲| 99在线|亚洲一区二区| 亚洲中午字幕| 精品中文字幕一区二区三区| 亚洲无线一线二线三线区别av| 日韩综合在线| 亚洲一区二区三区免费在线观看 | 日韩精彩视频在线观看| 欧美一区二区三区久久精品| 精品三级国产| 亚洲自拍另类| 福利一区二区三区视频在线观看| 国产精品xxx| 99久久99久久精品国产片果冰 | 99久久精品国产亚洲精品| 久久一二三区| 成人精品久久| 日本亚州欧洲精品不卡| www在线观看黄色| 极品裸体白嫩激情啪啪国产精品| 91精品韩国| 亚洲一区导航| 性欧美xxxx免费岛国不卡电影| 欧美成a人国产精品高清乱码在线观看片在线观看久| 欧美午夜精品一区二区三区电影| 国产成人免费av一区二区午夜| 国产福利一区二区三区在线播放| 每日更新成人在线视频| 91精品xxx在线观看| 日韩av一级片| 欧美精品自拍| 国产精品99一区二区三| 日韩av二区在线播放| 成午夜精品一区二区三区软件| 欧美黄色一区| 国产精品普通话对白| 久久亚洲资源中文字| 免费久久99精品国产自在现线| 玖玖玖国产精品| 国产第一亚洲| 国产欧美日韩综合一区在线播放| 国产乱码精品一区二区三区四区| 欧美日韩一视频区二区| 亚洲高清不卡| 欧美天堂视频| 国产精品**亚洲精品| 亚洲久草在线| 三级在线观看一区二区 | 综合国产在线| 欧美日韩一二三四| 久久久久久夜| 欧美精品第一区| 亚洲精品国模| 日韩亚洲在线| 久久蜜桃av| 日韩**一区毛片| 视频一区视频二区中文字幕| 国产激情在线播放| 欧美成人aaa| 国产精品一线| 日韩av不卡在线观看| 欧美日韩一区二区三区不卡视频 | 91日韩欧美| 欧美午夜三级| 亚洲精品无播放器在线播放| 国产精品日韩| 五月天综合网站| 久久久精品五月天| 99视频精品全国免费| 中文字幕在线高清| 国产精品主播| 六月丁香综合在线视频| 麻豆精品国产91久久久久久| 国产精品一区二区精品视频观看 | 青青草91视频| 视频一区国产视频| 蜜芽一区二区三区| 亚洲影视一区| 亚洲精品乱码日韩| 亚洲青青久久| 欧美日韩在线精品一区二区三区激情综合| 国产一区二区三区精品在线观看| 性感美女一区二区在线观看| 丰满少妇一区| 日本欧美国产| 欧美一区久久久| 九九综合九九| 亚洲少妇一区| 蜜桃一区二区三区在线观看| 久久国产精品99国产| 视频一区二区三区入口| 婷婷综合成人| 国产精品一区二区三区www| 毛片不卡一区二区| 久久精品国产免费| 精品日韩在线| 神马午夜在线视频| 久久久五月天| 久久国产99| 91亚洲精品在看在线观看高清| 亚洲不卡av不卡一区二区| 999久久久免费精品国产| 尹人成人综合网| 国产模特精品视频久久久久| 综合激情网站| 久久在线91| 亚洲第一区色| 免费在线观看一区二区三区| 欧美日韩亚洲一区在线观看| 国产成人精品免费视| 欧美中文字幕一区二区| 丝袜美腿亚洲一区二区图片| 日韩高清电影一区| 成人日韩av| 一本色道久久精品| 国产麻豆一区二区三区 | 美女久久99| 国产精品麻豆久久| 亚洲欧美视频| 亚洲在线电影| 欧洲一区二区三区精品| 男女精品网站| 国产精品v一区二区三区| 欧美三级网址| 久久福利影视| 美女久久久久久| 亚洲国产不卡| 欧美日韩一视频区二区| 91精品韩国| 日本在线成人| 热三久草你在线| 中文字幕一区二区精品区| 国产福利91精品一区二区| 亚洲综合不卡| 欧美www视频在线观看| 蜜桃久久av一区| 麻豆mv在线观看| 综合精品一区| 日韩在线短视频| 婷婷久久免费视频| 夜鲁夜鲁夜鲁视频在线播放| 日本免费在线视频不卡一不卡二| 在线精品一区| 精品国产亚洲一区二区三区在线 | 国产精品1luya在线播放| 国产91久久精品一区二区| 欧美日韩亚洲一区在线观看| 久久中文字幕二区| 国产极品久久久久久久久波多结野 | 日韩国产在线一| 日产精品一区二区| 日本中文字幕不卡|