Rumah >pembangunan bahagian belakang >Tutorial Python >Mereka bentuk Rangka Kerja Web Python Tulen
Pembangunan web ialah salah satu kes penggunaan paling popular untuk pengaturcaraan. Python adalah salah satu bahasa pengaturcaraan yang paling popular di dunia. Jadi mengapa kita tidak boleh membina apl web dalam Python?
Membuat UI sepatutnya mudah, tetapi walaupun anda mempunyai jurutera yang hebat dalam pasukan anda, overhed mempelajari bahasa dan alatan baharu merupakan halangan yang besar. Selalunya membuat UI mungkin lebih sukar daripada kerja sebenar yang dilakukan!
Di bawah tudung, apl Refleks menyusun ke apl bahagian hadapan React dan apl bahagian belakang FastAPI. Hanya UI yang disusun ke Javascript; semua logik aplikasi dan pengurusan keadaan kekal dalam Python dan dijalankan pada pelayan. Refleks menggunakan WebSockets untuk menghantar acara dari hujung hadapan ke hujung belakang dan untuk menghantar kemas kini keadaan dari hujung belakang ke hujung hadapan.
Terdapat beberapa cara untuk membina apl dalam Python, tetapi tiada satu pun daripadanya sesuai dengan keperluan kita.
Di satu pihak, terdapat rangka kerja seperti Django dan Flask yang bagus untuk membina apl web gred pengeluaran. Tetapi mereka hanya mengendalikan bahagian belakang - anda masih perlu menggunakan JavaScript dan rangka kerja bahagian hadapan, serta menulis banyak kod plat dandang untuk menyambungkan bahagian hadapan dan bahagian belakang.
Sebaliknya, perpustakaan Python tulen seperti Dash dan Streamlit boleh menjadi bagus untuk projek kecil, tetapi ia terhad kepada kes penggunaan tertentu dan tidak mempunyai ciri dan prestasi untuk membina apl web penuh. Apabila apl anda berkembang dalam ciri dan kerumitan, anda mungkin mendapati diri anda mencapai had rangka kerja, pada ketika itu anda sama ada perlu mengehadkan idea anda agar sesuai dengan rangka kerja, atau membatalkan projek anda dan membina semula menggunakan "rangka kerja web sebenar".
Kami mahu merapatkan jurang ini dengan mencipta rangka kerja yang mudah dan intuitif untuk dimulakan, sambil kekal fleksibel dan berkuasa untuk menyokong mana-mana apl.
Sekarang mari kita selami cara kami membina Refleks untuk mencapai matlamat ini.
Apl web tindanan penuh terdiri daripada bahagian hadapan dan bahagian belakang. Bahagian hadapan ialah antara muka pengguna, dan dihidangkan sebagai halaman web yang berjalan pada penyemak imbas pengguna. Bahagian belakang mengendalikan logik dan pengurusan keadaan (seperti pangkalan data dan API), dan dijalankan pada pelayan.
Dalam pembangunan web tradisional, ini biasanya dua apl berasingan, dan selalunya ditulis dalam rangka kerja atau bahasa yang berbeza. Sebagai contoh, anda boleh menggabungkan bahagian belakang Flask dengan bahagian hadapan React. Dengan pendekatan ini, anda perlu mengekalkan dua apl berasingan dan akhirnya menulis banyak kod boilerplate untuk menyambungkan bahagian hadapan dan bahagian belakang.
Kami ingin memudahkan proses ini dalam Reflex dengan mentakrifkan kedua-dua bahagian hadapan dan hujung belakang dalam satu pangkalan kod, sambil menggunakan Python untuk segala-galanya. Pembangun hanya perlu bimbang tentang logik apl mereka dan bukan tentang butiran pelaksanaan peringkat rendah.
Kami mahu apl Refleks kelihatan dan berasa seperti apl web tradisional kepada pengguna akhir, sementara masih mudah dibina dan diselenggara untuk pembangun. Untuk melakukan ini, kami membina di atas teknologi web yang matang dan popular.
Apabila anda refleks menjalankan apl anda, Reflex menyusun bahagian hadapan ke bawah ke satu halaman apl Next.js dan menyajikannya pada port (secara lalai 3000) yang boleh anda akses dalam penyemak imbas anda.
Tugas bahagian hadapan adalah untuk menggambarkan keadaan apl dan menghantar acara ke bahagian belakang apabila pengguna berinteraksi dengan UI. Tiada logik sebenar dijalankan pada bahagian hadapan.
Hadapan refleks dibina menggunakan komponen yang boleh digubah bersama untuk mencipta UI yang kompleks. Daripada menggunakan bahasa templat yang mencampurkan HTML dan Python, kami hanya menggunakan fungsi Python untuk mentakrifkan UI.
Di bawah tudung, komponen menyusun ke komponen React.
Banyak komponen teras kami adalah berdasarkan Radix, perpustakaan komponen React yang popular. Kami juga mempunyai banyak komponen lain untuk membuat grafik, jadual data dan banyak lagi.
Kami memilih React kerana ia adalah perpustakaan yang popular dengan ekosistem yang besar. Matlamat kami bukan untuk mencipta semula ekosistem web, tetapi untuk menjadikannya boleh diakses oleh pembangun Python.
Ini juga membolehkan pengguna kami membawa komponen mereka sendiri jika kami tidak mempunyai komponen yang mereka perlukan. Pengguna boleh membungkus komponen React mereka sendiri dan kemudian menerbitkannya untuk digunakan oleh orang lain. Lama kelamaan kami akan membina ekosistem komponen pihak ketiga kami supaya pengguna boleh mencari dan menggunakan komponen yang telah dibina oleh orang lain dengan mudah.
Kami mahu memastikan apl Refleks kelihatan baik di luar kotak, sambil masih memberi pembangun kawalan penuh ke atas penampilan apl mereka.
Kami mempunyai sistem tema teras yang membolehkan anda menetapkan pilihan penggayaan tahap tinggi seperti mod gelap dan warna aksen di seluruh apl anda untuk memberikan rupa dan rasa yang bersatu.
Selain itu, komponen Refleks boleh digayakan menggunakan kuasa penuh CSS. Kami memanfaatkan perpustakaan Emosi untuk membenarkan penggayaan "CSS-in-Python", supaya anda boleh menghantar mana-mana prop CSS sebagai hujah kata kunci kepada komponen. Ini termasuk prop responsif dengan menghantar senarai nilai.
Dalam Reflex hanya bahagian hadapan dikompil ke Javascript dan berjalan pada penyemak imbas pengguna, manakala semua keadaan dan logik kekal dalam Python dan dijalankan pada pelayan. Apabila anda menjalankan refleks, kami memulakan pelayan FastAPI (secara lalai pada port 8000) yang disambungkan bahagian hadapan melalui soket web.
Semua keadaan dan logik ditakrifkan dalam kelas Negeri.
Negeri ini terdiri daripada var dan pengendali acara.
Vars ialah sebarang nilai dalam apl anda yang boleh berubah dari semasa ke semasa. Ia ditakrifkan sebagai atribut kelas pada kelas Negeri anda dan mungkin mana-mana jenis Python yang boleh disirikan kepada JSON.
Pengendali acara ialah kaedah dalam kelas Negeri anda yang dipanggil apabila pengguna berinteraksi dengan UI. Ia adalah satu-satunya cara kita boleh mengubah suai vars dalam Reflex, dan boleh dipanggil sebagai tindak balas kepada tindakan pengguna, seperti mengklik butang atau menaip dalam kotak teks.
Memandangkan pengendali acara dijalankan di bahagian belakang, anda boleh menggunakan mana-mana pustaka Python di dalamnya.
Biasanya apabila menulis apl web, anda perlu menulis banyak kod boilerplate untuk menyambungkan bahagian hadapan dan bahagian belakang. Dengan Reflex, anda tidak perlu risau tentang itu - kami mengendalikan komunikasi antara bahagian hadapan dan bahagian belakang untuk anda. Pembangun hanya perlu menulis logik pengendali acara mereka dan apabila vars dikemas kini, UI dikemas kini secara automatik.
Pengguna boleh berinteraksi dengan UI dalam pelbagai cara, seperti mengklik butang, menaip dalam kotak teks atau melayang di atas elemen. Dalam Refleks, kami memanggilnya cetus peristiwa.
Di bahagian hadapan, kami mengekalkan baris gilir acara untuk semua acara yang belum selesai. Satu acara terdiri daripada tiga keping data utama:
Apabila acara dicetuskan, ia akan ditambahkan pada baris gilir.
Kami mempunyai bendera pemprosesan untuk memastikan hanya satu acara diproses pada satu masa. Ini memastikan negeri sentiasa konsisten dan tidak ada sebarang syarat perlumbaan dengan dua pengendali acara mengubah suai negeri pada masa yang sama. Terdapat pengecualian untuk ini, seperti acara latar belakang yang membolehkan anda menjalankan acara di latar belakang tanpa menyekat UI.
Setelah acara sedia untuk diproses, ia dihantar ke bahagian belakang melalui sambungan WebSocket.
Setelah acara diterima, ia diproses di bahagian belakang.
Reflex menggunakan pengurus negeri yang mengekalkan pemetaan antara token pelanggan dan keadaan mereka. Secara lalai, pengurus negeri hanyalah kamus dalam ingatan, tetapi ia boleh dilanjutkan untuk menggunakan pangkalan data atau cache. Dalam pengeluaran kami menggunakan Redis sebagai pengurus negeri kami.
Setelah kami mempunyai keadaan pengguna, langkah seterusnya ialah menjalankan pengendali acara dengan hujah.
Setiap kali pengendali acara kembali (atau menghasilkan), kami menyimpan keadaan dalam pengurus negeri dan menghantar kemas kini negeri ke bahagian hadapan untuk mengemas kini UI.
Untuk mengekalkan prestasi semasa keadaan anda berkembang, secara dalaman Reflex menjejaki vars yang dikemas kini semasa pengendali acara (var kotor).
Apabila pengendali acara selesai memproses, kami mencari semua var yang kotor dan membuat kemas kini keadaan untuk dihantar ke bahagian hadapan.
Kami menyimpan keadaan baharu dalam pengurus negeri kami, dan kemudian menghantar kemas kini negeri ke bahagian hadapan.
Bahagian hadapan kemudian mengemas kini UI untuk mencerminkan keadaan baharu.
Saya harap ini memberikan gambaran yang baik tentang cara Refleks berfungsi di bawah tudung. Kami akan mempunyai lebih banyak siaran yang akan dikeluarkan untuk berkongsi cara kami menjadikan Refleks berskala dan berprestasi melalui ciri-ciri seperti sharding keadaan dan pengoptimuman pengkompil.
Atas ialah kandungan terperinci Mereka bentuk Rangka Kerja Web Python Tulen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!