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

让我们学习如何将 Django 演示应用程序公开到 Internet。 也就是说,无需将其部署在托管服务中。

配置一个临时部署环境只是为了展示你的 Django 应用程序的演示是糟糕的。 更重要的是,如果您只需要几分钟的 URL,将其显示给客户或团队成员。

最好的选择是使用一种工具来公开您当前的本地服务器。 确切地! 世界各地的人们将能够看到您本地主机上发生的事情。

为此,我们将使用 恩格罗克. 该工具将允许我们根据计算机的本地端口创建公共 URL。 这一切都要归功于 隧道.

在开始本教程中使用的所有代码之前,将在本教程中提供 Github 仓库.

先决条件

建议了解所有这些基本知识。 尽管您很可能可以按照本教程进行操作,而不会出现更多问题。

创建 Django 应用程序

为了创建一个循序渐进的教程,我将解释创建 Django 项目的过程。 如果您已经有一个,则可以跳过此部分。

虚拟环境

首先,让我们创建一个 Python虚拟环境.

  • 所以打开你的系统终端(或外壳)。
  • 如果您觉得打开系统终端太复杂,请尝试使用代码编辑器的内置终端。
  • 点击 Terminal>New terminal,屏幕底部会出现一个 shell。
  • 键入以下命令以使用内置的 Python 工具创建虚拟环境。
python -m venv .venv

它基本上意味着:

嗨 Python,创建一个名为 .venv 的虚拟环境 (-m venv) 命令

  • 现在,如果您列出当前目录的文件,您应该会看到一个 .venv 文件夹。
$ ls -l
drwxr-xr-x    - daniel 30 abr 23:12 .venv
# Other files ...
  • 要激活虚拟环境,我们调用 source 命令。
source .venv/bin/activate
  • 如果你发现有什么问题,请参考下面从官方摘录的表格 蟒蛇文档.

平台

激活虚拟环境的命令
POSIX
庆典/zsh
$ 来源 /bin/激活


$ source /bin/activate.fish

csh/tcsh
$ source /bin/activate.csh

PowerShell 内核
$ /bin/Activate.ps1
视窗
命令执行程序
C:> Scriptsactivate.bat

电源外壳
PS C:> ScriptsActivate.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 服务器。

# Enter to the project directory
(.venv)$ cd mytestingproject/

# Listing the files inside the project
(.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。

  了解 IaC 工具:Cloudformation 与 Terraform

不要担心错误信息。 首先,让我们检查一下本地服务器上的一切是否正常。 为此,请转到您的网络浏览器并粘贴此方向:

http://localhost:8000/
# Do you note that localhost and 127.0.0.1 are the same?

如果一切正常,您应该会看到一个 Django 漂亮的模板。

这就是我们的 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 
# secure public URL for port 8000 web server

我们正在运行 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 访问浏览器时,奇迹发生了。

  为什么您现在需要获取虚拟桌面?

更改设置.py

哇,刚刚发生了什么😱?

由于 DisallowedHost 设置,Django 似乎正在抛出错误。 如果您检查运行 Django 服务器的 shell,以及带有 Ngrok 会话的 shell,您将得到一些调试消息。

# Django messages
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 messages
HTTP Requests                                                            
-------------                                                            
                                                                         
GET /favicon.ico               400 Bad Request                           
GET /                          400 Bad Request                           
                                              

正如 Django 告诉我们的那样,我们必须将要连接的域添加到 ALLOWED_HOSTS 配置变量。 但是我们有一个问题,那就是域名太大,容易混淆。

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

# mytestingproject/settings.py

# Line 28

# Change from
ALLOWED_HOSTS = []

# To

ALLOWED_HOSTS = ["*"]

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

现在重新加载站点,并查看结果。

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

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

结论

在本教程中,您学习了如何为 Django 项目创建演示 URL,而无需部署它。

  12 HTTP 客户端和 Web 调试代理工具

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

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

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