Django更改默认的runserver端口

225

我想在一个外部的 config.ini 文件中指定 manage.py runserver 监听的默认端口。是否有更简单的解决方法,而不是在 manage.py 中解析 sys.argv 并插入配置的端口?

目标是每次运行 ./manage.py runserver 时无需指定地址和端口,而是从 config.ini 中获取参数。


如果您从命令行历史记录中运行该命令,则键入的按键数量甚至更少。例如,对于我来说,它是“<ctrl-r>runs<enter>”,它会自动运行与上次相同的命令,因此端口等也包括在内。 - Jonathan Hartley
19个回答

268
创建一个带有以下内容的Bash脚本:
#!/bin/bash
exec ./manage.py runserver 0.0.0.0:<your_port>

将其保存为 runserver,与 manage.py 文件放在同一目录下。

chmod +x runserver

并将其作为运行

./runserver

要么这样,要么我正在考虑添加自定义管理命令。 - jonny
你不能以编程方式运行开发服务器,因此除非使用类似“call”的东西调用shell,否则自定义命令将无法工作。如果这个解决方案适合您,请确保将其标记为已解决。 - fixmycode
我现在实际上开始使用 supervisor 来管理,这使得管理变得更加容易。 :-) 但是你的解决方案可能是除了编写专用的 runserver 脚本之外最干净的解决方案。 - jonny
Supervisor是一个不错的解决方案,但我不建议在开发环境中运行。这样会失去在终端上输出服务器信息等优势。如果你真的想使用Supervisor,我的建议是与像Gunicorn这样功能齐全的WSGI服务器一起使用。请不要将开发服务器作为生产服务器运行... - fixmycode
另外,请确保将您的端口添加到ALLOWED_HOSTS变量中。 - basquiatraphaeu
显示剩余2条评论

209

实际上在Django开发服务器中仅更改端口最简单的方法是:

python manage.py runserver 7000

这应该在 http://127.0.0.1:7000/ 上运行开发服务器。


5
这个答案是关于更改端口而不是更改默认端口的。 - physicalattraction
2
这应该是正确的答案,被接受的答案还意味着IP地址,并且出于某种原因执行manage.py,而不是通过python调用它。 - E.Serra

68

截至Django 1.9版本,我发现最简单的解决方案(基于Quentin Stafford-Fraser的解决方案)是在调用runserver命令之前,在manage.py中添加几行代码以动态修改默认端口号:

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)

虽然它并没有完全回答原始问题,而且缩进也有些混乱(代码应该从“import django”开始缩进),但我更喜欢这个答案,因为它完全自包含,不需要改变在命令行中输入的内容。 - PurpleDiane
1
@PurpleDiane 缩进已经修复。 - Flimm
我的manage.py看起来不太一样,我猜Django有所改变 - NaturalBornCamper
10
目前(截至版本2.0.3),您只需添加以下代码: from django.core.management.commands.runserver import Command as runserver; runserver.default_port = "8080 到您的manage.py文件中即可。您还可以使用以下语句更改监听地址:runserver.default_addr - Vargas

45

在运行Django时,以下所有命令都可以更改端口:

python manage.py runserver 127.0.0.1:7000

python manage.py runserver 7000

python manage.py runserver 0:7000

6
目标是每次运行 ./manage.py runserver 时无需指定地址和端口。 - JuSTMOnIcAjUSTmONiCAJusTMoNICa

14
创建一个django.core.management.commands.runserver.Command的子类,并覆盖default_port成员。将文件保存为您自己的管理命令,例如,在<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

我在这里加载默认的端口表单设置(该设置反过来又读取其他配置文件),但您也可以直接从其他文件中读取它。


这似乎是最好的解决方案,但是我的 Django 1.8.14 不认识我自己创建的文件 runserver.py。我应该在某个地方注册它吗? - physicalattraction
@physicalattraction,你的文件可能没有放在正确的位置。https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/ 以描述放置 runserver 命令的 Python 模块的位置开始。另外,也许你有另一个应用程序同样注册了名为 runserver 的命令。尝试重命名你的命令并查看是否被识别。 - Feuermurmel
1
我把它放在<app_name>/management/commands/runserver.py中,但是Django仍然使用原来的runserver。当我将其重命名为run_server.py时,它被识别了。我在你提供的页面上没有看到runserver有什么特别之处。 - physicalattraction
问题在于staticfiles正是你所建议的。因此,按照你的指示操作会导致在开发中无法提供静态文件服务。最好从django.contrib.staticfiles.management.commands进行导入。 - x-yuri

12

你可以尝试在manage.py中添加一个参数,就像这样

python manage.py runserver 0.0.0.0:5000 

使用以下命令可启动服务器:

python manage.py runserver <你的IP>:<端口号>

或者您可以像这样指定端口号:

python manage.py runserver 5000

python manage.py runserver <your port>


11
在最新版本的Django(目前为4.0.3),您可以将以下行添加到您的settings.py文件中。

from django.core.management.commands.runserver import Command as runserver
runserver.default_port = "8000"

是的,可以在4.2.2版本中正常工作。 - Geordie

10

我们创建了一个新的“runserver”管理命令,它是标准命令的简单包装器,但更改了默认端口。大致上,您需要创建management/commands/runserver.py文件,并放入以下内容:

# 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

9
在Pycharm中,您可以简单地将端口添加到参数中。

enter image description here


8
python manage.py runserver <your port>

在浏览器中运行后,输入 127.0.0.1:(你的端口号)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接