Tôi có thể tích hợp python với js không?

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách xây dựng một phụ trợ đơn giản bằng Python và một giao diện người dùng bằng JavaScript. Đối với phần phụ trợ Python, chúng tôi sẽ sử dụng thư viện Flask. Điều này sẽ cho phép chúng tôi thiết lập chương trình phụ trợ chỉ với một vài dòng mã

Mục tiêu chính của bài viết này là chứng minh sự tương tác giữa phụ trợ Python và giao diện người dùng. Vì vậy, frontend sẽ đơn giản nhất có thể. Chúng tôi sẽ sử dụng JavaScript đơn giản, không có khung. Có nghĩa là, đây sẽ là một giao diện người dùng mẫu rất đơn giản

Mã dự án đầy đủ có thể được tìm thấy trên GitHub của tôi. nơi đây

nội dung

điều kiện tiên quyết

Mặc dù đây là một hướng dẫn cơ bản, một số kiến ​​thức trước đây được giả định

  • Kiến thức Python cơ bản
  • Kiến thức JavaScript cơ bản

Chúng tôi cũng giả sử phần sau được cài đặt trên hệ thống của chúng tôi

  • Trăn 3. 6 hoặc cao hơn
  • píp
  • giữ cho môi trường của chúng tôi sạch sẽ bằng cách giữ các phụ thuộc của chúng tôi trong một thư mục cụ thể cho dự án của bạn
  • npm. vì chúng ta sẽ cài đặt máy chủ http

Hãy đảm bảo rằng chúng ta đã cài đặt máy chủ http, để chúng ta có một cách dễ dàng để chạy mã giao diện người dùng của mình. Ví dụ: sử dụng npm.

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
0

Tạo dự án

Trước tiên, hãy thiết lập thư mục dự án của chúng tôi. Đây sẽ là thư mục gốc và chứa các thư mục cho Python backend và Web frontend

Tạo một thư mục.

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
1

Xây dựng chương trình phụ trợ Python

Bước đầu tiên trong dự án phụ trợ Python và giao diện người dùng JavaScript của chúng tôi là xây dựng phụ trợ

Hãy tạo một thư mục mới cho dự án của chúng ta trong

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
1 có tên là
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
3

basic-web-app-tutorial
+ -- backend

Thiết lập một môi trường ảo cho các phụ thuộc

Tiếp theo, chúng tôi sẽ tạo một môi trường ảo cho các phụ thuộc của chúng tôi. Như đã đề cập trước đó, việc sử dụng môi trường ảo giúp phần còn lại của hệ thống của chúng tôi sạch sẽ. Các thư viện Python chúng tôi sẽ cài đặt sẽ chỉ được cài đặt vào môi trường này và sẽ không ảnh hưởng đến phần còn lại của hệ thống của chúng tôi

Chúng ta có thể tạo một môi trường ảo có tên là

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
4 bằng lệnh sau.
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
5

Trước khi chúng tôi có thể cài đặt các phụ thuộc, chúng tôi phải kích hoạt môi trường. Trên các hệ thống Linux, lệnh là.

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
6. Cho cửa sổ.
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
7

Ghi chú. nếu sử dụng git cho dự án của bạn, hãy đảm bảo đặt thư mục

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
4 trong tệp
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
9

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv

cài đặt phụ thuộc

Tiếp tục, hãy cài đặt các phụ thuộc cần thiết

  • bình giữ nhiệt. Khung ứng dụng web nhẹ. Cho phép chúng tôi thiết lập một ứng dụng web nhanh chóng và dễ dàng chỉ với một vài dòng mã
  • bình-cors. Giúp dễ dàng kích hoạt Chia sẻ tài nguyên gốc chéo (CORS). Có nghĩa là, điều này sẽ cho phép giao diện người dùng web JavaScript của chúng tôi giao tiếp với phần phụ trợ Python bên ngoài. Nếu không, giao diện người dùng sẽ tự động bị chặn

Hãy đảm bảo môi trường ảo được kích hoạt trước khi chúng tôi cài đặt các phụ thuộc này. Nếu nó được kích hoạt, chúng tôi sẽ cài đặt các phụ thuộc bằng lệnh sau.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
0

Ứng dụng phụ trợ python cơ bản

Trong phần này, cuối cùng chúng ta sẽ viết đoạn mã đầu tiên

Hãy tạo một tệp trong thư mục

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
3 có tên là
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
2 và chỉnh sửa nó bằng trình soạn thảo văn bản/IDE yêu thích của chúng ta. Ví dụ vscode

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv

