iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

零基礎成為 AI 解夢大師秘笈系列 第 15

【零基礎成為 AI 解夢大師秘笈】Day15 - Django Chatterbot II

  • 分享至 

  • xImage
  •  

斜槓學習 – 零基礎成為 AI 解夢大師秘笈

前言

系列文章簡介

大家好,我們是 AI . FREE Team - 人工智慧自由團隊,這一次的鐵人賽,自由團隊將從0到1 手把手教各位讀者學會 (1)Python基礎語法 (2)Python Web 網頁開發框架 – Django (3)Python網頁爬蟲 – 周易解夢網 (4)Tensorflow AI語言模型基礎與訓練 – LSTM (5)實際部屬AI解夢模型到Web框架上。

為什麼技術要從零開始寫起

自由團隊的成立宗旨為開發AI/新科技的學習資源,提供各領域的學習者能夠跨域學習資料科學,並透過自主學習發展協槓職涯,結合智能應用到各式領域,無論是文、法、商、管、醫領域的朋友,都可以自由的學習AI技術。

資源

AI . FREE Team 讀者專屬福利 → Python Basics 免費學習資源

今日目標

探討 Django Chatterbot 是如何運作的。

教學開始

我們在昨天的內容將 Django Chatterbot 的專案 clone 到自己的本地端,並且做了一些調整,最後將專案 Run 了起來。隨著文章一天一天走來,我們都已經具備基本的 Django 開發能力,今天我們就會在了解 Chatterbot 是如何在 Django 運作的。

1 專案架構

首先,從專案的結構開始看,假設大家也是使用 VScode 開啟昨天的 Django Chatterbot 專案,可以發現在左側的 panel 看到像是下方的架構:

  • example_app/
    • init.py
    • settings.py
    • urls.py
    • views.py
    • wsgi.py
    • static/
      • css/ ...
      • img/ ...
      • js/ ...
    • templates/
      • app.html
      • nav.html

同樣都是 Django Project,不過我們還是可以拿現在的 Django Chatterbot 和之前我們一連開發一周以上的 DI_project (Hashtag 古人 和 學派)比對一番。

  • 首先大家可以發現本專案是一個 APP,而他具備所有 Django Project 所需要的元素,所以也可以視為一個完整的 Django Project;和 DI_project 不同,我們是在 DI_project 當中又建立的一個附屬於 DI_project 的 APP,DI_project/demo_app/urls.py 設定需要 DI_project/urls.py 寫一個 path object include 進來。
  • 一樣有 templates/ 目錄,在裡面就會放 views.py 將會 render 出來的模板
  • 一樣有 static/ 目錄,只是在其中還有在細分成 css/目錄、img/目錄、js/目錄,我們當初 css 的部分是直接 introduce 一個 remote 的 bootstrap css,所以沒有看到實體的檔案,這邊 css/ 裡面裝的 css file 其中一個就是 bootstrap.css。

2 介紹 example_app/ settings.py

大家可以看到 settings.py 內部有註冊的 app 有兩行不是原本預設的 app。

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
   
    'chatterbot.ext.django_chatterbot',
    'example_app',
)

其中的chatterbot.ext.django_chatterbot,是因為有利用到 chatterbot 的套件;另一個 example_app 則為 APP 的命名,回顧在 DI_project 當中的 settings.py 是還有透過 demo_app/apps.py 才將 app 註冊進 INSATLLED_APPS 裡面。

3 介紹 example_app/ urls.py

這邊大家會看到,其寫法好像跟之前用到的不太一樣。

...
urlpatterns = [
    url(r'^$', ChatterBotAppView.as_view(), name='main'),
    url(r'^admin/', admin.site.urls, name='admin'),
    url(r'^api/chatterbot/', ChatterBotApiView.as_view(), name='chatterbot'),
]

可以改寫成下面這個樣子,一樣在 run server 時一切順利

...
from django.urls import path

urlpatterns = [
    #url(r'^$',  .as_view(), name='main'),
    #url(r'^admin/', admin.site.urls, name='admin'),
    #url(r'^api/chatterbot/', ChatterBotApiView.as_view(), name='chatterbot'),
    path('', ChatterBotAppView.as_view(), name='main'),
    path('admin/', admin.site.urls, name='admin'),
    path('api/chatterbot/', ChatterBotApiView.as_view(), name='chatterbot'),
]

正則表示法(Regular Expression)

不過,原本寫法的 url() 內是什麼意思呢?首先 r 表示的就是 正則表示法(Regular Expression),通常會利用這樣的技巧來索引出符合句法規則的內容,像是 ^ 表示字串最前面應該要是什麼內容;而 $ 表示字串最後面應該是什麼,所以 r'^$' 表示的就是 空字串
而第三個的 r'api/chatterbot/' 因為沒有 $ 的限制,所以其實在 server run 起來之後,瀏覽器中使用以下3種url都會得到相同的結果(參考下圖)。

對應的 view

可以在 url object (或是 path object,兩者做的事情很類似),看到以下結論:

Django Admin

