django thay đổi cổng máy chủ chạy mặc định


129

Tôi muốn đặt cổng mặc định có thể manage.py runserverlắng nghe trên một cổng không liên quan config.ini. Có cách khắc phục nào dễ dàng hơn là phân tích cú pháp sys.argvbên trong manage.pyvà chèn cổng đã định cấu hình không?

Mục đích là chạy ./manage.py runservermà không cần phải chỉ định địa chỉ và cổng mọi lúc nhưng có nó lấy các đối số từ config.ini.


Nếu bạn chạy lệnh từ lịch sử dòng lệnh của mình, thì số lần nhấn phím thậm chí còn ít hơn. Ví dụ: đối với tôi, nó là "<ctrl-r> running <enter>", và nó tự động chạy lệnh giống như lần trước, vì vậy cổng vv được bao gồm.
Jonathan Hartley

Câu trả lời:


176

tạo một tập lệnh bash với như sau:

#!/bin/bash
exec ./manage.py runserver 0.0.0.0:<your_port>

lưu nó dưới dạng máy chủ chạy trong cùng một trình duyệt như management.py

chmod +x runserver

và chạy nó như

./runserver

Hoặc là hoặc tôi đang suy nghĩ về việc thêm lệnh quản lý tùy chỉnh.
jonny

Bạn không thể chạy máy chủ phát triển theo lập trình, vì vậy một lệnh tùy chỉnh sẽ không hoạt động trừ khi nó gọi trình bao bằng cách sử dụng một cái gì đó như thế call. Nếu giải pháp này phù hợp với bạn, vui lòng đánh dấu nó là đã giải quyết.
Pablo Albornoz

Tôi thực sự đã bắt đầu sử dụng supervisorcho việc này ngay bây giờ, điều đó giúp quản lý dễ dàng hơn. :-) Nhưng giải pháp của bạn có lẽ là giải pháp sạch sẽ nhất ngoài việc viết một runserverscript chuyên dụng .
jonny

Người giám sát là một giải pháp tốt cho tôi, tôi không khuyên bạn nên sử dụng nó để chạy môi trường phát triển. Bạn mất lợi thế khi có đầu ra của máy chủ trên thiết bị đầu cuối, trong số những thứ khác. Nếu bạn thực sự muốn sử dụng trình giám sát, lời khuyên của tôi là sử dụng nó với một máy chủ WSGI đầy đủ tính năng như Gunicorn. Xin đừng chạy các máy chủ phát triển như máy chủ sản xuất của bạn ...
Pablo Albornoz

Điều này hữu ích nhưng không phức tạp khi kết hợp nhiều dự án cùng một lúc - tôi đã chấp nhận câu trả lời dưới đây chỉ định cổng được sử dụng cho từng dự án riêng biệt. Chỉ là ý kiến ​​của tôi tho.

105

Trên thực tế, cách dễ nhất để thay đổi (duy nhất) cổng trong máy chủ Django phát triển giống như:

python manage.py runserver 7000

sẽ chạy máy chủ phát triển trên http://127.0.0.1:7000/


2
Câu trả lời này là về việc thay đổi cổng chứ không phải thay đổi cổng mặc định.
thể chất vào

42

Kể từ Django 1.9, giải pháp đơn giản nhất mà tôi đã tìm thấy (dựa trên giải pháp của Quentin Stafford-Fraser) là thêm một vài dòng để manage.pytự động sửa đổi số cổng mặc định trước khi gọi runserverlệnh:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.dev")

    import django
    django.setup()

    # Override default port for `runserver` command
    from django.core.management.commands.runserver import Command as runserver
    runserver.default_port = "8080"

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Mặc dù nó không trả lời chính xác câu hỏi ban đầu và việc thụt lề bị lộn xộn (mã phải được thụt lề từ "nhập django" trở xuống), tôi thích câu trả lời này hơn vì nó hoàn toàn khép kín và không yêu cầu thay đổi những gì được nhập trên dòng lệnh.
PurpleDiane

1
@PurpleDiane Đã sửa lỗi thụt lề.
Flimm

Manage.py tôi không thực sự trông giống như vậy, tôi đoán Django thay đổi kể từ
NaturalBornCamper