Chúng ta sẽ bắt đầu với ví dụ cơ bản trên trang Flask

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

Ở dòng đầu tiên, chúng ta nhập lớp Flask cho phép chúng ta tạo đối tượng Flask. Đây là đối tượng trung tâm cho ứng dụng phụ trợ của chúng tôi. Ở dòng 3, phiên bản được tạo bằng cách sử dụng biến

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
3 làm tên cho ứng dụng. Đây có thể là bất kỳ tên thực sự

Cuối cùng, chúng tôi xác định một

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
4 bằng cách sử dụng một hàm trang trí.
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
5. Điều này có nghĩa là nếu phụ trợ đang chạy, chúng tôi sẽ có thể truy cập nó tại địa chỉ gốc. Bất cứ khi nào máy khách gửi yêu cầu HTTP đến địa chỉ gốc, chức năng
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
6 này sẽ được thực thi. Ví dụ: bằng cách điều hướng đến địa chỉ máy chủ của ứng dụng web của chúng tôi bằng trình duyệt internet

Sau khi đặt biến môi trường

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
7, chúng tôi có thể chạy máy chủ thử nghiệm bằng cách sử dụng.
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
8. Theo mặc định, máy chủ sẽ chạy trên
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
9. Nếu bây giờ chúng ta không muốn xử lý việc đặt các biến môi trường, chúng ta cũng có thể thêm các dòng sau

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)

Bây giờ chúng ta chỉ cần chạy tệp theo cách thông thường.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
0 và sau đó máy chủ sẽ chạy trên
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
1. Đầu ra trong dấu nhắc lệnh/thiết bị đầu cuối sẽ trông giống như thế này

Tôi có thể tích hợp python với js không?

Nếu chúng tôi mở trình duyệt của mình và điều hướng đến

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
2, chúng tôi sẽ nhận được thông báo
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
3

Thêm một điểm cuối và gửi lại dữ liệu

Để làm cho mọi thứ thú vị hơn một chút, chúng tôi sẽ thêm một điểm cuối gửi lại dữ liệu ở định dạng JSON. Không chỉ vậy, chúng tôi sẽ đọc dữ liệu này từ đĩa và sau đó gửi nó dưới dạng phản hồi. Định dạng JSON là một định dạng rất phổ biến được sử dụng để truyền dữ liệu giữa backend và frontend

Hãy thêm một tệp JSON có tên là

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
4 vào thư mục
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
3 của chúng ta

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv

Với những nội dung sau

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]

Chúng tôi đang sử dụng một tệp để đơn giản hóa ví dụ, nhưng hãy tưởng tượng tệp này đại diện cho một số dữ liệu trong cơ sở dữ liệu

Tiếp theo, chúng tôi sẽ thêm một điểm cuối mới gửi dữ liệu này dưới dạng phản hồi cho yêu cầu. Chúng tôi cũng sẽ thêm nhập khẩu mới. Giải thích theo sau mã

from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)

Trên dòng 2 và 3, chúng tôi nhập

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
6 và
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
7 sẽ cho phép chúng tôi trả về dữ liệu JSON và đọc tệp JSON tương ứng

Trên các dòng 11-21, điểm cuối mới

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
8 được xác định. Trình trang trí
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
9 hiện cũng có tham số
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
0. Với tham số này, chúng tôi có thể chỉ định loại yêu cầu HTTP nào được phép trên điểm cuối này. Trong trường hợp này, chúng tôi chỉ cho phép
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
1, thường chỉ được sử dụng để truy xuất dữ liệu

Tiếp theo, chúng tôi chỉ cần đọc tệp dữ liệu

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
4 bằng cách sử dụng
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
3 để tạo một phần xử lý tệp và đọc nó bằng cách sử dụng
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
4 trên dòng 15. Kết quả sẽ là một danh sách các từ điển mà chúng ta có thể thao tác. Để chứng minh điều này, chúng tôi thêm một tập dữ liệu người dùng khác

Sau đó, để gửi nó dưới dạng phản hồi hợp lệ, chúng tôi phải chuyển đổi lại dữ liệu này bằng cách sử dụng

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
5

Bây giờ, để xem những thay đổi trong mã của chúng tôi, chúng tôi phải dừng máy chủ và khởi động lại. Sau đó, nếu chúng tôi điều hướng đến

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
6, chúng tôi sẽ thấy kết quả sau

Tôi có thể tích hợp python với js không?

