Latihan ini dimaksudkan bagi Anda untuk terbiasa dengan pemrograman sisi backend/server fundamental dengan cara interaktif, serta bagi Anda untuk merasa nyaman berkembang di lingkungan Python/Flask modern.
Membaca berikut ini akan membantu Anda memahami gambaran besar ketika datang untuk mengembangkan kode sisi API/menulis server, dan bagaimana hal itu cocok dalam konteks aplikasi web yang lebih besar:
Proyek ini akan dipecah menjadi beberapa bagian. Setelah Anda menyelesaikan proyek ini, Anda harus mengirimkannya dengan mengikuti instruksi di bawah ini.
Latihan ini akan jatuh tempo sebelum hari Senin ini, 17 September pukul 11:59 malam. Jika Anda telah menghabiskan lebih dari 10 jam total termasuk pekerjaan Anda dengan reaksi-latihan, kirimkan apa yang Anda miliki!
Untuk pertanyaan apa pun, jangan ragu untuk mengirim email ke [email protected].
Instruksi Instalasi untuk Mac dan Windows.
Sumber daya hebat lainnya untuk apa pun di Python, termasuk instalasi adalah Panduan Hitchhiker untuk Python.
Periksa apakah Anda memiliki versi yang benar dengan menjalankan perintah berikut di terminal Anda:
python3 -V
pip3 -V
pipenv --version
Pertama, garpu repositori ini. Tombol garpu di kanan atas Anda. Apa yang dilakukannya adalah menyalin repositori ini ke akun Anda. Sekarang Anda harus memiliki repositori dengan nama <yourusername>/flask-exercise .
Seharusnya terlihat seperti ini (nama pengguna saya TKO22): 
Kemudian, klon repositori ini (klik tombol hijau yang mengatakan "klon atau unduh", pilih http, dan salin dan tempel lokasi <url> ) dan masuk ke dalamnya:
$ git clone <url>
$ cd flask-exercise
Kemudian, siapkan lingkungan virtual Anda dan instal dependensi Python yang diperlukan untuk menjalankan aplikasi ini. Kami menggunakan Pipenv, yang secara otomatis mengatur semuanya, diberi pipfile dan pipfile.lock. Pipfile menggunakan VirtualEnv, yang merupakan lingkungan Python virtual yang diisolasi dari proyek Python lainnya, tidak mampu mengganggu atau dipengaruhi oleh program Python lainnya pada mesin yang sama. Dengan demikian, Anda mampu menjalankan versi yang berbeda dari paket yang sama atau bahkan versi Python yang berbeda.
pipenv install --skip-lock
Anda harus berada di lingkungan virtual ini untuk memulai server ini. Untuk melakukan itu:
pipenv shell
Kemudian, untuk memulai menjalankan server:
(backend-exercise-o4dc6oDL)$ python app.py
Catatan: Ini akan tetap menjadi proses yang berjalan di terminal Anda, jadi Anda harus membuka tab atau jendela baru untuk menjalankan perintah lain.
Untuk menghentikan server, tekan Control-C .
Untuk keluar dari lingkungan virtual Anda, yang dinamai backend-exercise-[something here] , jalankan:
(backend-exercise-o4dc6oDL)$ deactivate
Anda juga dapat menambahkan pipenv run sebelum perintah apa pun daripada harus menjalankan pipenv shell . misalnya pipenv run python app.py
Sebelum Anda melakukan perubahan pada kode, pastikan untuk membuat cabang baru. Biasanya cabang dinamai berdasarkan fitur atau perbaikan bug yang ditangani, tetapi untuk proyek ini, beri nama cabang Anda dengan nama Anda sendiri sehingga pengulas Anda dapat dengan mudah mengikuti:
git checkout -b <YOUR_NAME>
Nama cabang harus semuanya huruf kecil dan tidak dapat berisi spasi. Alih -alih spasi, gunakan tanda hubung. Misalnya:
git checkout -b varun-munjeti
Memulai server akan menjadikannya proses yang terus berjalan di localhost:5000 . Untuk membuat permintaan ke server Anda, gunakan tukang pos.
Pertama, buat permintaan GET ke / akhir. Karena server berjalan di localhost:5000 , URL titik akhir penuh adalah localhost:5000/ .

