如何使用 Ngrok 将 Django 演示应用程序公开到 Internet?

如何将 Django 演示应用发布到互联网

本文将介绍如何将您的 Django 演示应用程序发布到互联网,而无需将其部署到托管服务。这样做可以避免为展示应用而配置临时部署环境,特别是在只需要一个临时的 URL 来展示给客户或团队成员时。

最佳选择是使用一种工具来公开您当前的本地服务器。这样,世界各地的人们都可以看到您本地主机上发生的事情。

为此,我们将使用 ngrok。此工具允许我们根据计算机的本地端口创建公共 URL。这要归功于 隧道技术。

本教程中使用的所有代码都可以在GitHub仓库中找到。

准备工作

建议您熟悉以下基本概念。但是,您应该也可以顺利完成本教程。

创建 Django 应用

为了方便大家逐步学习,我将讲解创建 Django 项目的过程。如果您已经有了一个项目,可以直接跳过这部分。

虚拟环境

首先,创建一个 Python虚拟环境

  • 打开您的系统终端。
  • 如果觉得打开系统终端很麻烦,您可以使用代码编辑器的内置终端。
  • 点击“终端”>“新建终端”,屏幕底部会打开一个 shell。
  • 键入以下命令,使用 Python 内置工具创建虚拟环境:
python -m venv .venv

这行命令的意思是:

“嗨,Python,请使用 -m venv 命令创建一个名为 .venv 的虚拟环境。”

  • 现在,如果您列出当前目录下的文件,您应该会看到一个名为 .venv 的文件夹。
$ ls -l
drwxr-xr-x    - daniel 30 abr 23:12 .venv
# 其他文件...
  • 要激活虚拟环境,我们需要使用 source 命令。
source .venv/bin/activate
平台 Shell 激活虚拟环境的命令
POSIX bash/zsh $ source <venv>/bin/activate
fish $ source <venv>/bin/activate.fish
csh/tcsh $ source <venv>/bin/activate.csh
PowerShell Core $ <venv>/bin/Activate.ps1
Windows 命令提示符 C:\> <venv>\Scripts\activate.bat
PowerShell PS C:\> <venv>\Scripts\Activate.ps1

如果命令正确执行,您的 shell 应该会显示虚拟环境的名称。

$ source .venv/bin/activate.fish

(.venv) $

安装 Django

虚拟环境激活后,现在可以安装任何需要的 Django 版本。在这种情况下,安装最新版本是一个不错的选择。