Định cấu hình CORS

Trước khi bắt đầu tạo ứng dụng khách giao diện người dùng, chúng ta nên định cấu hình CORS. Nếu chúng tôi không làm điều này, ứng dụng khách giao diện người dùng sẽ bị chặn bởi chương trình phụ trợ. Điều này được thực hiện tự động để ngăn các nguồn không mong muốn có thể giao tiếp với chương trình phụ trợ của chúng tôi

Để đơn giản, chúng tôi sẽ kích hoạt CORS cho tất cả các nguồn gốc ngay bây giờ. Dưới đây là đoạn mã từ

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
2 với những thay đổi có liên quan được làm nổi bật

from flask import Flask
import flask
import json
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

Xây dựng giao diện người dùng JavaScript

Bước tiếp theo cho dự án phụ trợ Python với giao diện người dùng JavaScript của chúng tôi là xây dựng giao diện người dùng. Trong phần này, chúng ta sẽ viết một trang HTML rất cơ bản với một số JavaScript

JavaScript của chúng tôi sẽ gửi yêu cầu đến máy chủ phụ trợ của chúng tôi và sau đó xử lý dữ liệu trong phản hồi để hiển thị trên trang. Như đã đề cập trước đó, ví dụ này sẽ không sử dụng khung giao diện người dùng hoặc thư viện để gửi yêu cầu

Thiết lập dự án frontend