6
Hiện tại (kể từ 2.0.3), bạn chỉ có thể thêm: from django.core.management.commands.runserver import Command as runserver; runserver.default_port = "8080vào management.py. Bạn cũng có thể thay đổi địa chỉ nghe bằng:runserver.default_addr
Vargas

29

Tất cả các lệnh sau đều có thể thay đổi cổng trong khi chạy django:

python manage.py runserver 127.0.0.1:7000

python manage.py runserver 7000

python manage.py runserver 0:7000

1
"Mục tiêu là chạy ./manage.py runningerver mà không cần phải chỉ định địa chỉ và cổng mọi lúc"
JuSTMOnIcAjUSTmONiCAJusTMoNICa

11

Tạo một lớp con django.core.management.commands.runserver.Commandvà ghi đè default_portthành viên. Lưu tệp dưới dạng lệnh quản lý của riêng bạn, ví dụ: dưới <app-name>/management/commands/runserver.py:

from django.conf import settings
from django.core.management.commands import runserver

class Command(runserver.Command):
    default_port = settings.RUNSERVER_PORT

Tôi đang tải cài đặt biểu mẫu cổng mặc định ở đây (lần lượt đọc các tệp cấu hình khác), nhưng bạn cũng có thể đọc trực tiếp từ một số tệp khác.


Đây có vẻ là giải pháp tốt nhất, tuy nhiên, Django 1.8.14 của tôi không nhận dạng được tệp tự tạo của tôi runserver.py. Tôi có nên đăng ký nó ở đâu đó không?
thể chất vào

@physicalattraction Tệp của bạn có thể không ở đúng vị trí. docs.djangoproject.com/en/2.0/howto/custom-management-commands bắt đầu với mô tả về nơi đặt mô-đun python cho runserverlệnh. Ngoài ra, có thể bạn có một ứng dụng khác cũng đăng ký một lệnh có tên runserver. Hãy thử đổi tên lệnh của bạn và xem nó có được nhận dạng hay không.
Feuermurmel

1
Tôi đã đặt nó vào <app_name>/management/commands/runserver.py, nhưng sau đó bản gốc của Django runserverđược sử dụng. Khi tôi đổi tên nó thành run_server.py, nó được nhận dạng. Tôi không thấy bất kỳ điều gì đặc biệt về runservertrang bạn liên kết đến.
vật lý

Vấn đề là staticfileslàm chính xác những gì bạn đề nghị . Vì vậy, việc làm theo hướng dẫn của bạn sẽ ngắt việc phân phát các tệp tĩnh đang được phát triển. Tốt nhất bạn nên nhập từdjango.contrib.staticfiles.management.commands .
x-yuri

8

Chúng tôi đã tạo một lệnh quản lý 'runningerver' mới, là một lớp bọc mỏng xung quanh lệnh tiêu chuẩn nhưng thay đổi cổng mặc định. Đại management/commands/runserver.pykhái là bạn tạo và đưa vào một cái gì đó như sau:

# Override the value of the constant coded into django...
import django.core.management.commands.runserver as runserver
runserver.DEFAULT_PORT="8001"

# ...print out a warning...
# (This gets output twice because runserver fires up two threads (one for autoreload).
#  We're living with it for now :-)
import os
dir_path = os.path.splitext(os.path.relpath(__file__))[0]
python_path = dir_path.replace(os.sep, ".")
print "Using %s with default port %s" % (python_path, runserver.DEFAULT_PORT)

# ...and then just import its standard Command class.
# Then manage.py runserver behaves normally in all other regards.
from django.core.management.commands.runserver import Command

2

Trong Pycharm, bạn có thể chỉ cần thêm cổng vào các tham số

nhập mô tả hình ảnh ở đây


1

Tôi rất muộn để đến bữa tiệc ở đây, nhưng nếu bạn sử dụng IDE như PyCharm, có một tùy chọn trong 'Chỉnh sửa cấu hình' trong trình đơn 'Chạy' (Chạy> Chỉnh sửa cấu hình) nơi bạn có thể chỉ định một cổng mặc định. Tất nhiên, điều này chỉ có liên quan nếu bạn đang gỡ lỗi / thử nghiệm thông qua PyCharm.


1

