Cách chạy tập lệnh python bên ngoài trong django

chào mọi người. Tôi có một thiết lập dự án trang web DJANGO cơ bản với 2 trang. Tôi muốn khách truy cập trang web truy cập một trang và nhấp vào nút. Khi khách truy cập nhấp vào nút, tôi muốn chạy tập lệnh python. Tập lệnh có thể là bất kỳ tập lệnh nào trên GITHUB. Vì vậy, ví dụ kịch bản phế liệu

Sau đó, tôi muốn kết quả của tập lệnh được in thành tệp CSV

Điều này có thể không và tôi sẽ làm như thế nào?

Cảm ơn bạn

Những gì tôi đã thử

Tôi đã thử nhiều hướng dẫn nhưng không có hướng dẫn nào chỉ cách thực hiện việc này. Chủ yếu là họ trả lại đầu ra cho nhật ký giao diện điều khiển

Thêm giải pháp của bạn ở đây

 B   I   U   S  small BIG code var     &  link [^] encode untab case indent outdent

Xem trước 0

thành viên hiện có

hoặc tham gia với chúng tôi

Tải xuống, Bình chọn, Nhận xét, Xuất bản

Email của bạn

Email này đang được sử dụng. Bạn có cần mật khẩu của bạn?

Mật khẩu tùy chọn

Khi trả lời câu hỏi, vui lòng.

  1. Đọc kỹ câu hỏi.
  2. Hiểu rằng tiếng Anh không phải là ngôn ngữ đầu tiên của mọi người, vì vậy hãy khoan dung với lỗi chính tả và ngữ pháp
  3. Nếu một câu hỏi được diễn đạt kém thì hãy yêu cầu làm rõ, bỏ qua nó hoặc chỉnh sửa câu hỏi và khắc phục sự cố. Xúc phạm không được chào đón
  4. Đừng bảo ai đó đọc hướng dẫn. Rất có thể họ có và không nhận được. Đưa ra câu trả lời hoặc chuyển sang câu hỏi tiếp theo
Let's work to help developers, not make them feel stupid.


Nội dung này, cùng với bất kỳ tệp và mã nguồn liên quan nào, được cấp phép theo Giấy phép Mở Dự án Code [CPOL]

Tôi có một tập lệnh đang chạy tốt và cho đầu ra ở dạng danh sách các danh sách. Tôi muốn sử dụng dữ liệu đó trong chế độ xem Django của mình. Tôi không nhận được, cách chạy tập lệnh trong chế độ xem django

Tôi đã tạo một thư mục utils bên trong đó, tôi đã đặt tập lệnh. Ngoài ra, tôi đã tạo __init__. py trong thư mục utils. Sau đó, tôi đang nhập nó vào chế độ xem của mình dưới dạng "từ utils. tên tập lệnh nhập tên lớp". Tôi đang vật lộn với điều đó từ lâu và đánh giá cao sự giúp đỡ

Vì vậy, tôi có trên mẫu HTML của mình một nút để tải tệp xls và nút gửi mà tôi muốn nó bắt đầu tập lệnh python bên ngoài bằng tệp này

Đây là dự án của tôi

Trang Chủ. html

Home

{% csrf_token %} Input xls file :



lượt xem. py

from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']

url. py

urlpatterns = [
    path[r'', views.home],
    path['external/', views.external],
]

script. py

def process[excelFile]:
    rdr = pd.read_excel[excelFile, header=None].values.tolist[]
    
    for row in rdr:
    ...

Cuối cùng, trang html dường như đã hoạt động, loại inp là django InMemoryUploadedFile nên tôi đoán nó đã được tải chính xác nhưng lỗi mà tôi gặp phải là

TypeError at /external/
str, byte hoặc os dự kiến. đối tượng PathLike, không phải InMemoryUploadedFile
.
. Phương thức yêu cầu. BƯU KIỆN.
. URL yêu cầu. http. //127. 0. 0. 1. 8000/bên ngoài/.
. Phiên bản Django. 3. 2. 7.
. Loại ngoại lệ. LoạiLỗi.
. Giá trị ngoại lệ. dự kiến ​​str, byte hoặc os. Đối tượng PathLike, không phải InMemoryUploadedFile.

