如何使 Django 的开发服务器公开?一般可以吗?

Posted

技术标签:

【中文标题】如何使 Django 的开发服务器公开?一般可以吗?【英文标题】:How to make Django's devserver public ? Is it generally possible? 【发布时间】:2011-03-20 17:25:30 【问题描述】:

我目前正在试用 Django 框架,我会分享/展示/展示我为我的同事/朋友制作的一些东西。我通过 VMware 在 Win7 下的 Ubuntu 中工作。所以我的愿望/愿望是将我当前的带有端口的 pub-IP(例如http://123.123.123.123:8181/django-app/)发送给我的朋友,以便他们进行测试。

问题是 - 我使用 django 的开发服务器(python /path-to-django-app/manage.py runserver $IP:$P​​ORT)。

如何公开开发服务器?

编辑:

哦,有件事我忘了说。我很伤心,我将 VMware 与 Ubuntu 一起使用。我有一个 shellscript,它返回我当前的 int-IP 192.168.xx.xx 并将其保存在环境变量 ($CUR_IP) 中 所以,每次我想运行 django 的开发服务器时,我只需执行

python /path-to-django-site/manage.py runserver $CUR_IP:8080

通过这种方式,我成为了一个 http 地址(例如http://192.168.40.145:8080/app-name/),我可以在我的虚拟机之外使用它。我可以在我的主机(win7)机器上测试它。这实际上是我问这个问题的原因。我认为有一种方法可以使用 ext-IP 并使 runserver 在外部也可用

【问题讨论】:

根据我对 Django 文档的记忆,我认为他们声明开发服务器尚未经过安全测试,因此这确实是不可取的。正如 rebus 所说,它是单线程的,所以负载下的性能会很糟糕。最好使用 apache + 插件,或其他。 安全性和性能不是什么大问题。我唯一想要的就是展示我所做的以及它的外观。目前只有一两个人有兴趣在工作中看到这种原始垃圾=) 【参考方案1】:
python manage.py runserver 0.0.0.0:8181

这将run development server 监听端口 8181 上的所有 IP。

请注意,从Jun 17, 2011 Django development 开始,服务器默认为线程(ticket #1609)。

来自文档:

注意默认IP地址, 127.0.0.1,无法从您网络上的其他计算机访问。到 使您的开发服务器可见 到网络上的其他机器,使用 它自己的 IP 地址(例如 192.168.2.1) 或 0.0.0.0。

【讨论】:

所以,唯一的方法是配置 apache、mod_py 等?简单 - 使用“普通”网络服务器(apache、lighttp 等)而不是 django 的 DevServer? 我会说这取决于开发人员的数量,我在小团队中工作并且为了炫耀我确实使用开发服务器,但如果您需要许多并发连接,我建议使用真正的网络服务器(我们使用Apache and mod_wsgi,mod_python 不再维护。) 而且,截至更新日期,mod_python 似乎已在更新版本中发布【参考方案2】:

假设你已经安装了 ruby​​,你只需要获取 localtunnel:

gem install localtunnel

然后使用以下命令启动您的 python 开发服务器:

python manage.py runserver 0.0.0.0:8000

在另一个shell中,启动localtunnel:

localtunnel -k ~/.ssh/id_rsa.pub 8000 

这将输出一个 url 以访问您的本地服务器。

Port 8000 is now publicly accessible from http://xxxx.localtunnel.com

就是这样。

【讨论】:

gem install localtunnel 在 Ubuntu 14.04 上给出了这个:错误:在任何存储库中找不到有效的 gem 'localtunnel' (>= 0) 错误:可能的替代方案:localone、rack-tunnel @trez跨度> Ubuntu 12.04:$ sudo npm install -g localtunnel,启动你的 python 开发服务器,然后在另一个 shell $ lt --port 8000。来源:localtunnel.me 遵循@Moreno 对此答案的更新效果很好。还没有npm的小伙伴,安装nodejs.org,npm会绑定。这些来源的组合构成了我在此页面上看到的唯一真正完整的解决方案。 我们是否需要执行端口转发才能使其工作?【参考方案3】:

192.168.*.* 是 LAN 专用地址——一旦你完成了正确的 VMWare(或其他 VM 管理器)和防火墙咒语以使其可以从 LAN 访问,它仍然无法从 LAN 外部访问,即来自整个互联网(这也是一件好事,因为这样的开发服务器不是为安全性和可扩展性而设计的)。

要使具有 LAN 私有 IP 的机器的某些端口对整个 Internet 可见,您需要具有“虚拟服务器”功能的路由器(许多路由器,甚至便宜的路由器都提供它,但不可能具体启用它,因为每个品牌都有自己独特的方式)。我还建议dyndns 或其他类似服务将稳定的 DNS 名称关联到您不断变化的公共 IP(当然,除非您从连接提供商那里购买静态 IP,但后一种选择变得更加昂贵)时间)。

superuser.com 或 serverfault.com 可能会提供更好的答案和详细信息(一旦您在问题中提供了配置的每一个小细节),因为该问题与软件开发无关,而与服务器管理和配置。

【讨论】:

【参考方案4】:

我必须将此行添加到 settings.py 以使其正常工作(否则从另一台计算机访问时会显示错误)

ALLOWED_HOSTS = ['*']

然后运行服务器:

python manage.py runserver 0.0.0.0:9595

另外,请确保您的防火墙允许与所选端口(在本例中为 9595)进行通信

【讨论】:

【参考方案5】:

已回答但添加相同本地隧道的 npm 替代

sudo npm install -g localtunnel

lt --port 8000 --subdomain yash

【讨论】:

像魅力一样工作。我运行./manage.py runserver 0:8000,现在该站点在localtunnel.me 中可用【参考方案6】:

如果您使用的是 Virtualbox,您需要将 VB 中的网络设置从“NAT”更改为“Bridged Adaptor”。然后重启linux。现在,如果您运行 sudo ifconfig,您将能够看到您的 IP 地址,例如 192.168.*.* 。最后一步是运行服务器

python manage.py runserver 192.168.*.*:8000

干杯!

【讨论】:

【参考方案7】:

您需要在 VMWare 中配置桥接网络,并在 Ubuntu 防火墙中授予对目标端口的访问权限。

【讨论】:

桥接方式?我使用 NAT 设置,我可以从外部访问这个 IP(目前只有主机) 为什么(什么)我应该配置 ubuntu 防火墙?是否有必要为其他(非主机)机器启用从外部访问?【参考方案8】:

或者,您可以使用cotunnel,只需在您的 ubuntu(在 VMware 中)中运行 cotunnel 即可在 cotunnel 仪表板中更改您在本地使用的端口。它提供公共网址,您可以与您的朋友分享网址。

你的 Django 服务器可以监听 127.0.0.1 或 0.0.0.0(我更喜欢 0.0.0.0)这对 cotunnel 没关系。

【讨论】:

【参考方案9】:

我是否可以建议尝试像pyngrok 这样以编程方式为您管理ngrok 隧道?完全披露,我是它的开发者。 Django 示例here,但它就像安装pyngrok 一样简单:

pip install pyngrok

并使用它:

from pyngrok import ngrok

# <NgrokTunnel: "http://<public_sub>.ngrok.io" -> "http://localhost:8000">
http_url = ngrok.connect(8000)

没有弄乱端口、防火墙或 IP 地址,现在您还可以检查流量(这很有用,因为您在这里所做的是正在进行的开发,而不是运行 prod-ready 服务器)。

【讨论】:

以上是关于如何使 Django 的开发服务器公开?一般可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Localhost 节点 js Api 可公开访问

Django私人帖子和公开帖子的例子?

django需要gunicorn来服务REST吗?

Django static静态配置文件

您如何配置 Django 以进行简单的开发和部署?

您如何配置 Django 以进行简单的开发和部署?