iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

台南不需要米其林系列 第 20

Day20 前後端分離最後一哩路 前端頁面實作

  • 分享至 

  • xImage
  •  

摘要

前兩天已經實作初步的API,讓我們可以取得店家的資料,今天要實作前後端分離的前端頁面。本次實作不會使用前端框架,而是使用原生JS語法和JQuery,來調整我們的介面。


概念說明

前後端概念

  • 前端指的是網頁瀏覽器端,給使用者看到的服務。
  • 後端指的是網站伺服器端,真正實作系統功能的地方,負責抓取資料、整理資料、邏輯運算等功能。

為何要前後端分離?

  1. 前後端分離的需求是因為,開發過程中,一旦後端邏輯資料調整更新,前端也需要因此改變。任意一端沒有完成時,我們並不知道實作的成果是否正確,因此無形中增加許多成本,這點在Django 上的模板機制完全展現。
  2. 前兩天也有提到,再次強調一下。
    前後端分離之後,透過API來交換資料,API會定義好前後端資料交換的格式與路徑,這樣一來後端邏輯增加時,可以單獨測試功能是否正確。前端也可以在準備好之後,再使用新製作的API。

前後端分離的方法


本日成果

Untitled

  1. 調整URL

    • 因為仍會藉由Django來提供前端的程式碼,只是不提供任何的資料,因此調整url.py如下。

      # food/urls.py
      def index(request):
          return render(request, 'food/index.html')
      
      def place_introduction(request,place_id:int):
          return render(request,'food/place_introduction.html')
      
      urlpatterns = [
          path('', index, name='food_index'),
          path('<int:place_id>/', place_introduction, name='food_introduction'),
      ]
      
  2. index.html最底部嵌入一段JS程式碼

    • 主要就是使用fetch取得資料後,再使用JQuery 的套件,將HTML程式碼嵌入到畫面中,這樣就能繪出我們的首頁。

      {% block custom_script %}
        <script>
            let place_url = `${API_ENDPOINT}/places`
            fetch(place_url)
                .then(response => response.json())
                .then(result => {
      // 這裡表示已經取得資料,須在這裡使用JQuery 繪製網頁
      })
      </script>
      {% endblock %}
      
    • 原本的Django url view template model 的 架構圖會變成下方的樣子,將template 和model完全切開來。

      Untitled

    • fetch API 出錯的話,可以點選F12 看是否有錯誤訊息,很容易會有路徑的問題。

    • CORS 解決方式參考

  3. 要注意網址列的問題,本地開發會使用127.0.0.1:8000,但是部署到伺服器上,網址就不同了,因此在使用到API、圖片的網址都需要特別注意。
    可以使用下方程式來抓到主機位址,這樣就使用同一套程式碼即可在本地與伺服器運行了。

    
    const API_HOST = window.location.protocol + "//" + window.location.host;
    const PATH = window.location.pathname
    const API_ENDPOINT = `${API_HOST}/api`
    

心得

雖然使用比較土炮的方式,但終於完成了前後端分離,可以更加敏捷的開發新的功能,明天就要邁入最後一個階段了,讓我們繼續努力。

參考資料

  1. CORS
  2. JS Fetch
  3. JQuery
  4. JavaScript 路徑

台南不需要米其林

  1. 專案網址
  2. 專案程式碼
  3. 專案文件與鐵人賽文章
  4. 參賽團隊 台南巷弄美食獵人


上一篇
Day19 Ninja API(2)-用API新增資料
下一篇
Day21 美味的終極目標
系列文
台南不需要米其林30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言