แบบฝึกหัดนี้มีไว้สำหรับคุณที่จะทำความคุ้นเคยกับการเขียนโปรแกรมด้านแบ็คเอนด์/เซิร์ฟเวอร์ขั้นพื้นฐานในวิธีการโต้ตอบรวมถึงคุณที่จะพัฒนาอย่างสะดวกสบายในสภาพแวดล้อม Python/Flask ที่ทันสมัย
การอ่านต่อไปนี้จะช่วยให้คุณรู้สึกถึงภาพรวมเมื่อพูดถึงการพัฒนารหัสด้าน APIs/การเขียนเซิร์ฟเวอร์และวิธีการที่เหมาะสมในบริบทของแอปพลิเคชันเว็บขนาดใหญ่:
โครงการนี้จะแบ่งออกเป็นหลายส่วน หลังจากเสร็จสิ้นโครงการนี้คุณต้องส่งโดยทำตามคำแนะนำด้านล่าง
แบบฝึกหัดนี้จะครบกำหนดก่อนวันจันทร์ที่ 17 กันยายนเวลา 23.59 น. หากคุณใช้เวลาทั้งหมด 10 ชั่วโมงรวมถึงงานของคุณกับ React-Exquise ให้ส่งสิ่งที่คุณมี!
สำหรับคำถามใด ๆ อย่าลังเลที่จะส่งอีเมล [email protected]
คำแนะนำการติดตั้งสำหรับ Mac และ Windows
อีกแหล่งข้อมูลที่ยอดเยี่ยมสำหรับทุกสิ่งใน Python รวมถึงการติดตั้งคือคู่มือ Hitchhiker to Python
ตรวจสอบว่าคุณมีเวอร์ชันที่ถูกต้องหรือไม่โดยเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:
python3 -V
pip3 -V
pipenv --version
ก่อนอื่นส้อมที่เก็บนี้ ปุ่มส้อมที่ด้านบนขวาของคุณ สิ่งนี้คือสำเนาที่เก็บนี้ไปยังบัญชีของคุณ ตอนนี้คุณควรมีที่เก็บที่มีชื่อ <yourusername>/flask-exercise
มันควรจะเป็นแบบนี้ (ชื่อผู้ใช้ของฉันคือ TKO22): 
จากนั้นโคลนพื้นที่เก็บข้อมูลนี้ (คลิกปุ่มสีเขียวโดยบอกว่า "โคลนหรือดาวน์โหลด" เลือก http และคัดลอกและวางที่ตำแหน่ง <url> ) และเข้าไปในนั้น:
$ git clone <url>
$ cd flask-exercise
จากนั้นตั้งค่าสภาพแวดล้อมเสมือนจริงของคุณและติดตั้งการพึ่งพา Python ที่จำเป็นในการเรียกใช้แอพนี้ เราใช้ pipenv ซึ่งตั้งค่าทุกอย่างโดยอัตโนมัติโดยได้รับ pipfile และ pipfile.lock โดยอัตโนมัติ PipFile ใช้ VirtualEnV ซึ่งเป็นสภาพแวดล้อม Python เสมือนจริงที่แยกได้จากโครงการ Python อื่น ๆ ไม่สามารถแทรกแซงหรือได้รับผลกระทบจากโปรแกรม Python อื่น ๆ ในเครื่องเดียวกัน ดังนั้นคุณจึงสามารถใช้แพ็คเกจเดียวกันหรือแม้แต่รุ่น Python ที่แตกต่างกัน
pipenv install --skip-lock
คุณต้องอยู่ในสภาพแวดล้อมเสมือนจริงนี้เพื่อเริ่มเซิร์ฟเวอร์นี้ ที่จะทำเช่นนั้น:
pipenv shell
จากนั้นเพื่อเริ่มต้นเซิร์ฟเวอร์รัน:
(backend-exercise-o4dc6oDL)$ python app.py
หมายเหตุ: สิ่งนี้จะยังคงเป็นกระบวนการที่ทำงานอยู่ในเทอร์มินัลของคุณดังนั้นคุณจะต้องเปิดแท็บหรือหน้าต่างใหม่เพื่อเรียกใช้คำสั่งอื่น ๆ
หากต้องการหยุดเซิร์ฟเวอร์กด Control-C
เพื่อออกจากสภาพแวดล้อมเสมือนจริงของคุณซึ่งได้รับการ backend-exercise-[something here] นาม
(backend-exercise-o4dc6oDL)$ deactivate
นอกจากนี้คุณยังสามารถเพิ่ม pipenv run ก่อนคำสั่งใด ๆ แทนที่จะต้องเรียกใช้ pipenv shell เช่น pipenv run python app.py
ก่อนที่คุณจะทำการเปลี่ยนแปลงรหัสใด ๆ ตรวจสอบให้แน่ใจว่าได้สร้างสาขาใหม่ โดยทั่วไปสาขาจะมีชื่อตามคุณสมบัติหรือ Fix ที่ได้รับการแก้ไข แต่สำหรับโครงการนี้ตั้งชื่อสาขาของคุณด้วยชื่อของคุณเองเพื่อให้ผู้ตรวจสอบของคุณสามารถติดตามได้อย่างง่ายดาย:
git checkout -b <YOUR_NAME>
ชื่อสาขาควรเป็นตัวพิมพ์เล็กทั้งหมดและไม่มีช่องว่าง แทนที่จะใช้ช่องว่างให้ใช้ยัติภังค์ ตัวอย่างเช่น:
git checkout -b varun-munjeti
การเริ่มต้นเซิร์ฟเวอร์จะทำให้กระบวนการทำงานอย่างต่อเนื่องบน localhost:5000 ในการร้องขอไปยังเซิร์ฟเวอร์ของคุณให้ใช้บุรุษไปรษณีย์
ก่อนอื่นให้ขอ GET ไปยัง / จุดสิ้นสุด เนื่องจากเซิร์ฟเวอร์ทำงานบน localhost:5000 URL ปลายทางเต็มรูปแบบจึงเป็น localhost:5000/

