update split 4 part (เนื่องรวมในกระทู้เดียวจะยาวเกินไป)
Tutorial 1 : https://docs.djangoproject.com/en/2.0/intro/tutorial01/
- สร้าง project โดยการพิมพ์ django-admin startproject mysite
- สร้าง app polls ใน project
- ทดสอบเขียน function ใน views.py แบบง่ายๆ
เพื่อ response "Hello, world. You're at the polls index."
- เชื่อม url โดยไปตั้งค่าใน urls.py ที่สร้างขึ้น
- ทดสอบ runserver แล้วเข้า polls app. ใน browser
Tutorial 2 : https://docs.djangoproject.com/en/2.0/intro/tutorial02/
Database setup
Django generate script ออกมาชุดหนึ่ง เรียกว่า Migration File ไว้ใช้สำหรับการสร้างฐานข้อมูลจริง ประโยชน์ของ Migration File ทีสร้างขึ้นมานี้เพื่อให้ Django Application สามารถ track การเปลี่ยนแปลงของฐานข้อมูลได้ตลอดเวลาที่มีการเปลี่ยนแปลง models.py ซึ่ง Django สามารถเปลี่ยน schema ของฐานข้อมูลไปมาได้ หรือจะย้อนกลับไปใช้ schema เก่าได้อย่างง่ายดาย
จาก project ที่เราสร้างขึ้นจะไม่มี database เก็บข้อมูลพื้นฐานเช่น admin username permission เราจึีงต้องสร้างขึ้นมาก่อน
ขั้นต่อมาสร้าง models.py เพื่อกำหนด set ค่าต่างๆเป็นภาษา python ก่อนนำไปสร้าง table ใน database
แล้วจึงตั้งค่าให้ django รู้จัก app polls ของเราให้เราสามารถใช้บริการ database ของ django ได้
ทำการสร้าง migration file เพื่อ track การเปลี่ยนแปลงของฐานข้อมูล
ทำการสร้าง table เป็น SQL
(SQL มาจากคำว่า Structured Query Language เป็นภาษามาตรฐานในการเข้าถึง ฐานข้อมูล เราสามารถใช้งานภาษาSQL ได้จากโปรแกรมต่างๆ ที่ต้องทำการกับระบบฐานข้อมูล เช่น ใช้ SQL ในการทำการดึงข้อมูล (Retrieve Data) จากฐานข้อมูล และมันเป็นมาตรฐานกลางที่ใช้ในระบบฐานข้อมูลต่างๆ โดยเป็นมาตรฐานของ ANSI
ข้อมูลจาก : http://www.9experttraining.com/articles/%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2-sql-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3 )
และทำการ migrate สร้าง database
ทดสอบ Playing with the API โดยใช้ python shell
ตามใน tutorial ด้วยคำสั่งพื้นฐานเช่น สร้างคำถาม "What's up" ลบคำถาม import เวลา วันที่ โดยการพิมพ์สั่งได้ผ่าน terminal ได้เลย
ทดสอบสร้าง admin user
ทดสอบเข้าไปที่ localhost:8000/admin มี ui ดังนี้
เมื่อทำการใส่ admin username password จะมี ui ให้จัดการ database แบบง่ายๆ แต่ยังไม่มี database ของ app polls ของเราขึ้นมาให้ทำการจัดการ
เราจึงต้องเพิ่ม app polls ของเราให้สามารถจัดการได้ใน admin.py ใน app polls ซึ่งใน tutorial import แค่ question ถ้าเราต้องการ import choice ด้วยก็สามารถทำได้
เมื่อ import เสร็จจะมี ui ใช้จัดการ question ใน localhost:8000/admin
Tutorial 3 : https://docs.djangoproject.com/en/2.0/intro/tutorial03/
ต่อมาทำการเพิ่มฟังก์ชันใน view โดยประกอบไปด้วย
- index : หน้าหลัก(เหมือนใน tutorail01)
- detail : แสดงลายละเอียดของแต่ละโพล (โดย response โชว์ "You're looking at question %s"(sting) question_id ของโพลนั้นๆ)
- results : แสดงผลของโพลนั้นๆว่ามีกี่โหวต แต่ในขั้นตอนนี้ยัง response โชว์ "You're looking at results of question %s"(sting) question_id ของโพลนั้นๆ
- vote : ฟังก์ชันโหวตใน app polls แต่ในขั้นตอนนี้ยัง response โชว์ "You're voting on question %s"(sting) question_id ของโพลนั้นๆ
ต่อมาเพิ่ม path ของแต่ละ function ที่เพิ่มใน views.py ใน urls.py
- index : ใช้ path เช่นเดิม
- detail : ใช้ path ตาม question_id
- results : ใช้ path ตาม question_id ต่อด้วย "/results/"
- vote : ใช้ path ตาม question_id ต่อด้วย "/vote/"
โดยถ้าใช้เป็นคำสั่ง repath() หรือ url() จะด้องใช้ regular expression ของ django
Regular expression : การกำหนดรูปแบบหรือกลุ่มคำ เพื่อเอาไว้ใช้ค้นหาข้อความต่างๆตามที่เราต้องการ สามารถค้นหาได้ทั้งอักขระธรรมดา หรือค้นหาความข้อที่กำหนดไว้
( ข้อมูลจาก : https://www.webforefront.com/django/regexpdjangourls.html )
แต่ใน tutorial03 ใช้ path โดยกำหนดแบบง่ายๆว่าเป็น question_id ซึ่งเป็น integer
เมื่อทดสอบตาม urls ที่กำหนด
ต่อมาทำการแก้ index ใน views.py เพื่อแสดงคำถามต่างๆเรียงตามวันที่ 5 อันล่าสุด โดยข้างล่างเป็นตัวอย่างการแสดงผลแต่เพิ่มไปเพียงคำถามเดียวจึงแสดงแต่คำถามเดียวคือ "What's up?"
ต่อมาเพิ่ม function ที่จงใจให้เกิด error ลงไปใน views.py โดย
- testError1 : โชว์ error page not found
- testError2 : โชว์ status 201
( ข้อมูลจาก : https://httpstatuses.com/201 )
เนื่อง function index() ใน views.py ใช้ hard code ทำให้ยากต่อการพัฒนา จึงทำการ สร้าง template
โดย django จะหา จาก ใน TEMPLATES ข้างใน settings.py โดย default จะ track ตาม folder template ที่อยู่ใน app ที่เจอใน INSTALLED_APPS ใน settings.py
และทำการสร้าง folder polls และ file index.html เพื่อช่วยในการแสดงผลโดยวน "{% ... %}" เพื่อใช้ python ใน html โดยวนลูปโชว์ question ในตัวแปร latest_question_list ที่กำหนดไว้ใน views.py โดยแต่ละ question link ไปที่หน้า detail ของ question นั้นๆ ถ้าไม่มีคำถามจะแสดง "No polls are available."
polls/templates/polls/index.html
ทำการแก้ฟังก์ชัน index() ใน views.py ให้สอดคล้องกับ template index.html ที่เราสร้างโดยให้เรียกใช้ template ที่เราสร้าง และ กำหนดตัวแปร latest_question_list เป็น question ล่าสุดเรียงตามวันที่ 5 question
ทดสอบ runserver และเข้าหน้า index จะได้ตรงตามที่เรากำหนดไว้ข้างต้น
ต่อมาเพิ่ม function detail() ใน views.py โชว์รายละเอียดใน question แต่ในขั้นต้นโชว์แค่เพียงคำถามถ้าไม่เจอคำถาม(ไม่มี question_id นั้นถูกสร้างขึ้น) จะโชว์ 404 page not found
(และสร้าง template ของ detail (detail.html) ด้วยเช่นกัน)
ต่อมาทำการแก้ทั้ง template และ function ของ detail ใน detail.html และ views.py ตามลำดับ โดยจะแสดงผล question และ choice ใน question นั้นๆ
ต่อมาทำใส่ชื่อ app_name ใน urls.py เพื่อให้ง่ายต่อการเรียกใช้ใน template
จากเดิม
เป็นดังนี้ เพื่อให้มีความ specific มากขึ้นจะได้ไม่สับสนเมิื่อมีหลาย app
Tutorial 4 : https://docs.djangoproject.com/en/2.0/intro/tutorial04/
update template detail.html โดยใช้ html forms ให้ choice ใน question เป็น vote ไปที่ choice นั้น โดยเลือก choice แล้วกดปุ่ม submit จะใช้ function vote ไปที่ choice นั้นๆ
ส่วน csrf : Cross-Site Request Forgery คือ
การโจมตีแบบ CSRF จะใช้ “ตัวตน (Identity)” และ “สิทธิ์ (Privilege)” ของเหยื่อที่มีบนเว็บไซต์ ในการปลอมตัวเป็นเหยื่อและกระทำการหรือธุรกรรมไม่พึงประสงค์ แฮ็คเกอร์จะพยายามใช้ประโยชน์จากเหยื่อที่มี Login Cookies เก็บไว้ในเว็บเบราเซอร์ ส่งผลให้เว็บไซต์ E-commerce ที่ส่ง Cookie ไปเก็บข้อมูลการพิสูจน์ตัวตนของผู้ใช้มักตกเป็นเป้าหมายของการโจมตีนี้
การโจมตีแบบนี้ตรวจจับได้ยากเนื่องจากเป็นการกระทำธุรกรรมปกติในนามของเหยื่อเอง ทั้งข้อมูลการพิสูจน์ตัวตนและ IP ต่างถูกนำมาใช้เพื่อยืนยันว่าเป็นเจ้าของบัญชีทำธุรกรรมจริง ส่งผลให้ทางธนาคารต้องใช้เวลานานในการเก็บข้อมูลและสืบสวน ก่อนที่จะดำเนินเรื่องย้อนหลังการทำธุรกรรม หรือทำให้ธุรกรรมเป็นโมฆะไป
( ข้อมูลจาก : https://www.techtalkthai.com/how-to-prevent-csrf/ )
( ข้อมูลจาก : https://www.techtalkthai.com/how-to-prevent-csrf/ )
แล้วจากนั้น update vote() ใน views.py ถ้าไม่เลือก choice ใน detail จะแสดง "You didn't select a choice" แล้วถ้าเลือกแล้วจะเพิ่มค่าตัวแปรนับจำนวน vote ของ choice นั้นขึ้นอีก 1
(choice.votes += 1) แล้วจึง render หน้า results.html
เมื่อทดสอบ runserver แล้วเข้าหน้า detail ของ คำถามแรกจะแสดงดังนี้
ต่อมาทำการ update function results() ใน views.py และสร้าง template results.html ให้ตัวแปร question เก็บ question หรือถ้าไม่มี question นั้นๆจะแสดง error404 แล้ว render หน้า results ของ question นั้นๆว่ามีกี่ votes ในแต่ละ choice
เมื่อทดสอบ runserver แล้วเข้าหน้า detail ของคำถามแรก เลือก "The sky" จะแสดงหน้า results ซึ่งมีผลดังนี้
Use generic views : Less code is better
1. Convert the URLconf.
2. Delete some of the old, unneeded views.
3. Introduce new views based on Django’s generic views.
1.ทำการแก้ urls.py ของเราให้กระชับขึ้น
- index : แก้ให้เรียกตามคลาสที่เรากำลังจะไปแก้ใน views.py จาก function index() เป็น class IndexView()
- detail : ในเหตุคล้าย index แต่แก้ path เป็น pk (primary key) แทน question_id
- results : ในเหตุคล้าย index แต่แก้ path เป็น pk (primary key) แทน question_id
- votes : ใช้ function ตามเดิม
ต่อมาปรับ views.py ให้ใช้ class แทน function ใน index(เงื่อนไขเดิมโชว์คำถาม 5 คำถามล่าสุดตามวันที่) , detail และ results
ไม่มีความคิดเห็น:
แสดงความคิดเห็น