$ pip install django
Collecting django
  Using cached Django-3.2-py3-none-any.whl (7.9 MB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting asgiref<4,>=3.3.2
  Using cached asgiref-3.3.4-py3-none-any.whl (22 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB)
Installing collected packages: pytz, asgiref, sqlparse, django
Successfully installed asgiref-3.3.4 django-3.2 pytz-2021.1 sqlparse-0.4.1

接下来,创建我们要公开的 Django 应用程序的基本项目结构。

$ django-admin startproject mytestingproject

这将创建一个名为 mytestingproject 的 Django 项目。创建完成后,我们需要进入项目结构所在的目录。让我们进入这个目录并运行 Django 服务器。

# 进入项目目录
(.venv)$ cd mytestingproject/

# 列出项目中的文件
(.venv) $ ls
mytestingproject  manage.py

现在我们已经进入了项目目录,让我们运行 Django 服务器来看看它是什么样子的。

 (.venv) $python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 01, 2021 - 04:34:25
Django version 3.2, using settings 'mytestingproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Django 告诉我们本地服务器正在我们的本地主机(127.0.0.1)上运行,默认端口为 8000。

暂时忽略错误信息。首先,我们检查一下本地服务器是否工作正常。请在您的网络浏览器中粘贴以下地址:

http://localhost:8000/
# 注意:localhost 和 127.0.0.1 是相同的。

如果一切正常,您应该会看到一个 Django 默认模板页面。

这就是我们的 Django 安装情况。

现在,我们开始发布这个 Django 项目。以下方法适用于更复杂的项目。

使用 Ngrok 发布 Django 应用

正如我之前提到的,Ngrok 是将本地服务器发布到互联网的工具之一。首先从官方网站下载 Ngrok

安装完成后,让我们执行所需的命令。

打开另一个 shell,保持 Django 服务器运行的终端不动,然后输入以下命令:

$  ngrok help
NAME:
   ngrok - tunnel local ports to public URLs and inspect traffic

More commands ....

这会快速展示 Ngrok 提供的可用命令,并确保安装过程正确完成。

要创建一个人们可以访问我们服务器的 URL,请运行:

    $ ngrok http 8000 
# 为 8000 端口的 Web 服务器创建安全公共 URL

我们使用了 http 参数,创建了一个连接到本地主机 8000 端口的 URL。

您可能会得到这样的结果:

ngrok by @inconshreveable                                                                      (Ctrl+C to quit)
                                                                                                               
Session Status                online                                                                           
Session Expires               1 hour, 59 minutes                                                               
Update                        update available (version 2.3.39, Ctrl-U to update)                              
Version                       2.3.35                                                                           
Region                        United States (us)                                                               
Web Interface                 http://127.0.0.1:4040                                                            
Forwarding                    http://cac2165aa7f8.ngrok.io -> http://localhost:8000                            
Forwarding                    https://cac2165aa7f8.ngrok.io -> http://localhost:8000                           
                                                                                                               
Connections                   ttl     opn     rt1     rt5     p50     p90                                      
                              0       0       0.00    0.00    0.00    0.00       

Ngrok 正在将那个奇怪的 URL 转发到我们的本地主机。 当您使用 Ngrok 生成的 URL 访问浏览器时,奇迹发生了。

修改 settings.py

刚才发生了什么?

Django 似乎由于 DisallowedHost 设置而抛出了一个错误。 如果您检查运行 Django 服务器的 shell 和运行 Ngrok 会话的 shell,您会看到一些调试信息。

# Django 的消息
Invalid HTTP_HOST header: 'cac2165aa7f8.ngrok.io'. You may need to add 'cac2165aa7f8.ngrok.io' to ALLOWED_HOSTS.
Bad Request: /
[01/May/2021 05:07:46] "GET / HTTP/1.1" 400 65196
Invalid HTTP_HOST header: 'cac2165aa7f8.ngrok.io'. You may need to add 'cac2165aa7f8.ngrok.io' to ALLOWED_HOSTS.

# Ngrok 的消息
HTTP Requests
-------------
                                                                         
GET /favicon.ico               400 Bad Request                           
GET /                          400 Bad Request

正如 Django 提示的那样,我们需要将要连接的域名添加到 ALLOWED_HOSTS 配置变量中。 但是,域名太长且容易出错。

因此,稍微修改一下 Django 设置以解决这个错误。打开位于项目文件夹中的 settings.py 文件。

# mytestingproject/settings.py

# 第 28 行

# 从
ALLOWED_HOSTS = []

# 修改为

ALLOWED_HOSTS = ["*"]

如果您熟悉正则表达式,您就会明白我们设置了一个通配符,允许所有主机。

现在重新加载网站,看看结果如何。

现在一切正常!如果您开始为项目创建应用,并配置 URL 和视图,所有这些都会反映在公共 URL 上。

注意:不要忘记在生产环境中更改 ALLOWED_HOSTS,因为它会导致巨大的安全漏洞。

总结

在本教程中,您学习了如何在不部署的情况下为 Django 项目创建演示 URL。

您练习了如何启动 Django 项目以及如何在 Django 中使用 settings.py 文件。

最后,您学习了如何使用 Ngrok,以及如何使用它公开任何本地服务器。

接下来,您可以探索一些流行的 Python 框架来构建 API。