ลองโทรหา /mirror ก่อนอื่นให้ดูที่รหัสสำหรับจุดสิ้นสุดเพื่อดูว่าคุณสามารถระบุพารามิเตอร์ URL ได้อย่างไร จากนั้นทำการร้องขอเกี่ยวกับ Postman to localhost:5000/mirror/<name> ::

แบบฝึกหัดเหล่านี้จะนำคุณไปสู่การสร้าง API ที่พักผ่อนโดยใช้ Flask! เราไม่ต้องการให้คุณผ่านความยุ่งยากทั้งหมดของการตั้งค่าอินสแตนซ์ฐานข้อมูลดังนั้นเราจึงได้สร้างข้อมูลจำลองและอินเทอร์เฟซฐานข้อมูลจำลองเพื่อโต้ตอบกับมัน เพื่อความสะดวกทั้งแอพลอจิกลบด้วยตรรกะ MockDB จะนำไปใช้ใน app.py สำหรับโครงการขนาดใหญ่จุดสิ้นสุด API มักจะถูกแยกออกเป็นไฟล์ต่าง ๆ ที่เรียกว่า views
ก่อนที่คุณจะเริ่มดูฟังก์ชั่น create_response และวิธีการทำงาน ตรวจสอบให้แน่ใจว่าคุณปฏิบัติตามแนวทางสำหรับวิธีการใช้ฟังก์ชั่นนี้มิฉะนั้น API ของคุณจะไม่ปฏิบัติตามอนุสัญญาที่เหมาะสม!
ลองดูฐานข้อมูลจำลอง ข้อมูลดัมมี่เริ่มต้นถูกกำหนดไว้ใน mockdb/dummy_data.py นี่คือสิ่งที่ "มีอยู่" ใน "ฐานข้อมูล" เมื่อคุณเริ่มเซิร์ฟเวอร์
ฟังก์ชั่นที่กำหนดไว้ใน mockdb/mockdb_interface.py เป็นวิธีที่คุณสามารถสอบถาม mockdb ได้ ใน app.py ที่คุณจะเขียน API ของคุณสิ่งนี้ถูกนำเข้าด้วยชื่อ db ดังนั้นเมื่อคุณเขียนโค้ดสำหรับจุดสิ้นสุดของคุณคุณสามารถเรียกฟังก์ชั่นอินเตอร์เฟส DB เช่น db.get('users')
เมื่อคุณแก้ไขรหัสของคุณเซิร์ฟเวอร์จะอัปเดตโดยอัตโนมัติ เว้นแต่ว่า รหัสของคุณจะไม่รวบรวมซึ่งในกรณีนี้เซิร์ฟเวอร์จะหยุดทำงานและคุณต้องรีสตาร์ทด้วยตนเองหลังจากแก้ไขรหัสของคุณ
กำหนดจุดสิ้นสุด:
GET /users
สิ่งนี้ควรส่งคืนการตอบสนอง JSON ที่จัดรูปแบบอย่างถูกต้องซึ่งมีรายการของ user ทั้งหมดใน MockDB หากคุณเรียกจุดสิ้นสุดนี้ทันทีหลังจากเริ่มเซิร์ฟเวอร์คุณควรได้รับการตอบกลับนี้ใน Postman:
{
"code": 200,
"message": "",
"result": {
"users": [
{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
},
{
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
},
{
"age": 23,
"id": 3,
"name": "Varun",
"team": "NNB"
},
{
"age": 24,
"id": 4,
"name": "Alex",
"team": "C2TC"
}
]
},
"success": true
}
กำหนดจุดสิ้นสุด:
GET /users/<id>
สิ่งนี้ควรเรียกคืนผู้ใช้รายเดียวที่มี id ที่ได้รับจากคำขอ
หากไม่มีผู้ใช้ที่มี id ที่ให้ไว้ให้ส่งคืน 404 ด้วย message เชิงพรรณนา
ขยายส่วนแรก /users โดยเพิ่มความสามารถในการสอบถามผู้ใช้ตามทีมที่พวกเขาเปิดอยู่ คุณ ไม่ ควรใช้พารามิเตอร์ URL เหมือนที่คุณทำในส่วนที่ 2 แทนใช้สตริงแบบสอบถาม
หาก team ถูกจัดเตรียมไว้เป็นพารามิเตอร์สตริงแบบสอบถามให้ส่งคืนผู้ใช้ที่อยู่ในทีมนั้นเท่านั้น หากไม่มีผู้ใช้ใน team ที่ให้ไว้ให้ส่งคืนรายการที่ว่างเปล่า
สำหรับแบบฝึกหัดนี้คุณสามารถเพิกเฉยต่อพารามิเตอร์สตริงแบบสอบถามอื่น ๆ นอกเหนือจาก team
ในบุรุษไปรษณีย์คุณสามารถจัดหาพารามิเตอร์สตริงแบบสอบถามที่เขียนสตริงการสืบค้นลงใน URL คำขอของคุณหรือกดปุ่ม Params ถัดจาก Send การทำเช่นนี้จะเติม URL ตามคำขอโดยอัตโนมัติ
ควรเกิดขึ้นต่อไปนี้
GET /users?team=LWB
{
"code": 200,
"message": "",
"result": {
"users": [{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
}, {
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
}]
},
"success": true
}

