前兩天已經實作初步的API,讓我們可以取得店家的資料,今天要實作前後端分離的前端頁面。本次實作不會使用前端框架,而是使用原生JS語法和JQuery,來調整我們的介面。
一般來說會將前端的程式碼部署在另外一台機器上,並且使用前端框架(像是Vue、Angular、React等)來開發,可以加快速度。
因為筆者想使用目前的域名,因此本次專案會將前端程式碼跟Django 都放在一起,但是網頁不接受 Django 傳進來的任何資料,而是使用JS原生的 fetch
方法來存取API,取得資料後再更新畫面資訊。
系統結構大致如下圖。
前後端分離常會遇到所謂 CORS 的錯誤。API 一但開放之後,就會有各種安全性問題,可以參考下方文章解決。
JS Fetch 概念
JQuery 概念
調整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'),
]
在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完全切開來。
fetch API 出錯的話,可以點選F12 看是否有錯誤訊息,很容易會有路徑的問題。
CORS 解決方式參考
要注意網址列的問題,本地開發會使用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`
雖然使用比較土炮的方式,但終於完成了前後端分離,可以更加敏捷的開發新的功能,明天就要邁入最後一個階段了,讓我們繼續努力。
台南不需要米其林
- 專案網址
- 專案程式碼
- 專案文件與鐵人賽文章
- 參賽團隊 台南巷弄美食獵人