Tôi nghĩ rằng có một vấn đề với kiểu của biến trong hàm run[] nhưng bạn có ý tưởng nào để sửa nó không?

Cảm ơn bạn bằng cách trước,

ptrs32

Vâng, kịch bản của tôi. py dài khoảng 600 dòng. Tôi không tưởng tượng mình sẽ tích hợp nó hoàn toàn vào chức năng bên ngoài của chế độ xem. py

Lưu ý rằng tôi không đề xuất điều đó. Tôi hiển thị external khi gọi một hàm có tên là process

ptrs32

Và điều gì sẽ xảy ra nếu tôi biến nó thành một hàm python và tôi chỉ cần nhập nó vào chế độ xem. bạn?

Một chức năng là một chức năng. Không có sự khác biệt về ngữ nghĩa cho dù một hàm nằm trong cùng một tệp hay nằm trong một tệp khác và được nhập

Xin chào các bạn, tôi muốn chỉ cho bạn cách chạy tập lệnh Python bên ngoài bên trong môi trường Django để gỡ lỗi, cho các thao tác xử lý dữ liệu, v.v. Bạn có thể sử dụng các mô-đun Django và các mô hình Django của mình bên trong tập lệnh và chạy và chạy mà không gặp bất kỳ lỗi nào. Điều tốt ở đây là bạn không cần tạo các lệnh Django để chạy tập lệnh của mình. Cách này dễ chạy và gỡ lỗi tập lệnh bên ngoài hơn

Bây giờ hãy xem cách Django khởi động

Chúng tôi sử dụng lệnh

from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']
0 để bắt đầu một dự án Django, chúng tôi kích hoạt nó bằng
from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']
1 như mọi người Django đều biết. Bên trong lệnh này, phương thức
from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']
2 được gọi và bên trong phương thức này, hàm
from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']
3 được cung cấp cho hàm
from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']
4 dưới dạng tham số và được gọi

Tại đây, một WSGIServer được khởi tạo sẽ trở thành một phần máy chủ của giao thức WSGI. Tham số WSGIRequestHandler được cung cấp vì nó sẽ được gọi bên trong WSGIServer để xử lý các yêu cầu đến

Ngoài ra còn có một phương thức set_app run. Đối tượng trình xử lý cá thể WSGIHandler của chúng tôi được cung cấp dưới dạng tham số. Phương pháp này đặt phần ứng dụng web của giao thức WSGI

Cuối cùng, hàm thực thi phương thức serve_forever và bắt đầu lắng nghe cổng

Bên trong hàm

from subprocess import run, PIPE
import sys

def home[request]:
    return render[request, 'home.html']

def external[request]:
    inp=request.FILES.get['InputFile']
    run[[sys.executable,r'pathToMyDjangoProject\script.py', inp], shell=False,stdout=PIPE]
    return render[request,'home.html']
3, hàm
os.environ.setdefault["DJANGO_SETTINGS_MODULE", "project.settings"]
0 được gọi, nơi phần ứng dụng web được thiết lập

from django.utils.version import get_version

VERSION = [4, 0, 0, 'alpha', 0]

__version__ = get_version[VERSION]


def setup[set_prefix=True]:
    """
    Configure the settings [this happens as a side effect of accessing the
    first setting], configure logging and populate the app registry.
    Set the thread-local urlresolvers script prefix if `set_prefix` is True.
    """
    from django.apps import apps
    from django.conf import settings
    from django.urls import set_script_prefix
    from django.utils.log import configure_logging

    configure_logging[settings.LOGGING_CONFIG, settings.LOGGING]
    if set_prefix:
        set_script_prefix[
            '/' if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME
        ]
    apps.populate[settings.INSTALLED_APPS]

Tại đây, quá trình ghi nhật ký được định cấu hình và sổ đăng ký ứng dụng được điền

Bây giờ hãy quay lại chủ đề chính của chúng ta. Trước khi chúng tôi chạy

os.environ.setdefault["DJANGO_SETTINGS_MODULE", "project.settings"]
1 trong tập lệnh, chúng tôi cần cung cấp cài đặt ở đâu. py trong dự án của chúng tôi

Chủ Đề