Coba panggil /mirror titik akhir. Pertama, lihat kode untuk titik akhir untuk melihat bagaimana Anda dapat menentukan parameter URL. Kemudian buat permintaan pada tukang pos ke localhost:5000/mirror/<name> :

Latihan -latihan ini akan memandu Anda dengan membuat API yang tenang menggunakan Flask! Kami tidak ingin Anda mengalami semua kerumitan pengaturan instance database, jadi kami telah membuat data dummy dan antarmuka basis data mock untuk berinteraksi dengannya. Demi kemudahan, seluruh logika aplikasi dikurangi logika mockdb dengan diterapkan di app.py Untuk proyek yang lebih besar, titik akhir API biasanya akan dipisahkan menjadi berbagai file yang disebut views .
Sebelum Anda mulai, perhatikan baik -baik fungsi create_response dan cara kerjanya. Pastikan Anda mengikuti pedoman untuk menggunakan fungsi ini, jika tidak, API Anda tidak akan mengikuti konvensi yang tepat!
Juga perhatikan di database mock. Data boneka awal didefinisikan dalam mockdb/dummy_data.py . Inilah yang akan "ada" di "database" saat Anda memulai server.
Fungsi yang didefinisikan dalam mockdb/mockdb_interface.py adalah cara Anda dapat menanyakan mockdb. Di app.py , di mana Anda akan menulis API Anda, ini telah diimpor dengan nama db . Oleh karena itu ketika Anda menulis kode untuk titik akhir Anda, Anda dapat menghubungi fungsi antarmuka DB seperti db.get('users') .
Saat Anda memodifikasi kode Anda, server akan secara otomatis memperbarui, kecuali kode Anda tidak dikompilasi, dalam hal ini server akan berhenti berjalan dan Anda harus me -restart secara manual setelah memperbaiki kode Anda.
Tentukan titik akhir:
GET /users
Ini harus mengembalikan respons JSON yang diformat dengan benar yang berisi daftar semua user di mockdb. Jika Anda memanggil titik akhir ini segera setelah memulai server, Anda harus mendapatkan respons ini di 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
}
Tentukan titik akhir:
GET /users/<id>
Ini harus mengambil satu pengguna tunggal yang memiliki id yang disediakan dari permintaan.
Jika tidak ada pengguna dengan id yang disediakan, kembalikan 404 dengan message deskriptif.
Perpanjang enpoint /users pertama dengan menambahkan kemampuan untuk meminta pengguna berdasarkan tim tempat mereka berada. Anda tidak boleh menggunakan parameter URL seperti yang Anda lakukan di bagian 2. Sebaliknya, gunakan string kueri.
Jika team disediakan sebagai parameter string kueri, hanya kembalikan pengguna yang ada di tim itu. Jika tidak ada pengguna di team yang disediakan, kembalikan daftar kosong.
Untuk latihan ini, Anda dapat mengabaikan parameter string kueri apa pun selain team .
Di Postman, Anda dapat menyediakan parameter string kueri yang menulis string kueri ke URL permintaan Anda atau dengan menekan tombol Params di sebelah Send . Melakukan hal itu akan secara otomatis mengisi URL permintaan.
Berikut ini harus terjadi
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
}