Hãy tạo một thư mục mới cho dự án của chúng ta trong

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
1 có tên là
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
9 và thêm một tệp có tên là
[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
0

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html

Thêm mã giao diện người dùng

Dưới đây là danh sách mã đầy đủ cho tệp

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
0. Chúng tôi sẽ đi qua các phần quan trọng từng bước

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
0

Đầu tiên, hãy nhìn vào cơ thể

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
1

Ở đây, chúng tôi chỉ định nghĩa một số phần tử HTML mà chúng tôi cung cấp id để chúng tôi có thể tự động thêm văn bản/dữ liệu vào các phần tử đó sau này bằng JavaScript. Chúng tôi cũng thêm một nút trên dòng 9 để kích hoạt chức năng sẽ truy xuất dữ liệu từ máy chủ phụ trợ

đối tượng yêu cầu HTTP

Tiếp theo, đối tượng yêu cầu HTTP

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
2

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
2 này là một đối tượng có thể được sử dụng để trao đổi dữ liệu với máy chủ web phía sau hậu trường. Nó được hỗ trợ bởi tất cả các trình duyệt. Vì nó hoạt động ở hậu trường nên chúng tôi có thể cập nhật trang của mình với dữ liệu đến mà không phải tải lại trang

Thiết lập này kiểm tra xem liệu một phiên bản của đối tượng có tồn tại trên dòng 16 hay không và nếu không, hãy tạo nó rồi trả về nó

Viết hàm gọi lại

Tiếp theo, là chức năng gọi lại khi nhận được phản hồi từ phụ trợ

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
3

Hàm

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
3 này kiểm tra trạng thái của đối tượng
[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
4 để xem liệu chúng ta có mã trạng thái thành công (200) trên dòng 25 hay không. Trạng thái sẵn sàng cũng được kiểm tra. Trạng thái sẵn sàng 4 nghĩa là. yêu cầu đã hoàn thành và phản hồi đã sẵn sàng. Nếu phản hồi đã sẵn sàng, chúng tôi có thể xử lý dữ liệu

Chúng tôi cập nhật thông tin thời gian dữ liệu trên trang bằng cách gọi

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
5 trên dòng 27

Sau đó, chúng tôi đặt HTML bên trong cho dataDiv của chúng tôi thành

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
6 trên các dòng 28-30. Thuộc tính
[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
6 này phải chứa dữ liệu JSON của chúng tôi

Gửi yêu cầu

Sau đó, mã gửi yêu cầu

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
4

Ở đây, trước tiên chúng tôi phải truy xuất một phiên bản của

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
8 để gửi yêu cầu. Ở dòng tiếp theo, dòng 36, chúng tôi đặt chức năng gọi lại. Có nghĩa là, khi
[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
9 được kích hoạt, hàm
from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
0 của chúng ta sẽ được gọi

Với

from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
1, chúng tôi chỉ định loại yêu cầu mà chúng tôi muốn gửi. Trong trường hợp này, chúng tôi muốn gửi một yêu cầu HTTP
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
1 đến địa chỉ
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
6. Và tham số cuối cùng đặt
from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
4 thành
from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
5. Điều này có nghĩa là yêu cầu sẽ được gửi trong nền mà không chặn thực thi mã khác

Cuối cùng, chúng tôi gửi yêu cầu mà không có bất kỳ dữ liệu bổ sung nào trên dòng 40 với

from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
6

Chạy ứng dụng khách phía trước

Bây giờ chúng tôi đã sẵn sàng chạy máy chủ http và thử nghiệm dự án phụ trợ Python và giao diện người dùng JavaScript của chúng tôi

Nếu chúng ta khởi động máy chủ http bằng lệnh sau trong dấu nhắc lệnh/thiết bị đầu cuối.

from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
7 trang này sẽ được phục vụ tại
from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
8

Tôi có thể tích hợp python với js không?

Sau đó, khi chúng tôi điều hướng đến địa chỉ này, chúng tôi sẽ thấy

Tôi có thể tích hợp python với js không?

Chạy chương trình phụ trợ Python với giao diện người dùng JavaScript

Bây giờ chúng tôi đã xây dựng tất cả các phần và cuối cùng có thể thấy cách chúng hoạt động cùng nhau

Đảm bảo máy chủ phụ trợ đang chạy bằng cách chạy lệnh

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
0 trong dấu nhắc lệnh/thiết bị đầu cuối trong thư mục
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     +-- venv
3

Sau đó khởi động máy chủ web giao diện người dùng nếu nó không chạy trong thư mục

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
9.
from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
7

Sau đó điều hướng đến địa chỉ cho giao diện người dùng

from flask import Flask
import flask
import json

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

@app.route('/users', methods=["GET"])
def users():
    print("users endpoint reached...")
    with open("users.json", "r") as f:
        data = json.load(f)
        data.append({
            "username": "user4",
            "pets": ["hamster"]
        })

        return flask.jsonify(data)

if __name__ == "__main__":
    app.run("localhost", 6969)
8. Bây giờ khi chúng tôi nhấp vào nút, chúng tôi sẽ nhận được dữ liệu từ chương trình phụ trợ

Tôi có thể tích hợp python với js không?

Khi chúng tôi nhấp vào nút, một yêu cầu HTTP GET được gửi đến địa chỉ chúng tôi đã chỉ định. Trong khi đó, máy chủ phụ trợ đang lắng nghe các yêu cầu trên

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
1. Khi yêu cầu đến trong phần phụ trợ, hãy kiểm tra xem đường dẫn được yêu cầu
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
8 để xem liệu nó có bất kỳ tuyến đường/điểm cuối phù hợp nào không. Mã máy chủ cũng kiểm tra phương thức để xem liệu nó có được phép trên tuyến đường đó không. Nếu mọi thứ đều ổn, nó sẽ tiếp tục xử lý yêu cầu bằng cách gọi hàm
from flask import Flask
import flask
import json
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
6 trong mã Python

Gửi dữ liệu với giao diện người dùng JavaScript và nhận trên phần phụ trợ

Trong phần này, chúng tôi sẽ viết mã để gửi dữ liệu với giao diện người dùng Javascript và mã Python để nhận dữ liệu đó trên phụ trợ

Gửi dữ liệu với frontend

Trước tiên, chúng tôi sẽ thêm chức năng vào giao diện người dùng JavaScript đơn giản của chúng tôi để gửi dữ liệu đến phần phụ trợ. Chúng tôi cũng sẽ thấy rằng việc gửi một yêu cầu POST tới phần phụ trợ của chúng tôi sẽ không được phần phụ trợ trên điểm cuối

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
8 cho phép cho đến khi chúng tôi cho phép rõ ràng

Cập nhật HTML cơ thể cho các yếu tố đầu vào

Hãy thêm một số thành phần giao diện người dùng để nhập và gửi dữ liệu. HTML cập nhật

from flask import Flask
import flask
import json
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
8 trông như thế này

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
5

Chúng tôi đã thêm một trường nhập văn bản đơn giản, một nút để kích hoạt hàm

from flask import Flask
import flask
import json
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
9 và một div sẽ hiển thị phản hồi từ phần phụ trợ. Ngay cả khi gửi dữ liệu, một chương trình phụ trợ sẽ trả về một số dữ liệu xác nhận sự thành công của hoạt động. Ví dụ: khi chỉnh sửa dữ liệu, chương trình phụ trợ có thể trả về đối tượng dữ liệu đã cập nhật

Thêm mã JavaScript mới để gửi dữ liệu

Bây giờ hãy thêm một số chức năng JavaScript

Đầu tiên, chức năng gọi lại được kích hoạt khi máy chủ gửi phản hồi tới giao diện người dùng của chúng tôi

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
6

Chức năng này tương tự như

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
3 với một điểm khác biệt nhỏ. Trên dòng 62, chúng tôi kiểm tra trạng thái
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
1 thay vì
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
2. Trạng thái
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
1 thường được gửi khi dữ liệu được gửi và phần phụ trợ đã tạo một tài nguyên hoặc một phần dữ liệu mới ở phía phụ trợ trong cơ sở dữ liệu chẳng hạn. Chúng tôi cũng sẽ định cấu hình chương trình phụ trợ của mình để gửi mã trạng thái này, vì vậy ở đây chúng tôi phải phản ứng với nó

Tiếp theo, mã gửi dữ liệu thực trong yêu cầu POST

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
7

Trên các dòng 72-76, chúng tôi nhận được giá trị từ phần tử giao diện người dùng nhập văn bản của mình. Chúng tôi lấy phần tử bằng cách

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
4 và sau đó truy cập vào thuộc tính
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
5. Sau đó chúng tôi kiểm tra xem giá trị có trống hay không. Thông thường, chúng tôi cũng sẽ xác thực đầu vào theo những cách khác. Tuy nhiên, điều này nằm ngoài phạm vi của hướng dẫn này

Sau đó, chúng tôi nhận lại một phiên bản của XMLHttpRequestObject và định cấu hình chức năng gọi lại, lần này chúng tôi đặt

[
    {
        "username": "user1",
        "pets": ["dog"] 
    },
    {
        "username": "user2",
        "pets": []
    },
    {
        "username": "user3",
        "pets": ["duck", "duck", "goose"]
    }
]
9 thành chức năng gọi lại mới của chúng tôi
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
7 trên dòng 79

Trên dòng 82, chúng tôi đặt tiêu đề yêu cầu

basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
8 cho yêu cầu HTTP của chúng tôi thành
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
9. Điều này thông báo cho máy chủ phụ trợ về loại dữ liệu chúng tôi đang gửi

Cuối cùng, ở dòng 84, chúng tôi gửi dữ liệu bằng cách đặt nó vào cấu trúc JSON

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
00 và sau đó biến nó thành một chuỗi bằng cách sử dụng
basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
01

Gửi dữ liệu và nhận phản hồi lỗi

Nếu chúng tôi gửi một số dữ liệu ngay bây giờ, chúng tôi sẽ nhận được phản hồi lỗi từ máy chủ. Vì chương trình phụ trợ không cho phép phương pháp

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
02 nhưng yêu cầu của chúng tôi sẽ bị từ chối

Tôi có thể tích hợp python với js không?
Phần phụ trợ không cho phép yêu cầu POST

Chương trình phụ trợ cũng cho thấy rằng nó đã gửi phản hồi 405 (Phương thức không được phép)

Tôi có thể tích hợp python với js không?
Đầu ra phụ trợ Python khi nhận được yêu cầu POST

Tiếp theo, chúng tôi sẽ thêm chức năng vào chương trình phụ trợ của mình để cho phép yêu cầu

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
02 này và xử lý nó

Nhận yêu cầu POST trong chương trình phụ trợ Python

Trong phần này, chúng ta sẽ cập nhật hàm

from flask import Flask
import flask
import json
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
6 để nó có thể chấp nhận và xử lý các yêu cầu POST

Trước tiên, chúng tôi phải thêm một nhập khẩu

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
05

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
8

Điều này cho phép chúng tôi trích xuất thêm thông tin về các yêu cầu đến

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
9

Trong trình trang trí trên dòng 13, chúng tôi thêm phương thức “POST” vào danh sách các phương thức được phép. Giờ đây, chúng tôi hỗ trợ hai phương thức yêu cầu trên cùng một điểm cuối (

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run("localhost", 6969)
8), chúng tôi phải xác định phương thức mà mỗi yêu cầu đang sử dụng để chúng tôi có thể thay đổi hành vi của mã cho phù hợp

Chúng tôi sử dụng thuộc tính

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
07 trên đối tượng
basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
05 để xác định xem chúng tôi đang xử lý yêu cầu
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
1 hay yêu cầu
basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
02. Mã để xử lý một
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
1 vẫn giữ nguyên như những gì chúng tôi có trước đây

Mã mới của chúng tôi, dòng 25-33 xử lý yêu cầu

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
02 sắp tới

Với

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
13, chúng tôi có thể trích xuất dữ liệu JSON (tải trọng) được gửi dưới dạng từ điển JSON. Sau đó, chúng tôi trích xuất dữ liệu và gán nó cho
basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
14 trên dòng 28

Cuối cùng, trên các dòng 29-33, chúng tôi xây dựng một đối tượng dữ liệu phản hồi mới và gửi nó trở lại dưới dạng đối tượng

basic-web-app-tutorial
+ .gitignore
+-- backend
     +-- venv
15 với mã trạng thái
basic-web-app-tutorial
+ .gitignore
+-- backend
     + app.py
     + users.json
     +-- venv
+-- frontend
     + index.html
1

Hoàn thành gửi và nhận ví dụ

Bây giờ chúng ta đã sẵn sàng để gửi và nhận dữ liệu với phương thức POST HTTP request. Chúng ta nên đảm bảo khởi động lại phần phụ trợ sau khi lưu các thay đổi và làm mới/khởi động lại trang web phần đầu

Nhập một cái gì đó vào hộp văn bản đầu vào và nhấn gửi sẽ dẫn đến kết quả như sau

Tôi có thể tích hợp python với js không?
Xem dữ liệu phản hồi được in bên dưới đầu vào

Phần phụ trợ hiển thị đầu ra sau

Tôi có thể tích hợp python với js không?
Chương trình phụ trợ đang xử lý yêu cầu POST

Phần kết luận

Trong hướng dẫn này, chúng ta đã tìm hiểu về cách xây dựng một giao diện người dùng Python và phụ trợ Python cơ bản có thể giao tiếp với phụ trợ đó. Chúng tôi áp dụng các khái niệm cơ bản về giao tiếp giữa backend và frontend. Chương trình phụ trợ của chúng tôi có thể xử lý các yêu cầu GET và POST từ máy khách

Dự án đầy đủ có thể được tìm thấy trên GitHub của tôi. nơi đây

Vui lòng theo dõi tôi trên Twitter để được cập nhật các hướng dẫn mà tôi đang thực hiện

Theo dõi @tmdev82

Bình luận (18)

  • Louis nói.

    Xin chào,
    Hướng dẫn rất rõ ràng và dễ làm theo, cảm ơn bạn rất nhiều

    Bây giờ tôi đang tự hỏi làm thế nào để xuất bản các loại trang web này lên một cái gì đó như Microsoft Azure hoặc trang web tự lưu trữ. (tôi mới tham gia vào thế giới trang web và hiện tại tôi chỉ làm trang web cơ bản và một chút cấp tốc)

    Cảm ơn bạn

    • Tim nói.

      Cảm ơn về tin nhắn của bạn. Tôi rất vui vì nó hữu ích
      Tôi có thể viết một hướng dẫn về triển khai trong tương lai. Thật thú vị khi thấy bạn đề cập đến Microsoft Azure vì tôi thường nghe mọi người (những người có sở thích) đề cập đến Google Cloud hoặc Amazon Web Services. Cá nhân tôi sử dụng Microsoft Azure rất nhiều trong công việc

      Tôi cũng muốn thực hiện một hướng dẫn tương tự như hướng dẫn này nhưng với React hoặc Angular làm giao diện người dùng và có thể ghi dữ liệu vào cơ sở dữ liệu nữa. Vì vậy, một gói hoàn chỉnh bao gồm cả việc triển khai. Tôi nghĩ rằng nó sẽ được gọn gàng

      • Louis nói.

        Xin chào
        Tôi chỉ có một câu hỏi cuối cùng, khi tôi cập nhật các tệp js và py của mình và tôi dừng lại và chạy lại mặt sau/mặt trước của mình, thường mất một chút thời gian để cập nhật trên trang web

        Tôi thực sự không hiểu nó hoạt động như thế nào…

        Tôi nên làm gì khi thay đổi một số mã trong tệp của mình và nhìn thấy chúng trên trang web?

        Cám ơn rất nhiều

        • Tim nói.

          Xin chào. Cảm ơn câu hỏi của bạn. Không nhìn thấy những gì bạn đang làm, thật khó để biết điều gì gây ra sự chậm trễ trong việc cập nhật
          Tuy nhiên, có thể trình duyệt của bạn đang lưu vào bộ đệm trang web của bạn. Vì vậy, bạn có thể thử làm mới bộ đệm. Ví dụ: ctrl + nhấp vào làm mới. Nó phụ thuộc vào trình duyệt của bạn
          https. // vảikỹ thuật số. đồng. nz/blog/how-to-hard-refresh-your-browser-and-clear-cache

          Bạn cũng có thể mở các công cụ dành cho nhà phát triển trong trình duyệt của mình và tắt bộ nhớ cache ở đó cho trang web đó miễn là các công cụ dành cho nhà phát triển đang mở
          Ví dụ cho chrome. https. //www. kỹ thuật. com/google-chrome-how-to-completely-disable-cache

          Tôi hy vọng điều đó sẽ giúp

          • Louis nói.

            Cảm ơn bạn rất nhiều, đó là vấn đề
            Nó sẽ giúp tôi rất nhiều haha

          • Tim nói.

            Tuyệt vời. Vinh dự khi được giup bạn

  • Wade nói.

    Cảm ơn vì hướng dẫn rất hay này. Rất tiếc, khi tôi nhấn nút Lấy dữ liệu người dùng, từ Frontend JavaScript, tôi nhận được thông báo từ Công cụ dành cho nhà phát triển Chrome có nội dung. NHẬN http. //máy chủ cục bộ. 5000/người dùng ròng. ERR_CONNECTION_REFUSED

    Tôi có thể truy cập máy chủ phụ trợ nếu tôi nhập http. //máy chủ cục bộ. 5000 trong Chrome. Nó sẽ in Hello World. Nếu tôi nhập http. //máy chủ cục bộ. 5000/người dùng, nó sẽ in ra dữ liệu người dùng. Tôi dường như không thể truy cập máy chủ phụ trợ từ JavaScript giao diện người dùng. Cảm ơn một lần nữa cho các hướng dẫn. Nếu tôi tìm ra vấn đề tôi sẽ đăng câu trả lời

    • Tim nói.

      Xin chào, cảm ơn bạn đã gửi tin nhắn
      Đây có thể là sự cố với CORS hoặc tên máy chủ

      basic-web-app-tutorial
      + .gitignore
      +-- backend
           +-- venv
      17
      bạn có thể thử thay đổi cái này thành
      basic-web-app-tutorial
      + .gitignore
      +-- backend
           +-- venv
      18
      hoặc là
      basic-web-app-tutorial
      + .gitignore
      +-- backend
           +-- venv
      19

      • Wade nói.

        Xin chào Tim, cảm ơn một lần nữa về hướng dẫn và phản hồi của bạn. Tôi đã sử dụng ứng dụng. chạy(“0. 0. 0. 0”, 6969). Hóa ra sự cố của tôi là do JavaScript trong dòng
        hàm getUsers() {
        // yêu cầu không đồng bộ
        xhr. open(“NHẬN”, “http. //máy chủ cục bộ. 6969/người dùng”, đúng);
        }
        Tôi cần thay thế localhost bằng địa chỉ IP của máy chủ. Vì vậy, thay vì máy chủ cục bộ, tôi đã sử dụng 10. 0. 1. 42 và điều đó đã khắc phục sự cố. Sau đó, tôi có thể chạy trình duyệt của mình trên một máy tính khác và truy xuất dữ liệu. Ví dụ của bạn hoạt động với localhost nếu tôi chạy trình duyệt trên cùng một máy tính với máy chủ. Tuy nhiên, tôi có thể không bao giờ giải quyết được vấn đề này nếu không có bài viết của bạn vì vậy tôi xin ghi công bạn vì đã giải quyết vấn đề cho tôi. Cảm ơn một lần nữa

        • Tim nói.

          Ồ, tôi hiểu rồi. Tôi không biết bạn có phần phụ trợ trên một máy tính khác với phần đầu của bạn. Điều đó giải thích mọi thứ. Mã hóa vui vẻ

  • Tokaj Charles nói.

    Xin chào. Cảm ơn bạn đã hướng dẫn. Tôi là một người mới chơi trăn và điều này đã giúp ích rất nhiều

    Sau đó, nếu tôi muốn chạy thêm mã để tác động đến giao diện người dùng, bạn sẽ làm điều này như thế nào mà không cần tắt máy chủ?

    Vui lòng cho tôi biết nếu điều này không có ý nghĩa. Tôi chưa quen với điều này vì vậy tôi sẽ cố gắng diễn đạt lại

    • Tim nói.

      Xin chào, cảm ơn bạn đã gửi tin nhắn
      Nếu bạn thêm nhiều mã hơn vào chương trình phụ trợ của mình để có chức năng mới thì đôi khi bạn phải khởi động lại máy chủ phụ trợ. Điều đó khá bình thường. Sẽ không có vấn đề gì vì giao diện người dùng không có kết nối trực tiếp/thời gian thực với phần phụ trợ

      Hy vọng rằng tôi đã hiểu câu hỏi của bạn

      Chúc may mắn

      • Tokaj Charles nói.

        Cảm ơn bạn đã trả lời của bạn

        Nếu tôi muốn. 1. ) nhận đầu vào từ giao diện người dùng. 2. ) Lưu trữ nó dưới dạng một biến. 3. ) Sử dụng đầu vào để lấy dữ liệu nhất định từ một tệp. 4. ) Gửi dữ liệu đó lên giao diện người dùng, tôi sẽ phải làm như sau

        1. ) Khởi động máy chủ
        2. ) Nhận đầu vào từ máy chủ và lưu trữ
        3. ) Dừng máy chủ
        4. ) Lấy dữ liệu từ tệp
        5. ) Khởi động lại máy chủ
        6. ) Gửi dữ liệu đến giao diện người dùng
        7. ) Dừng máy chủ

        Một lần nữa hy vọng điều này có ý nghĩa LOL 🙂

        • Tim nói.

          Không vấn đề gì
          Tôi không chắc tại sao cần dừng máy chủ trong trường hợp này
          Bạn có thể viết mã nhận dữ liệu đầu vào từ người dùng, gửi nó đến phần phụ trợ, phần phụ trợ đọc một tệp và lấy dữ liệu dựa trên đầu vào của người dùng rồi gửi lại dữ liệu cho người dùng
          Máy chủ có thể tiếp tục chạy và thực hiện các hành động này mà không gặp vấn đề gì

          Ví dụ trong hướng dẫn được đơn giản hóa một chút nhưng bạn có thể thực hiện tất cả những điều này, đồng thời chỉnh sửa tệp và tải lại tệp trong khi máy chủ đang chạy

  • Lari nói.

    Chào. Tôi nghĩ hướng dẫn của bạn là hướng dẫn tốt nhất tôi từng thấy cho mục đích này. Tuy nhiên, khi thử, tôi chỉ nhận được chỉ mục các tệp của mình khi chạy localhost. 8080. Tôi đã cố gắng giữ cấu trúc

    phụ trợ
    + env
    + ứng dụng. py
    + người dùng. json
    giao diện người dùng
    + chỉ mục. html

    Có đúng không?

    • Tim nói.

      Xin chào,
      Cám ơn vì những lời tốt đẹp của bạn
      Có, cấu trúc thư mục và tệp có vẻ đúng
      Bạn đang khởi động máy chủ giao diện người dùng như thế nào?

  • Sigma nói.

    Trong Windows 11, tôi không thể khởi động máy chủ http

    PSC. \Users\bruker\Code\kanban> máy chủ http
    máy chủ http. Thuật ngữ 'máy chủ http' không được công nhận là tên của lệnh ghép ngắn, chức năng, tệp tập lệnh hoặc chương trình có thể hoạt động. Kiểm tra chính tả của tên hoặc nếu một đường dẫn được bao gồm,
    xác minh rằng đường dẫn là chính xác và thử lại
    Tai dong. 1 ký tự. 1
    + máy chủ http
    + ~~~~~~~~~~~~
    + Chuyên mụcThông tin. đối tượngkhông tìm thấy. (máy chủ http. Chuỗi) [], CommandNotFoundException
    + FullQualifiedErrorId. LệnhNotFoundException

    • Tim nói.

      Như hướng dẫn đã chỉ ra, trước tiên bạn phải cài đặt `http-server` bằng npm. “cài đặt npm –máy chủ http toàn cầu”. Nếu bạn không có npm, bạn cũng nên cài đặt nó. https. // tài liệu. npmjs. com/download-and-installing-node-js-and-npm

      Làm cách nào để kết nối js với Python?

      Đã liên kết .
      Thực thi tập lệnh python khi nhấp vào nút
      -4. Gửi dữ liệu JSON đến giao diện người dùng trong Flask
      Khởi chạy tập lệnh python từ nút html mà không quay lại
      -2. Kết nối Javascript với python

      Chúng ta có thể tích hợp Python với Nodejs không?

      Mô-đun python-shell của extrabacon là một cách đơn giản để chạy các tập lệnh Python từ Node. js với giao tiếp giữa các quá trình cơ bản nhưng hiệu quả và xử lý lỗi tốt hơn.