2016-01-04 15 views
7

Điều tôi muốn đạt được:Làm thế nào để thực hiện mã trong vỏ Django bởi một kịch bản python bên ngoài?

Tôi muốn tạo tập lệnh python để tắt người dùng Django trong cơ sở dữ liệu từ CLI. Tôi đã đưa ra điều này:

$ sudo python manage.py shell 
>>> user = User.objects.get(username=FooBar) 
>>> user.is_active = False 
>>> user.save() 
>>> exit() 

Mã trên HOẠT ĐỘNG khi tôi tự nhập thủ công lệnh sau lệnh. Tuy nhiên, tôi muốn đặt thực thi các lệnh trong một kịch bản py như

$ sudo python script.py 

diffirent Bây giờ tôi đã cố gắng aproaches:

  • os.system("command1 && command2 && command3")
  • subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)

Sự cố:

Điều này không hoạt động! Tôi nghĩ rằng vấn đề này là ở đây bởi vì Python chờ đợi cho đến khi mở Django shell (lệnh đầu tiên) kết thúc đó là không bao giờ. Nó không thực hiện phần còn lại của các lệnh trong kịch bản lệnh như lệnh đầu tiên đặt nó trong Hold.

subprocess.popen có thể thực hiện lệnh trong trình bao nhưng chỉ trong vỏ Python, tôi muốn sử dụng trình bao Django.

Bất kỳ ai cũng có ý tưởng cách truy cập vỏ Django bằng tập lệnh .py để thực thi mã tùy chỉnh?

+0

Làm thế nào về 'vỏ manage.py python falsetru

Trả lời

8

Thứ nhất, bạn không nên truy cập vào vỏ Python của bạn với sudo. Không cần chạy root.

Thứ hai, cách tạo tập lệnh chạy từ lời nhắc lệnh là viết kịch bản manage.py tùy chỉnh, vì vậy bạn có thể chạy ./manage.py deactivate_users. Hướng dẫn đầy đủ để thực hiện điều đó là trong the documentation.

3

Cố gắng đầu vào các lệnh để chạy django vỏ như một tài liệu ở đây:

$ sudo python manage.py shell << EOF 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
exit() 
EOF 
2

Nếu bạn muốn thực hiện một kịch bản Python truy cập mô hình Django, trước tiên bạn cần phải thiết lập một biến môi trường:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<path>.settings") 

Trong đó bạn cần phải thay thế <path> bởi thư mục dự án của bạn, một trong đó chứa file settings.py.

Sau đó bạn có thể import các file mô hình của bạn, ví dụ:

from <path>.models import User 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
0

Dựa trên những nhận xét của Daniel trước đó trong chủ đề này tôi đã tạo ra một kịch bản đơn giản để hoàn thành công việc. Tôi đang chia sẻ điều này cho độc giả của chủ đề này, những người đang cố gắng đạt được mục tiêu tương tự. Tập lệnh này sẽ tạo một hàm "manage.py deactivate_user" hoạt động.

Đây là một tài liệu tham khảo ví dụ về Django cấu trúc thư mục ứng dụng của bạn:

Django folder structure

Bạn muốn tạo "deactivate_user.py" tập tin và đặt nó trong quản lý/lệnh/thư mục deactivate_user.py.

from django.core.management.base import BaseCommand, CommandError 
from django.contrib.auth.models import User 

class Command(BaseCommand): 
    help = 'Deactivate user in the database' 

    def handle(self, *args, **options): 
     username = raw_input('Please type the username of the user you want remove: ') 
     try: 
      user = User.objects.get(username=username) 
      user.is_active = False 
      user.save() 
      print ('User is now deactivated in the database.') 
     except User.DoesNotExist: 
      print ('Username not found') 

Gọi kịch bản bằng cách sử dụng "python manage.py deactivate_user" Bạn cũng có thể tạo ra một "activate_user" kịch bản với mã tương tự nhưng thay vì user.is_active = False sử dụng = True.

0

mở Django Shell python manage.py shell

Sau đó chạy execfile('filename.py')

Các vấn đề liên quan