2015-02-12 15 views
5

Tôi muốn làm cho máy chủ phát triển Django làm điều gì đó trước khi nó bắt đầu chạy. Để làm điều này, tôi đã tạo ra một ứng dụng mới, thêm nó vào đầu INSTALLED_APPS, và sau đó tạo ra một tập tin management/commands/runserver.py trong ứng dụng với đoạn mã sau:Tại sao chạy được gọi hai lần trong máy chủ Django dev?

from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand 
class Command(RunserverCommand): 
    def run(self, *args, **options): 
     self.stdout.write('About to start running on ' + self.addr) 
     super(Command, self).run(*args, **options) 

(Điều tôi thực sự muốn làm là phức tạp hơn hơn là viết một dòng để stdout, tất nhiên, nhưng đây là ví dụ đơn giản nhất cho thấy vấn đề. Lý do tôi ghi đè lên run, thay vì handle hoặc một số phương pháp khác, là vì tôi cần self.addr đã được đặt khi mã này chạy.)

Khi tôi chạy ./manage.py runserver, dòng "Giới thiệu để bắt đầu chạy trên 127.0.0.1" xuất hiện không một lần, nhưng hai lần quặng máy chủ bắt đầu chạy. Tại sao điều này xảy ra và những gì có thể được thực hiện về nó?

+0

Bạn rất có thể không muốn chỉnh sửa lệnh chạy , có một cái nhìn tại chức năng móc khởi động Django được đề cập trong câu trả lời này. https://stackoverflow.com/a/16111968/742390 Tính năng tải lại tự động của máy chủ lưu trữ django, sẽ chạy mọi thứ hai lần nhưng vô hại và chỉ được sử dụng trong dev. Bạn không nên sử dụng máy chủ trong sản xuất, trong quá trình sản xuất mã khởi động sẽ chỉ chạy một lần. – Pykler

+0

Điều này chỉ dành cho phát triển địa phương. – Taymon

+0

Trong trường hợp đó bạn không nên lo lắng nhiều rằng nó chạy hai lần, vì nó thực sự chỉ là dev. Bạn muốn viết mã của mình theo cách mà nó hoạt động trong quá trình sản xuất, việc chỉnh sửa lệnh chạy sẽ không hoạt động khi bạn triển khai nó dưới uwsgi hoặc gunicorn. – Pykler

Trả lời

6

Quá trình tự động tải lại hóa ra là thủ phạm; hóa ra quá trình tự động tải sẽ nhận được cùng một đối số, và trải qua quá trình khởi tạo giống như nguyên bản. Giải pháp là chỉ có mã tiền máy chủ thực thi nếu nó không chạy trong quá trình sinh ra bởi bộ nạp tự động, có thể được phát hiện thông qua biến môi trường:

import os 
from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand 
class Command(RunserverCommand): 
    def run(self, *args, **options): 
     if os.environ.get('RUN_MAIN') != 'true': 
      self.stdout.write('About to start running on ' + self.addr) 
     super(Command, self).run(*args, **options) 
8

Máy chủ phát triển cục bộ chạy một quy trình riêng cho trình tải lại tự động. Bạn có thể tắt quá trình tự động tải lại bằng cách chuyển cờ --noreload.

python manage.py runserver --noreload 
Các vấn đề liên quan