2011-12-19 12 views
9

Tôi đang tìm cách ghi đè/xác định một số cài đặt django riêng lẻ từ dòng lệnh mà không cần tệp cài đặt bổ sung.Django: cách chuyển cài đặt riêng lẻ sang manage.py

Điều tôi cần bây giờ là đặt cài đặt DEBUG hoặc mức ghi nhật ký mỗi khi tôi chạy lệnh quản lý của mình. Nhưng nó sẽ là tốt đẹp để có thể thiết lập bất cứ điều gì.

+0

Bạn có muốn cài đặt DEBUG mỗi lần 'python manage.py runserver' gọi hoặc bạn có lệnh tùy chỉnh của bạn 'python manage.py foo' và bạn muốn đặt DEBUG bên trong nó? – Kirill

+0

Tôi muốn đặt bất kỳ cài đặt nào cho bất kỳ lệnh nào. Như thế này: './manage.py --set =" DEBUG = True "máy chủ lưu trữ'. Có lẽ cách dễ nhất là thực thi giá trị tham số dòng lệnh ngay trong settings.py. Nhưng tôi đã hy vọng có một cách để không sửa đổi mã nguồn ở tất cả. – raacer

Trả lời

6

Đây là giải pháp của tôi. Thêm mã bên dưới vào cuối tệp cài đặt của bạn.

# Process --set command line option 
import sys 
# This module can be imported several times, 
# check if the option has been retrieved already. 
if not hasattr(sys, 'arg_set'): 
    # Search for the option. 
    args = filter(lambda arg: arg[:6] == '--set=', sys.argv[1:]) 
    if len(args) > 0: 
     expr = args[0][6:] 
     # Remove the option from argument list, because the actual command 
     # knows nothing about it. 
     sys.argv.remove(args[0]) 
    else: 
     # --set is not provided. 
     expr = '' 
    # Save option value for future use. 
    sys.arg_set = expr 
# Execute the option value. 
exec sys.arg_set 

Sau đó chỉ cần vượt qua bất kỳ mã cho bất kỳ lệnh quản lý:

./manage.py runserver --set="DEBUG=True ; TEMPLATE_DEBUG=True" 
+0

Tôi nghĩ rằng đây là cách duy nhất có thể kể từ khi Django không cung cấp bất kỳ móc cho tiền xử lý đối số dòng lệnh. Tôi tự hỏi tại sao bạn cần nó? – Kirill

+0

Xin chào Kirill. Cảm ơn bình luận của bạn. Tôi không chắc về điều này. Ngoài ra những gì tôi không thích về giải pháp của tôi là cách tôi lưu trữ giá trị tùy chọn. Nhưng tôi đã không tìm thấy cách tốt hơn để lưu tùy chọn giữa các lần nhập. – raacer

+0

Tại sao tôi cần điều này chỉ vì đây là cách nhanh chóng và dễ dàng để tinh chỉnh bất kỳ cài đặt nào trong quá trình phát triển. Tôi có thể chơi với các cài đặt mà không cần sửa đổi tập tin cài đặt. Và tôi có thể chắc chắn rằng tôi sẽ không quên thay đổi mọi thứ trở lại (điều này đôi khi gây ra vấn đề). Ngoài ra nó có thể hữu ích cho sản xuất. Có thể tinh chỉnh các thiết lập cho từng tác vụ trên cron/celery/etc. Ngay bây giờ những gì tôi cần là để chạy một số lệnh quản lý cho tôi với đầu ra gỡ lỗi, và cho đối tác của tôi với đầu ra hữu ích chỉ. Tôi không cảm thấy như tôi nên thay đổi lệnh cho những nhu cầu đó. – raacer

2

Bạn có thể thêm tùy chọn tùy chỉnh (cấp nhật ký cũ) vào lệnh của mình. Docs

Ví dụ:

from optparse import make_option 

class Command(BaseCommand): 
    option_list = BaseCommand.option_list + (
     make_option('--delete', 
      action='store_true', 
      dest='delete', 
      default=False, 
      help='Delete poll instead of closing it'), 
     ) 
    # ... 
+0

Cảm ơn bạn Denis. Chắc chắn tôi có thể. Nhưng tôi không muốn thêm tùy chọn này vào mỗi lệnh trong mỗi dự án. Tôi đang tìm một số phương pháp phổ quát hơn. – raacer

-1

Bạn có thể làm settings.py của bạn ý thức hơn về nó môi trường hiện tại:

DEBUG = socket.gethostname().find('example.com') == -1 

Dưới đây là một lựa chọn cho cơ sở dữ liệu khác nhau khi thử nghiệm:

'ENGINE': 'sqlite3' if 'test_coverage' in sys.argv else 'django.db.backends.postgresql_psycopg2', 
+0

Cảm ơn. Phương pháp này yêu cầu sửa đổi cho bất kỳ hằng số nào mà tôi cần ghi đè. Không chính xác những gì tôi muốn. – raacer

+0

Không có thứ gì như một hằng số trong Python, bất kỳ biến nào cũng có thể bị ràng buộc lại. Chúc may mắn. – gdonald

+2

Điều này không quan trọng. Hãy nói rằng thiết lập, không liên tục :) – raacer