ติดตั้ง Stimulus บน Rails ก็แล้ว บน Sinatra ก็แล้ว ซึ่งทั้ง 2 ล้วนเป็นเว็บเฟรมเวิร์คในฝั่ง Ruby คราวนี้ถ้าต้องมาเจอโจทย์ที่จะต้องทำการกับเว็บเฟรมเวิร์คในฝั่ง Python อย่างเช่น Django กันบ้างหละ
สำหรับ Django ไม่ได้มีเครื่องมือจำพวก transpiler หรือ bundler ไฟล์ JavaScript อย่างเช่น Webpack, Rollup หรือ Parcel มาด้วย ดังนั้นทำให้เรามีอิสระในการเลือกใช้เครื่องมืออีกด้วย ซึ่งเราจะใช้ Rollup เช่นเดียวกันกับที่ใช้ในบทความ
- สร้าง django project
$ django-admin startproject starter_app
- สร้าง django app
$ ./manage startapp home
- ติดตั้ง Stimulus และ Rollup
yarn add --dev stimulus rollup @rollup/plugin-babel @rollup/plugin-node-resolve rollup-plugin-terser @babel/core @babel/preset-env @babel/plugin-proposal-class-properties
config ต่างๆ ที่เกี่ยวข้องก็ยกมาจากบทความที่แล้ว ไม่ว่าจะเป็น babel.config.json, rollup.config.js และ package.json
- สร้างโฟลเดอร์ frontend สำหรับเก็บโค้ด Stimulus
- แก้ไข config ของ rollup.config.js ให้ output ชี้ไปที่ `static/js`
- เมื่อสร้าง controller เสร็จเรียบร้อยก็คอมไพล์โค้ดผ่านคำสั่ง
$ npm run build
- โหลด JavaScript เข้าไปใน html ผ่าน script tag
<html>
<head>
<title>Starter App</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token }}">
<script src="{% static 'js/app.js' %}"></script>
</head>
...
</html>- เรียกใช้งาน controller
<h1>Welcome to Stimulus on Django</h1>
<div data-controller="hello">
<input data-hello-target="name" type="text">
<button data-action="click->hello#greet">Greet</button>
<span data-hello-target="output"></span>
</div>- ไหนๆ ก็ไหนๆ แล้วก็มาลอง post ข้อมูลไปยังหลังบ้านเพื่อเก็บข้อมูล heartbeat โดยจะส่ง heartbeat ไปหลังบ้านทุกๆ 10 วินาที
- เพิ่ม route และ controller สำหรับ request
# home/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('heartbeat', views.heartbeat, name='heartbeat'),
]# home/views.py
def heartbeat(request):
return JsonResponse({ 'status': 'ok' })- เพิ่มโค้ดสำหรับส่ง heartbeat ใน controller
// frontend/controllers/home_controller.js
...
connect () {
this.heartbeat()
}
disconnect () {
clearInterval(this.heartbeat)
}
heartbeat () {
const token = document.getElementsByName("csrf-token")[0].content
this.heartbeat = setInterval(async () => {
const response = await post('/heartbeat', {
headers: {
'X-CSRFToken': token
}
})
if (response.ok) {
console.log('sent heartbeat')
}
}, 10000)
}สังเกตเห็นได้ว่าเมื่อทำการ post ข้อมูล heartbeat ไปยังหลังบ้านจะต้องใส่ header X-CSRFToken ไปด้วย เพื่อป้องกัน
cross site request forgery
source
source
References