Nếu bạn muốn thay đổi cấu hình mặc định, hãy làm theo các bước sau:

  1. Mở lệnh loại đầu cuối

     $ /usr/local/lib/python<2/3>.x/dist-packages/django/core/management/commands
  2. Bây giờ, hãy mở tệp runningerver.py trong trình soạn thảo nano dưới dạng superuser

     $ sudo nano runserver.py
  3. tìm biến 'default_port' sau đó bạn sẽ thấy cổng mặc định không là '8000'. Bây giờ bạn có thể thay đổi nó thành bất cứ điều gì bạn muốn.

  4. Bây giờ thoát và lưu tệp bằng cách sử dụng "CTRL + X và Y để lưu tệp"

Lưu ý: Thay thế <2/3> .x bằng phiên bản python có thể sử dụng của bạn


0
  1. Tạo biến môi trường trong .bashrc của bạn

    xuất RUNSERVER_PORT = 8010

  2. Tạo bí danh

    bí danh runningerver = 'django-admin runningerver $ RUNSERVER_PORT'

Tôi đang sử dụng trình bao bọc zsh và virtualenvs. Tôi đặt export trong các dự án tập lệnh postactivate và asign port cho mọi dự án.

workon someproject
runserver

-2

Đây là một bài cũ nhưng dành cho những ai quan tâm:

Nếu bạn muốn thay đổi số cổng mặc định để khi bạn chạy lệnh "runningerver", bạn bắt đầu với cổng ưa thích của mình, hãy làm như sau:

  1. Tìm cài đặt python của bạn. (bạn có thể cài đặt nhiều trăn và bạn cũng có thể có phiên bản môi trường ảo của mình, vì vậy hãy đảm bảo bạn tìm đúng phiên bản)
  2. Bên trong thư mục python, định vị thư mục gói trang. Bên trong đó bạn sẽ tìm thấy cài đặt django của mình
  3. Mở thư mục django-> core -> management -> command
  4. Bên trong thư mục lệnh, hãy mở tập lệnh runningerver.py bằng trình soạn thảo văn bản
  5. Tìm trường DEFAULT_PORT. nó bằng 8000 theo mặc định. Thay đổi nó thành bất cứ điều gì bạn thích DEFAULT_PORT = "8080"
  6. Khởi động lại máy chủ của bạn: python management.py runningerver và thấy rằng nó sử dụng số cổng đã đặt của bạn

Nó hoạt động với python 2.7 nhưng nó cũng sẽ hoạt động với các phiên bản mới hơn của python. Chúc may mắn


11
Đây là gợi ý tồi tệ nhất của tất cả ở đây. IMHO, chỉnh sửa tệp từ bản phân phối không bao giờ là một ý tưởng hay và dẫn đến nhầm lẫn vì thay đổi không được VCS theo dõi và dễ dàng bị ghi đè.
Feuermurmel

Bạn không nên chỉnh sửa mô-đun Django tại các gói trang web. Nó có thể được cập nhật bằng phiên bản mới. Ngoài ra, nó ảnh hưởng đến tất cả các ứng dụng Django.
Sathindu Kavneth

-3

Tôi đã đấu tranh với cùng một vấn đề và tìm ra một giải pháp. Tôi đoán nó có thể giúp bạn. khi bạn chạy python manage.py runserver, nó sẽ lấy 127.0.0.1 làm địa chỉ ip mặc định và 8000 là số cổng mặc định có thể được định cấu hình trong môi trường python của bạn. Trong cài đặt python của bạn, hãy chuyển đến <your python env>\Lib\site-packages\django\core\management\commands\runserver.pyvà đặt 1. default_port = '<your_port>'
2. tìm mục này dưới điều khiển def và đặt
if not options.get('addrport'): self.addr = '0.0.0.0' self.port = self.default_port

Bây giờ nếu bạn chạy "python management.py runningerver", nó sẽ chạy theo mặc định trên "0.0.0.0:

Thích viết mã .....


3
Việc sửa đổi nguồn của các gói phụ thuộc được coi là hành vi xấu. Các thay đổi có thể bị mất khi cập nhật / cài đặt lại.
arogachev

Đúng vậy @arogachev, Nó chỉ là một tùy chọn mà bạn có thể tạo cổng và máy chủ mặc định. Nhưng nó thực sự không phải là một thực tiễn tốt để sửa đổi các gói phụ thuộc. bạn cũng có thể đặt IP và cổng khi chạy máy chủ của mình trong dấu nhắc lệnh.
Amrendra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.