กำหนดจุดสิ้นสุด:
POST /users
จุดสิ้นสุดนี้ควรสร้างผู้ใช้ใหม่ แต่ละคำขอควรส่ง name age และพารามิเตอร์ team ใน body ของคำขอ คุณสมบัติ id จะถูกสร้างขึ้นโดยอัตโนมัติใน MockDB
คำขอที่ประสบความสำเร็จควรส่งคืนรหัสสถานะของ 201 และส่งคืนผู้ใช้ที่สร้างขึ้นใหม่
หากไม่มีการจัดเตรียมพารามิเตอร์ใด ๆ ในสามตัวอย่าสร้างผู้ใช้ใหม่ใน DB และส่งคืน 422 ด้วย message ที่มีประโยชน์ โดยทั่วไปข้อความของคุณควรให้ข้อเสนอแนะที่เป็นประโยชน์แก่ผู้ใช้/นักพัฒนาเกี่ยวกับสิ่งที่พวกเขาทำผิดและวิธีที่พวกเขาสามารถแก้ไขได้
นี่คือวิธีที่คุณสามารถส่งพารามิเตอร์ body จากบุรุษไปรษณีย์ ตรวจสอบให้แน่ใจว่าคุณไม่เข้าใจผิดสำหรับพารามิเตอร์การสืบค้น! 
กำหนดจุดสิ้นสุด:
PUT /users/<id>
ที่นี่เราจำเป็นต้องให้ id ของผู้ใช้เนื่องจากเราจำเป็นต้องระบุผู้ใช้ที่จะอัปเดต body สำหรับคำขอนี้ควรมีแอตทริบิวต์เดียวกับคำขอ POST จากส่วนที่ 4
อย่างไรก็ตามความแตกต่างของคำขอ PUT นี้คือเฉพาะค่าที่มีคีย์ที่ให้ไว้ ( name age team ) จะได้รับการปรับปรุงและพารามิเตอร์ใด ๆ ที่ไม่ได้ให้ไว้จะไม่เปลี่ยนแอตทริบิวต์ที่เกี่ยวข้องในผู้ใช้ที่ได้รับการอัปเดต
คุณไม่จำเป็นต้องคำนึงถึงพารามิเตอร์ body หากไม่ใช่ name age หรือ team
หากไม่พบผู้ใช้ที่มี id ที่ให้ไว้ให้ส่งคืน 404 และ message ที่มีประโยชน์
กำหนดจุดสิ้นสุด:
DELETE /users/<id>
สิ่งนี้จะลบผู้ใช้ด้วย id ที่เกี่ยวข้อง ส่งคืน message ที่มีประโยชน์แม้ว่าจะไม่จำเป็นต้องระบุไว้ใน result ของการตอบกลับ
หากไม่พบผู้ใช้ที่มี id ที่ให้ไว้ให้ส่งคืน 404 และ message ที่มีประโยชน์
มาเขียนการทดสอบหน่วยกันเถอะ! การทดสอบหน่วยมีความสำคัญอย่างยิ่งต่อการพัฒนาซอฟต์แวร์ ช่วยให้สามารถตรวจสอบได้โดยอัตโนมัติว่าฟังก์ชั่นของเราใช้งานได้หรือไม่เนื่องจากการทดสอบด้วยตนเองทุกอย่างช้ามากและเกิดข้อผิดพลาด การทดสอบการพัฒนาที่ขับเคลื่อนด้วยการพัฒนาเป็นกระบวนการพัฒนาซอฟต์แวร์ที่เรากำหนดข้อกำหนดการทดสอบการทดสอบไปยังข้อมูลจำเพาะนั้นจากนั้นใช้ฟังก์ชันการทำงานและใช้การทดสอบเพื่อตรวจสอบว่ามันทำงานได้หรือไม่ เราได้ทำสิ่งนั้นเล็กน้อยสำหรับคุณเมื่อมีการทดสอบส่วนที่ 1-3 เพื่อทดสอบพวกเขา:
pipenv install --dev
pipenv run pytest
หากการเปลี่ยนแปลงของคุณใช้งานได้คุณควรเห็นเส้นสีเขียวที่บอกว่า 5 passed หากพวกเขาไม่ทำตามร่องรอยสแต็กและแก้ไขการใช้งานของคุณ เมื่อพวกเขาทำงานให้เขียนการทดสอบสำหรับชิ้นส่วน 3-6
เราใช้ PyTest ซึ่งเป็นกรอบทดสอบ Python ที่มีประโยชน์ที่ค้นหาและใช้วิธี Python โดยอัตโนมัติที่เริ่มต้นด้วย test เช่น test_get_index ในกรณีของเราเรามีไฟล์ทดสอบชื่อ test_app.py ซึ่งถือการทดสอบทั้งหมดสำหรับชิ้นส่วน 1-3
แต่ละวิธียังยอมรับวัตถุ client ซึ่งถูกฉีดโดยอัตโนมัติโดย pytest client เป็นอุปกรณ์ทดสอบซึ่งเป็นสิ่งที่คุณอาจใช้ในการทดสอบหลายครั้งให้พื้นฐานคงที่สำหรับการทดสอบของคุณ เมื่อเริ่มต้น Pytest จะมองเข้าไปใน conftest.py และรวบรวมการติดตั้งทั้งหมด ในกรณีของเราเรามีการติดตั้ง client ซึ่งให้ไคลเอนต์ทดสอบขวดซึ่งเราสามารถใช้เพื่อทดสอบ API ของเราได้อย่างง่ายดาย ดูว่าคุณสามารถใช้ไคลเอนต์ทดสอบขวดเพื่อทำคำขอประเภทอื่นได้อย่างไรและวิธีที่คุณสามารถใช้คำขอของคำขอได้อย่างไร
เมื่อคุณทำตามขั้นตอนทั้งหมดให้ผลักดันการเปลี่ยนแปลงของคุณไปยัง GitHub Repo ของคุณ!
มาเรียกใช้ Black, Python Formatter ก่อนที่คุณจะส่ง สิ่งนี้จะลบข้อโต้แย้งทั้งหมดเกี่ยวกับวิธีที่เราต้องการจัดสไตล์รหัส Python ของคุณและให้ผู้ตรวจสอบมีสไตล์ที่ได้มาตรฐานในการตรวจสอบ คุณต้องติดตั้งด้วย pipenv install --dev
pipenv run black .
ก่อนที่คุณจะสามารถส่ง PR คุณจะต้องผลักดันสาขาของคุณไปยังสาขาระยะไกล (อันที่อยู่ใน GitHub ไม่ใช่ท้องถิ่น)
ตรวจสอบว่าคุณอยู่ในสาขาของคุณ:
git branch
หากคุณต้องการให้แน่ใจว่าการกระทำทั้งหมดของคุณอยู่ใน:
git log
กด Q เพื่อออกจากหน้าจอ git log
ผลักดันการกระทำของคุณไปยังสาขาระยะไกลของคุณ:
git push
ครั้งแรกที่คุณทำสิ่งนี้คุณอาจได้รับข้อผิดพลาดเนื่องจากยังไม่มีสาขาระยะไกลของคุณ โดยปกติจะบอกคำสั่งที่ถูกต้องที่จะใช้:
git push --set-upstream origin <YOUR_BRANCH_NAME>
หมายเหตุ: สิ่งนี้จะต้องทำในครั้งแรกที่คุณผลักดันสาขาใหม่ คุณสามารถใช้เพียงแค่ git push หลังจากนั้น
เมื่อทำเสร็จแล้วโปรดส่งอีเมลไปที่ [email protected] พร้อมลิงค์ไปยังที่เก็บ ข้อมูล และชื่อสาขาของคุณ เราจะต้องมีสองสิ่งนี้เพื่อดูการส่งของคุณ