Đây là bài đăng về việc chạy Python trong trình duyệt web - nghĩa là sử dụng Python để xây dựng giao diện người dùng web động, thay vì cần sử dụng JavaScript - và các cách tiếp cận khác nhau để biến điều đó thành có thể
Tôi đã nói điều này như một bài nói chuyện tại PyCon UK 2019. Đây là một video
Một bộ não bị chia cắt
Hãy để tôi kể cho bạn nghe về tôi. Tôi từng là nhà phát triển Python back-end. tôi đã hạnh phúc. Và sau đó tôi cũng nhận được một công việc viết mã JavaScript front-end. Điều này…kém hạnh phúc. Tôi đã sử dụng hai ngôn ngữ với những cách suy nghĩ rất khác nhau. Cả bộ não và logic ứng dụng của tôi đều bị xáo trộn giữa hai thứ và tôi liên tục bỏ lỡ các tính năng cũng như khả năng sử dụng của Python
Là một lập trình viên Python, tôi muốn sử dụng các lớp - đặc biệt nếu tôi đang xây dựng giao diện người dùng, một thứ vốn dĩ hướng đối tượng. Tôi muốn phân cấp thừa kế. Tôi muốn đối số từ khóa. Và tôi muốn biết ý nghĩa của
import * as hello from "./__target__/hello.js";
Say Hello
6 [hoặc
import * as hello from "./__target__/hello.js";
Say Hello
7] tại bất kỳ thời điểm nào trong mã của tôiVì vậy, tôi đã suy nghĩ. “Tại sao tôi phải sử dụng JavaScript? . Nó sẽ không phải là một hệ điều hành rất phổ biến. Tuy nhiên, các trình duyệt web là một nền tảng phân phối ứng dụng chỉ hỗ trợ một ngôn ngữ
Câu hỏi này đã xuất hiện trong đầu tôi khi tôi đến PyCon Vương quốc Anh hai năm trước, vì vậy tôi ngay lập tức bị thu hút bởi gian hàng Anvil, với lời hứa viết Python trong trình duyệt web. [Tôi đã kết thúc làm việc ở đây, vì vậy nó đã diễn ra tốt đẹp. ] Nhưng Anvil là một nền tảng tích hợp hoàn chỉnh để xây dựng các ứng dụng web và thư viện mà Anvil sử dụng [Skulpt] không phải là câu trả lời cho tất cả mọi người. Vì vậy, các tùy chọn khác là gì?
Tôi sẽ đưa bạn tham quan không gian thiết kế, bằng cách so sánh sáu cách khác nhau để chạy mã Python trong trình duyệt. Sẽ có demo
Một chuyến tham quan gồm sáu lựa chọn
Sáu công nghệ này là những ví dụ tiêu biểu cho những gì đang tồn tại. Tất cả đều tương đối trưởng thành và chiếm nhiều không gian thiết kế. Tôi đã đặt chúng trên hai trục
Lựa chọn thiết kế lớn đầu tiên của chúng tôi là trên trục Y. Trình duyệt chạy Python như thế nào? . dịch mã Python sang Javascript rồi chạy mã đó hoặc triển khai trình thông dịch Python trong trình duyệt và chuyển Python của bạn qua mã đó
Lựa chọn thứ hai, trên trục X, là “Khi nào thì Python được biên dịch?”. Bạn có thể biên dịch trước hoặc sau khi trang được tải. Đây là một điều khó khăn - bạn có thể đánh đổi sự thuận tiện trong phát triển, hiệu suất trên trang và tính năng động. [REPL tương tác trong trình duyệt. ]
1. chuyển mã. biên soạn trước thời hạn
Điều đầu tiên chúng ta sẽ nói đến là Chuyển mã. Đây là trình biên dịch dịch Python sang JavaScript trước thời hạn. Tôi sẽ chỉ cho bạn một ví dụ nhanh
Tôi có hai tập tin.
import * as hello from "./__target__/hello.js";
Say Hello
8 và
import * as hello from "./__target__/hello.js";
Say Hello
9~/python-browser/transcrypt$ ls
hello.html hello.py
import * as hello from "./__target__/hello.js";
Say Hello
8 là một tệp HTML cực kỳ đơn giản. nó có một hộp đầu vào và một nút
import * as hello from "./__target__/hello.js";
Say Hello
Khi tôi nhập tên của mình vào hộp nhập liệu, tôi sẽ nhận được thông báo. Hành vi động được triển khai bởi tập lệnh mà tôi đang nhập ở trên cùng và tập lệnh được biên dịch từ
import * as hello from "./__target__/hello.js";
Say Hello
9________số 8
Đây gần như là ứng dụng web đơn giản nhất mà bạn từng thấy. Mã python không phải là đơn giản nhất, vì nó phải truy cập DOM. Có một hàm
def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
2 sử dụng def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
3 để lấy giá trị def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
4. Sau đó, tôi ràng buộc nút đó với trình xử lý nút def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
5 bằng một lệnh gọi khác tới def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
6Đây là một cách rất JavaScript-y để tương tác với giao diện người dùng của tôi. Đây là một lựa chọn thiết kế có chủ ý của Transcrypt; . Điều này sẽ quen thuộc nếu bạn đã từng sử dụng JavaScript và cho phép bạn sử dụng tài liệu JavaScript làm tài liệu tham khảo. Tất nhiên, nhược điểm là bạn vẫn có tất cả sự phức tạp của các API JS
Tôi biên dịch Python đó thành JavaScript bằng cách chạy
def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
7
import * as hello from "./__target__/hello.js";
Say Hello
5Điều này đã tạo ra một thư mục có tên là
def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
8, chứa tệp JavaScript đã biên dịch của tôi, def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
9
import * as hello from "./__target__/hello.js";
Say Hello
8def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
9 thực sự khá dễ đọc - nó rất giống với Python gốc của tôi. Tôi có
import * as hello from "./__target__/hello.js";
Say Hello
51, tôi có def greet[]:
alert["Hello " + document.getElementById["name-box"].value + "!"]
document.getElementById["greet-button"].addEventListener['click', greet]
6…điều chính đã thay đổi là định nghĩa hàm rất JavaScript-y [và, theo ý kiến của tôi, không đẹp bằng]
import * as hello from "./__target__/hello.js";
Say Hello
2Và sau đó là câu lệnh nhập khẩu khổng lồ này ở trên cùng. Điều này đang nhập một loạt thứ mà bạn có thể quen thuộc từ các nội trang Python. Tuy nhiên, chúng không thực sự là Python. chúng là các bản triển khai JavaScript viết tay của những thứ đó, nhờ sự giúp đỡ của
import * as hello from "./__target__/hello.js";
Say Hello
53. Ví dụ: Python có hàm
import * as hello from "./__target__/hello.js";
Say Hello
54 cho bạn biết liệu một đối tượng có thể được gọi hay không. Việc triển khai JavaScript đó là một biểu thức boolean duy nhất để kiểm tra xem đó có phải là một đối tượng hay không, sau đó kiểm tra xem nó có phương thức
import * as hello from "./__target__/hello.js";
Say Hello
55 hay không. Điều này đã được viết tay để sao chép hành vi của Python
import * as hello from "./__target__/hello.js";
Say Hello
6Tệp khác,
import * as hello from "./__target__/hello.js";
Say Hello
56, chứa một số siêu dữ liệu mà trình biên dịch muốn cóĐây là ví dụ đó, trực tiếp trên trang này. Bạn có thể nhập tên vào hộp nhập liệu và bạn sẽ nhận được cảnh báo khi nhấp vào nút
Vì vậy, tôi đã viết một số Python và chúng tôi đã có một ứng dụng web động - mặc dù là ứng dụng đơn giản nhất mà bạn có thể tưởng tượng. [Nếu bạn không tin tôi, bạn có thể kiểm tra trang này trong các công cụ trình duyệt của mình và xem JavaScript được tạo tự động của tôi. ]
Nhưng Transcrypt vẫn chưa chính xác là công cụ chuyển đổi một đối một cho JavaScript. Tôi vẫn không thể viết thẻ
import * as hello from "./__target__/hello.js";
Say Hello
57 có chứa một số Python2. Brython. Thẻ tập lệnh Python
Nếu tôi muốn có thẻ Python
import * as hello from "./__target__/hello.js";
Say Hello
57, tôi có thể sử dụng Brython. Brython là một trình biên dịch được viết bằng JavaScript, vì vậy tôi có thể chạy nó bằng trình duyệt web của mình. Hãy xem ví dụ tương tự, nhưng lần này được viết bằng Brython
import * as hello from "./__target__/hello.js";
Say Hello
0Bây giờ tôi chỉ có một tệp,
import * as hello from "./__target__/hello.js";
Say Hello
8. Tôi vẫn có hộp nhập và nút như trước, nhưng bây giờ tôi có một tập lệnh có loại là
import * as hello from "./__target__/hello.js";
Say Hello
80
import * as hello from "./__target__/hello.js";
Say Hello
3Python của tôi rất giống với những gì tôi đã có trước đây, nhưng thoải mái hơn một chút. Cách tôi truy cập DOM có nhiều cú pháp hơn một chút. Tôi đang truy cập
import * as hello from "./__target__/hello.js";
Say Hello
81 giống như một cuốn từ điển, sử dụng ký hiệu dấu ngoặc vuông và phương pháp
import * as hello from "./__target__/hello.js";
Say Hello
82 của tôi cũng rất hay và ngắn gọn. Tôi đã nhập
import * as hello from "./__target__/hello.js";
Say Hello
81 và
import * as hello from "./__target__/hello.js";
Say Hello
51, thay vì sử dụng chúng dưới dạng toàn cầu Javascript-y kỳ diệu. Tất cả đều cảm thấy Pythonic hơn một chútĐể thực sự chạy mã này, tôi có thẻ
import * as hello from "./__target__/hello.js";
Say Hello
57 bao gồm trình biên dịch Brython. Nó định nghĩa một hàm
import * as hello from "./__target__/hello.js";
Say Hello
86 toàn cầu mà tôi gọi khi tải trang. Khi tải trang, Brython sẽ tìm tất cả các
import * as hello from "./__target__/hello.js";
Say Hello
57 của Python, biến chúng thành JavaScript và chạy chúng~/python-browser/transcrypt$ ls
hello.html hello.py
1Bây giờ, ví dụ của tôi sẽ trông rất giống - thực tế là giống hệt nhau - nhưng khi tôi kiểm tra nó, tôi thực sự có Python của mình trong mã nguồn của trang
Python trong trình duyệt - theo nghĩa đen
Bạn có thể sửa đổi tập lệnh Python đó và chạy lại trình biên dịch [bằng cách chạy
import * as hello from "./__target__/hello.js";
Say Hello
86 trong bảng điều khiển trình duyệt]. Nhưng nếu bạn làm điều đó, bạn sẽ thực sự có hai trình xử lý nhấp chuột, bởi vì nó đã ràng buộc cả hai và cả hai vẫn còn trong bộ nhớVì vậy, về cơ bản, bây giờ tôi có Python để thay thế trực tiếp cho JavaScript, nhưng mã chỉnh sửa động không hoạt động tốt lắm - tôi vẫn cần viết Python của mình trước khi tải trang. Nếu tôi muốn xây dựng một môi trường mã hóa Python tương tác thì sao?
3. điêu khắc. Python tương tác trong trình duyệt
Skulpt ban đầu được viết cho giáo dục, để cung cấp môi trường Python tương tác trong trình duyệt
Nếu bạn mới bắt đầu với ai đó với Python, bạn thực sự không muốn trải nghiệm đầu tiên của họ là tải xuống và cài đặt nó. Họ có thể làm hỏng hệ thống Python của họ trong quá trình này, bạn có nhiều môi trường khác nhau như bạn có sinh viên và bạn phải gỡ lỗi tất cả chúng trước khi bất kỳ ai có thể viết câu lệnh
import * as hello from "./__target__/hello.js";
Say Hello
89 đầu tiên của họ. Nhưng nếu họ có một môi trường trong trình duyệt, họ có thể tiếp tục và viết một số mãMột ví dụ Skulpt điển hình trông như thế này
Có một hộp ở trên cùng để viết một số Python và ở đâu đó đầu ra đến. Khi bạn nhấn nút Run, nó sẽ biên dịch và chạy mã của bạn, tất cả trong trình duyệt [không có lưu lượng truy cập mạng. ]
Bạn có thể chỉnh sửa mã đó – hãy thử. Bạn sẽ nhận được một số đầu ra từ mã Python không tồn tại khi tải trang
Có một dự án thực sự thú vị tên là đồ trang sức nhỏ. io cung cấp cho sinh viên một trình thông dịch trong trình duyệt và dựa trên Skulpt
Đây là cách ví dụ đó hoạt động. Đây là HTML xác định vùng văn bản
import * as hello from "./__target__/hello.js";
Say Hello
0Và đây là cách chúng tôi chạy những dòng mã này khi bạn nhấp vào nút
import * as hello from "./__target__/hello.js";
Say Hello
1Bạn nhận được đối tượng
import * as hello from "./__target__/hello.js";
Say Hello
20 đó trong phạm vi toàn cầu khi nhập Skulpt
import * as hello from "./__target__/hello.js";
Say Hello
2Bạn chỉ cần chuyển một chuỗi mã Python tới
import * as hello from "./__target__/hello.js";
Say Hello
20 và nó sẽ biên dịch và chạy dưới dạng JavaScript, bao nhiêu lần tùy thích. Tôi đang lấy mã Python của mình từ vùng văn bản
import * as hello from "./__target__/hello.js";
Say Hello
22 trong JavaScript - và sau đó tôi chuyển mã đó vào SkulptĐây là một sự đánh đổi thiết kế khác. Skulpt không có DOM API tích hợp nên mình phải viết Javascript để giao tiếp với trang. Nhưng đó có thể là một điều tốt. nó cho phép chúng tôi xây dựng một môi trường để chạy Python mà không cần phải xử lý DOM. Ví dụ trên của chúng tôi có thể được sử dụng trong giảng dạy. chúng tôi sẽ không cần dạy học sinh của mình DOM trước khi chúng tôi có thể làm toán và các câu lệnh
import * as hello from "./__target__/hello.js";
Say Hello
89Ở cấp độ nâng cao hơn, Skulpt là thứ chúng tôi sử dụng cho Anvil, nền tảng để xây dựng các ứng dụng web toàn ngăn xếp không có gì ngoài Python. Chúng tôi không muốn người dùng của mình phải sử dụng DOM, HTML và CSS – vì vậy, thay vào đó, chúng tôi đã xây dựng một thư viện giao diện người dùng dựa trên thành phần. Trong Anvil, bạn không truy vấn tài liệu để tìm hộp văn bản; . Chúng tôi không muốn để người dùng của mình tiếp xúc với DOM
Vậy là chúng ta đã đi được nửa chặng đường. Chúng tôi đã xem xét tất cả các công nghệ mà Python đang được biên dịch thẳng sang JavaScript. Bây giờ tôi sẽ nói về một cách tiếp cận khác. triển khai toàn bộ trình thông dịch Python trong trình duyệt web
Nửa đường. Ba phần tiếp theo là trình thông dịch Python đầy đủ chạy trong trình duyệt web
4. PyPy. js. một trình thông dịch Python đầy đủ trong trình duyệt web của bạn
Viết trình thông dịch Python và trình biên dịch bằng JavaScript nghe có vẻ nhiều việc, nhưng PyPy. js đã tìm ra cách giải quyết vấn đề đó. Thay vì viết lại Python bằng JavaScript, việc này sẽ mất nhiều năm, họ đã biên dịch lại PyPy thành JavaScript bằng cách sử dụng emscripten. Điều đó cung cấp cho bạn phiên bản JavaScript của PyPy. Không dừng lại ở đó - họ còn xây dựng trình biên dịch Python-to-JavaScript tức thời để biên dịch mã thường dùng
Vì vậy, đây là một công cụ khá phức tạp, nặng nề… và kích thước tải xuống phản ánh điều đó. Chỉ riêng trình thông dịch là 12 MB JavaScript mà trình duyệt của bạn phải tải xuống và phân tích cú pháp. [Ngay cả khi tải xuống được lưu trong bộ nhớ cache, trình duyệt của bạn phải phân tích cú pháp và biên dịch tất cả JavaScript đó mỗi khi tải trang. ] Vì vậy, sự đánh đổi để có trình thông dịch Python đầy đủ tính năng này trong trình duyệt là bạn phải đợi nó khởi động
Hãy để tôi chỉ cho bạn một ví dụ và bạn sẽ thấy những gì tôi muốn nói. Bạn nhập trình thông dịch bằng các thẻ tập lệnh, như trước đây. Khi chúng được nhập, trình thông dịch được tải xuống và tải vào bộ nhớ của trình duyệt
import * as hello from "./__target__/hello.js";
Say Hello
3Nó bắt đầu chạy và bạn nhận được đối tượng
import * as hello from "./__target__/hello.js";
Say Hello
25 này cho phép bạn giao tiếp với trình thông dịch đó. Tôi chỉ đang tính 10 số vuông đầu tiên bằng phương pháp
import * as hello from "./__target__/hello.js";
Say Hello
26. Nó có các phương thức
import * as hello from "./__target__/hello.js";
Say Hello
27 và
import * as hello from "./__target__/hello.js";
Say Hello
28 để bạn có thể truyền các biến qua lại giữa JavaScript và Python. Tôi nhận được giá trị
import * as hello from "./__target__/hello.js";
Say Hello
29, là một Mảng trong JavaScript và tôi đang in giá trị đó trong một
import * as hello from "./__target__/hello.js";
Say Hello
51. Nó có cách làm việc không đồng bộ dựa trên lời hứa tốt đẹp này
import * as hello from "./__target__/hello.js";
Say Hello
4Đây là một GIF của nó đang tải, trong thời gian thực
PyPy. js mất một lúc để kích hoạt, nhưng bạn sẽ có một trình thông dịch PyPy đầy đủ khi nó hoạt động
PyPy là một trong những triển khai Python được thử nghiệm tốt nhất hiện có và PyPy. js khá nhanh sau khi được tải. Nếu bạn đang xây dựng thứ gì đó mà người dùng của bạn vui vẻ chờ đợi mọi thứ tải lên - có thể là REPL tương tác hoặc trực quan hóa dữ liệu - và bạn muốn có một trình thông dịch Python không thỏa hiệp, hãy dùng thử. Nó thậm chí còn có một hệ thống tệp trong bộ nhớ, vì vậy bạn thực sự có thể ghi vào các tệp được lưu trữ trong bộ nhớ của trình duyệt và bạn có thể đọc từ chúng. Bạn cũng có thể chạy nhiều trình thông dịch. Vì vậy, nó có vô số tính năng, nhưng nó rất nặng
Vì vậy, điều gì sẽ xảy ra nếu chúng tôi sẵn sàng hy sinh một số tính năng này để giảm kích thước tải xuống?
5. Batavia. Trình thông dịch mã byte nhẹ
Nó được gọi là Batavia và nó đến từ Beeware. Họ là một dự án mã nguồn mở, họ tạo ra rất nhiều công cụ thực sự thú vị giúp Python trở nên dễ di chuyển hơn so với hiện tại
Batavia là giải pháp Python-in-the-browser của họ và họ đã viết tay một trình thông dịch Python bằng JavaScript theo đúng nghĩa đen. Họ chưa viết trình biên dịch - nó chỉ diễn giải mã byte Python được biên dịch sẵn. Kết quả là một trình thông dịch tiết kiệm bộ nhớ chỉ có 400 kB để tải xuống. Điểm bất lợi là bạn phải biên dịch tập lệnh trước và đặt mã byte vào HTML của mình. Ở đây chúng tôi có một thẻ tập lệnh có loại là
import * as hello from "./__target__/hello.js";
Say Hello
61
import * as hello from "./__target__/hello.js";
Say Hello
5Hướng dẫn Bắt đầu của họ thực sự gợi ý rằng bạn nên thiết lập một máy chủ để thực hiện việc biên dịch cho bạn. Vì vậy, bạn có thể có một REPL tương tác – nhưng mỗi khi bạn nhấn 'chạy', nó sẽ tạo một yêu cầu HTTP để biên dịch mã mới, sau đó gửi lại mã byte để chạy trong trình duyệt của bạn
Hạn chế khác là, trong số các công nghệ mà tôi đã nói đến, đây có lẽ là công nghệ non nớt nhất. Trên trang GitHub của họ, họ nói "đây là bản alpha đầu tiên và nếu nó bị hỏng, bạn có thể giữ lại tất cả các mảnh sáng bóng". Vì vậy, nếu đây là thứ lấp đầy một phân khúc thị trường ngách mà bạn muốn lấp đầy, thì bạn nên tham gia và giúp họ đưa nó đến trạng thái hoàn chỉnh hơn
6. pyodua. Giống như Notebook Jupyter trong trình duyệt web của bạn
Cuối cùng nhưng không kém phần quan trọng, tôi muốn nói về Pyodide. Đó là một môi trường đầy đủ, hơi giống Jupyter Notebook, nhưng nó chạy hoàn toàn trong trình duyệt của bạn. Bạn có thể có đầy đủ các quy trình khoa học dữ liệu trong ứng dụng khách, vì vậy không cần phải đi vòng và mọi thứ sẽ nhanh hơn rất nhiều
Nó được điều hành bởi Mozilla và nó hoạt động bằng cách biên dịch trình thông dịch CPython tiêu chuẩn thành WebAssugging. WebAssembly là một bytecode tải và chạy trong trình duyệt của bạn [thường được biên dịch thành mã gốc]. Mozilla đã tìm thấy một dự án CPython-in-WebASM hiện có, chịu trách nhiệm về nó và biên dịch lại những thứ như Numpy, SciPy và Pandas – tất cả các thư viện khoa học dữ liệu – thành WebAssembly. Kết quả về cơ bản là chén thánh của khoa học dữ liệu
Đây là sổ ghi chép ví dụ của họ. Pyodide là một phần của Iodide, một dự án lớn hơn có JavaScript và nhiều tính năng khác. Như với PyPy, lần đầu tiên bạn chạy mã Python, bạn phải đợi trình thông dịch tải xuống và khởi tạo. Nhưng một khi bạn đã làm điều đó, bạn có một môi trường Python đầy đủ sức mạnh
iốt. như Jupyter Notebooks trong trình duyệt
Sau khi được tải, các bước Python tiếp theo sẽ thực thi gần như ngay lập tức. Bạn cũng có thể viết HTML hoặc MarkDown, chạy JavaScript và làm mọi thứ. Điều quan trọng là tất cả đều nằm trong trình duyệt - không có chuyến đi khứ hồi đến máy chủ và bạn đang sử dụng máy tính của người dùng để nó có thể thay đổi quy mô một cách xuất sắc
Nhưng có sự chậm trễ này khi khởi động, vì vậy đây không phải là thứ bạn có thể sử dụng cho trang web thương mại điện tử. Và nó được gắn với dự án Iodide, vì vậy bạn cần thực hiện khá nhiều thao tác hack để sử dụng nó với bất kỳ thứ gì khác
Bảng tóm tắt
Vì vậy, điều này kết thúc chuyến tham quan của chúng tôi. Đây là bảng tóm tắt tất cả các công nghệ mà tôi đã nói đến [cũng có sẵn trong bài đăng trên blog Mẹo về Python kèm theo]
Làm mọi thứ bằng Python
Tôi muốn làm cho một điểm rộng hơn. Như tôi đã nói lúc đầu
- tôi, trước đó
Tôi nghĩ chúng ta cần đặt câu hỏi đó về toàn bộ ngăn xếp web
Ngăn xếp web bắt đầu ở phần bên trái của sơ đồ này, nơi bạn đang sử dụng SQL để truy cập dữ liệu của mình, bạn phải chuyển đổi mọi thứ thành JSON, bạn phải viết các mẫu HTML, bạn phải sử dụng Mô hình Đối tượng Tài liệu để
Chúng tôi đang bắt đầu chuyển sang thứ mà chúng tôi có thể sử dụng Python ở mọi nơi. Chúng tôi có các ORM như SQLAlchemy để viết Python để truy cập cơ sở dữ liệu của chúng tôi. Rõ ràng là chúng tôi có Python trên máy chủ. Bây giờ chúng tôi có Python trong trình duyệt. Và trên hết, với Anvil, giờ đây chúng ta có quyền truy cập vào một cách Pythonic hơn để thao tác giao diện người dùng
Chúng tôi có thể truy cập dữ liệu của mình theo một cách trên máy chủ và có cùng một biểu diễn, cùng một cú pháp trong trình duyệt. Ví dụ, ứng dụng web trung bình có 1000 dòng mã để dịch dữ liệu và 40 dòng mã thực sự chỉ định logic nghiệp vụ. Nếu không cần dịch thuật, việc phát triển web có thể đơn giản hơn nhiều
Đây là lý do tại sao chúng tôi xây dựng Anvil. Với Anvil, bạn có thể làm mọi thứ bằng Python – từ thiết kế giao diện người dùng đến cơ sở dữ liệu – mà không cần dịch sang năm biểu diễn khác. Nó miễn phí sử dụng và nó đơn giản hóa đáng kể ngăn xếp web