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ó?
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
Điều này chỉ dành cho phát triển địa phương. – Taymon
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