Tentukan titik akhir:
POST /users
Titik akhir ini harus membuat pengguna baru. Setiap permintaan juga harus mengirim name , age , dan parameter team di body permintaan. Properti id akan dibuat secara otomatis di mockDB.
Permintaan yang berhasil harus mengembalikan kode status 201 dan mengembalikan pengguna yang baru dibuat.
Jika salah satu dari tiga parameter yang diperlukan tidak disediakan, jangan membuat pengguna baru di DB dan mengembalikan 422 dengan message yang berguna. Secara umum, pesan Anda harus memberikan umpan balik yang berguna kepada pengguna/pengembang tentang apa yang mereka lakukan salah dan bagaimana mereka dapat memperbaikinya.
Beginilah cara Anda dapat mengirim parameter body dari tukang pos. Pastikan Anda tidak salah mengira ini sebagai parameter kueri! 
Tentukan titik akhir:
PUT /users/<id>
Di sini kita perlu memberikan id pengguna karena kita perlu menentukan pengguna mana yang akan diperbarui. body untuk permintaan ini harus berisi atribut yang sama dengan permintaan POST dari Bagian 4.
Namun, perbedaan dengan permintaan PUT ini adalah bahwa hanya nilai -nilai dengan kunci yang disediakan ( name , age , team ) yang akan diperbarui, dan parameter apa pun yang tidak disediakan tidak akan mengubah atribut yang sesuai pada pengguna yang diperbarui.
Anda tidak perlu memperhitungkan parameter body asalkan yang bukan name , age , atau team .
Jika pengguna dengan id yang disediakan tidak dapat ditemukan, kembalikan 404 dan message yang berguna.
Tentukan titik akhir:
DELETE /users/<id>
Ini akan menghapus pengguna dengan id terkait. Kembalikan message yang bermanfaat, meskipun tidak ada yang perlu ditentukan dalam result respons.
Jika pengguna dengan id yang disediakan tidak dapat ditemukan, kembalikan 404 dan message yang berguna.
Mari Tulis Tes Unit! Tes unit sangat penting untuk pengembangan perangkat lunak. Ini memungkinkan untuk secara otomatis memeriksa apakah fungsionalitas kami berfungsi atau tidak karena menguji secara manual semuanya sangat lambat dan rawan kesalahan. Pengembangan Test Driven adalah proses pengembangan perangkat lunak di mana kami mendefinisikan spesifikasi, menulis tes ke spek itu, kemudian mengimplementasikan fungsionalitas, dan menggunakan tes untuk memvalidasi apakah itu berhasil. Kami telah melakukan sedikit hal untuk Anda karena tes untuk Bagian 1-3 ditulis. Untuk menguji mereka:
pipenv install --dev
pipenv run pytest
Jika perubahan Anda berhasil, Anda akan melihat garis hijau yang mengatakan 5 passed . Jika tidak, ikuti jejak tumpukan dan perbaiki implementasi Anda. Begitu mereka bekerja, mari kita tulis tes untuk bagian 3-6 .
Kami menggunakan Pytest, kerangka kerja tes Python yang berguna yang secara otomatis menemukan dan menjalankan metode Python yang dimulai dengan test , seperti test_get_index . Dalam kasus kami, kami memiliki file uji bernama test_app.py , yang memegang semua tes untuk bagian 1-3.
Setiap metode juga menerima objek client , yang secara otomatis disuntikkan oleh Pytest. client adalah perlengkapan tes, yang merupakan sesuatu yang dapat Anda gunakan dalam beberapa tes, memberi Anda garis dasar tetap untuk pengujian Anda. Saat menginisialisasi, Pytest melihat ke conftest.py dan mengumpulkan semua perlengkapan. Dalam kasus kami, kami memiliki perlengkapan client , yang memberikan klien uji Flask, yang dapat kami gunakan untuk dengan mudah menguji API kami. Lihatlah bagaimana Anda dapat menggunakan klien uji Flask untuk membuat jenis permintaan lain dan bagaimana Anda dapat menggunakan muatan permintaan.
Setelah selesai dengan semua langkah, dorong perubahan Anda ke repo GitHub Anda!
Mari kita lari hitam, formatter Python, sebelum Anda mengirimkan. Ini menghilangkan semua argumen tentang bagaimana kami ingin menata kode Python Anda dan memberi pengulas gaya standar untuk ditinjau. Anda harus menginstalnya dengan pipenv install --dev
pipenv run black .
Sebelum Anda dapat mengirimkan PR, Anda harus mendorong cabang Anda ke cabang jarak jauh (yang ada di GitHub, bukan lokal).
Periksa untuk melihat bahwa Anda berada di cabang Anda:
git branch
Jika Anda ingin memastikan semua komit Anda ada di:
git log
Tekan Q untuk keluar dari layar git log .
Dorong komit Anda ke cabang jarak jauh Anda:
git push
Pertama kali Anda melakukan ini, Anda mungkin mendapatkan kesalahan karena cabang jarak jauh Anda belum ada. Biasanya itu akan memberi tahu Anda perintah yang benar untuk digunakan:
git push --set-upstream origin <YOUR_BRANCH_NAME>
Catatan: Ini hanya perlu dilakukan saat pertama kali Anda mendorong cabang baru. Anda dapat menggunakan hanya git push sesudahnya.
Setelah ini selesai, silakan kirim email ke [email protected] dengan tautan ke repositori bercabang Anda dan nama cabang Anda. Kami akan membutuhkan kedua hal ini untuk melihat kiriman Anda.