剛好在上面提到 Django Admin,相信大家在昨天的操作內容中有稍微和 chatbot 聊過天了,我們聊天的內容其實會被存在資料庫當中,而最快速可以看到資料庫內容的方式就是透握 Django Admin 的 GUI 介面看了。所以有興趣看看自己昨天和 chatbot 聊什麼的人可以跟著一起這樣做。

  • python manage.py createsuperuser
  • 設定帳號、信箱、密碼
  • python manage.py runserver
  • 開啟瀏覽器至 http://127.0.0.1:8000/admin
  • 輸入 superuser 的帳號密碼
  • 點選介面的 statements(參考下圖) 這樣就可以看到過去的聊天訊息了喔!
    https://ithelp.ithome.com.tw/upload/images/20200930/20130712NNoK3ygSgs.png

4 介紹 example_app/ views.py

之前在 DI_project 中我們在兩個自己開發的 app (i.e. demo_app 和 front_end)當中的 views.py 都只有用到 def based 的方式構成 view;而在現在 example/ views.py 中,則還有拉高一個層級,使用到了不同的 class 去構成 view,所以是屬於 class based 的 view

class ChatterBotAppView

在這裡簡單的就使用了一行帶過,原因是因為,它把大部分的邏輯處理寫進了 templates, static/js/ 內。

ChatterBotApiView

這邊的內容相較之下多了很多,不過主要就包含 def postdef get 兩個 HttpRequest 的邏輯處理。在這裡的內容大家應該不陌生,因為我們有一起使用過 Django Rest Framework 開發學派增刪改查的 API,所以對於收到 HttpRequest 以及利用 serialize 回傳 JSON 形式的資料也就都不陌生了。

5 介紹 example_app/ templates/

剛剛在第四部份提到 app.html 會處理相對多的邏輯,所以我們就先來看看 example_app/templates/app.html,我們看的到 html 文件的基本架構(最開始引入 css、中間是靜態的 html 內容、下方引入js的部分)。在這邊,除了 introduce 工具層級的 js 檔之外(見下方),

...
    <script src="{% static 'js/jquery.js' %}"></script>
    <script src="{% static 'js/js.cookie.js' %}"></script>
    <script src="{% static 'js/bootstrap.js' %}"></script>
...

另外,還有將 JavaScript 處理邏輯的部分放進 <script></script> 內部,我們在 DI_project/front_end 開發時,是將 JavaScript 處理邏輯的部分獨立出一個檔案,然後再 introduce 進 html 檔案裡面,和這邊不太一樣,不過兩種方式都可以行的通。

csfr token

其中關於 credential 的 csfr token,在這邊提供了第二種方式可以去避免在請求 server 時回傳 403 Forbidden 的訊息。

      var csrftoken = Cookies.get('csrftoken');

      function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
      }

      $.ajaxSetup({
        beforeSend: function(xhr, settings) {
          if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
          }
        }
      });

JQuery

在 templates/app.html 當中有引用 JQuery 的 Library,所以在 <script></script> 當中可以看到不少 $(".class_name") 的結構,在這邊如果是用.那後面就要接 class 的名字;之前是使用#,是因為後面接的是 id。

...
      var $chatlog = $('.js-chat-log');
      var $input = $('.js-text');
      var $sayButton = $('.js-say');
...

AJAX

最後我們也看到了 AJAX 的 POST Request,其中 AJAX 內部的結構相信大家也不陌生了。一個完整的 AJAX 需要包含 Request type、 Request url、POST 給 API 的 data 是什麼,而最後一個之前沒有提到的是 contentType,這個是用來告訴 API,我們傳給它的資料格式為何,在這邊就是 JSON 形式。

...
        var $submit = $.ajax({
          type: 'POST',
          url: chatterbotUrl,
          data: JSON.stringify(inputData),
          contentType: 'application/json'
        });
...

具備 python basic 的基礎、Django 開發的經驗後,相信各位隨著這篇文章的導讀,也能夠知道這整個 Django 專案是如何運作的了,大家可以再好好看看 app.html 其他 call function 的部分,這邊就不細講了。

6 邁向 AI 解夢大師 - 第十五天

我們今天一起看了 Django Chatterbot 專案內部結構以及所包含的程式碼內容,發現這個 Project 和之前我們開發的 DI_project 在概念上有些相似。當今天有一個在本地端網頁可以順利地的 run 起來服務之後,下一步會想要做的事情就是將服務分享給網路上的其他人使用。在明天,我們會和大家一起研究,要如何才能將服務放在網路上讓大家一起用了!

7 參考連結

想更深入認識 AI . FREE Team?

自由團隊 官方網站:https://aifreeblog.herokuapp.com/
自由團隊 Github:https://github.com/AI-FREE-Team/
自由團隊 粉絲專頁:https://www.facebook.com/AI.Free.Team/
自由團隊 IG:https://www.instagram.com/aifreeteam/
自由團隊 Youtube:https://www.youtube.com/channel/UCjw6Kuw3kwM_il39NTBJVTg/

文章同步發布於:自由團隊部落格
(想看更多文章?學習更多AI知識?敬請鎖定自由團隊的頻道!)


上一篇
【零基礎成為 AI 解夢大師秘笈】Day14 - Django Chatterbot I
下一篇
【零基礎成為 AI 解夢大師秘笈】Day16 - Ngrok
系列文
零基礎成為 AI 解夢大師秘笈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言