发布于 2026-01-06 10 阅读
0

使用 Python 和 Fauna 构建并部署无服务器 URL 缩短器 为什么要使用 Fauna? Fauna 入门 使用 Flask 构建缩短器 将 Python 应用部署到 Heroku 测试 URL 缩短器 结论

使用 Python 和 Fauna 构建并部署无服务器 URL 缩短器

为什么要使用动物群?

动物入门

用烧瓶制作我们的起酥油

将我们的 Python 应用部署到 Heroku

测试我们的网址缩短器

结论

最近,我一直在探索和尝试无服务器数据库,并用 Fauna 构建了一个 Telegram 机器人来管理待办事项列表。所以这次我决定创建一些稍微复杂一点的东西,比如一个网址缩短器。

URL缩短服务可以将冗长的网址缩短,方便在社交媒体上分享。其工作原理是生成一个简短的标识符来代表冗长的网址。当用户将该标识符提交给平台时,系统会自动将他们重定向到原始网址。

本文将使用 Python 编程语言、Flask Web 框架和无服务器数据库Fauna构建一个简单的 URL 缩短器。我们还将把应用部署到 Heroku。

为什么要使用动物群?

Fauna是一个无服务器文档数据库,提供 GraphQL 和 Fauna 查询语言 (FQL) 两种接口。它可以存储集合、索引,甚至可以与其他数据库集成(支持多租户)。以下是使用 Fauna 的几个理由:

  • Fauna 非常容易学习和集成到项目中。
  • Fauna 会在后台为您处理大量数据库操作,从而提高工作效率。
  • Fauna 为您的项目提供无限的可扩展性。
  • Fauna 允许您对业务所需的任何数据进行建模,例如关系、文档、图表或它们的组合。
  • Fauna 为您的数据库提供原生 GraphQL 支持,以及事务、自定义逻辑和访问控制等功能。
  • 动物数据库具有低延迟,因此您可以随时随地为用户提供一致的数据,这些数据会实时复制到多个区域,并从离用户最近的位置提供服务。

动物入门

第一步:建立我们的动物数据库

首先,我们需要在 Fauna 控制面板中为我们的应用创建数据库。如果您之前没有 Fauna 帐户,请在此处创建一个:https://dashboard.fauna.com/accounts/register

替代文字

请为您的数据库命名,然后点击SAVE按钮。接下来,我们需要在数据库中创建一个集合。集合类似于 SQL 表,其中包含具有相似特征的数据,例如,用户集合包含数据库中用户的信息。我们点击按钮开始操作NEW COLLECTION

替代文字

接下来,我们需要为即将创建和使用的集合命名(urls本示例中我们将使用“集合”)。填写完这些信息后,请点击SAVE按钮继续。

替代文字

替代文字

我们还需要为我们的数据集创建一个索引。Fauna 索引允许我们根据特定属性浏览存储在数据库集合中的数据。要创建索引,请导航至DB OverviewFauna 侧边栏(屏幕左侧)上的相应选项卡,然后单击NEW INDEX按钮。

替代文字

替代文字

请提供您要用于索引的名称,并设置词条,data.identifier因为我们稍后会使用该变量来引用 URL。此外,请记得为Unique索引选择属性,这可以确保数据库中没有重复条目。

步骤 2:生成动物 API 密钥

我们需要创建一个 Fauna API 密钥,才能从我们的 Python 应用程序连接到数据库。为此,请导航至 Fauna 侧边栏(屏幕左侧)上的安全设置。

替代文字

替代文字

替代文字

完成上述步骤后,您将看到您的 API 密钥(出于隐私考虑,此处已隐藏)。密钥生成后应立即复制并存储在易于查找的位置。

步骤 3:将 Fauna 与 Python 集成

接下来,我们需要获取 Fauna 的 Python 库。它可以通过 pip 安装,只需在终端输入一行命令即可。

$ pip install faunadb
Enter fullscreen mode Exit fullscreen mode

安装完成后,我们将运行 Fauna Python 驱动程序文档中提供的示例代码:https://docs.fauna.com/fauna/current/drivers/python.html

from faunadb import query as q
from faunadb.objects import Ref
from faunadb.client import FaunaClient

client = FaunaClient(secret="your-secret-here")

indexes = client.query(q.paginate(q.indexes()))

print(indexes)
Enter fullscreen mode Exit fullscreen mode

上面的代码展示了 Fauna Python 驱动程序如何使用其 API 密钥连接到数据库并打印与其关联的索引。运行此代码的结果类似于下图。

替代文字

用烧瓶制作我们的起酥油

现在我们已经成功地将 Python 脚本与 Fauna 集成,接下来让我们开始使用 Flask 构建短链接工具。为了简化操作,我们将把应用构建成 API,而不是使用 HTML 和 CSS 构建完整的 Web 应用。

步骤 1:设置 Flask 服务器

我们需要像之前安装 Fauna 库一样,使用 pip 和终端来安装 flask 库。

$ pip install flask
Enter fullscreen mode Exit fullscreen mode

让我们用 Flask 搭建一个基本的服务器,打开后会显示文本Hello World。创建一个新的项目文件夹,并在其中创建一个名为 `<project_name>` 的 Python 文件app.py,然后输入以下代码。

from flask import Flask

app = Flask(__name__)


@app.route("/")
def home():
    return "Hello World!"


if __name__ == "__main__":
    app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode

运行app.py文件后,我们应该会得到类似下图的响应。

替代文字

如果你看到了这条信息,说明你走对了方向。请在浏览器中打开以下链接http://127.0.0.1:5000以访问该应用。

替代文字

步骤 2:创建缩短函数

这是我们应用程序的核心部分,我们需要一个函数来生成一个随机字符串,该字符串将作为我们缩短网址的标识符。

import string
import random

def generate_identifier(n=6):
    identifier = ""
    for i in range(n):
        identifier += random.choice(string.ascii_letters)
    return identifier
Enter fullscreen mode Exit fullscreen mode

我们使用库choice中的方法random随机选择一个由string.ascii_letters变量提供的字母,然后将结果连接起来生成一个随机字符串。运行此函数后,我们应该得到类似下图的结果。

替代文字

您可能还需要了解一下Fauna 提供的NewId函数,该函数可用于生成基于时间的随机数,并保证在整个数据库集群中生成唯一的随机数。此外,一旦生成,这些随机数将无法再次生成。

步骤 3:构建缩短器端点

我们现在已经创建了一个负责生成标识符的函数,我们需要在 Web 应用程序中创建一个端点,该端点将接受网址作为输入,生成一个标识符,将其保存到我们的数据库中,并将缩短的 URL 提供给用户。

import string
import random
from flask import Flask, jsonify, request
from faunadb import query as q
from faunadb.objects import Ref
from faunadb.client import FaunaClient

app = Flask(__name__)
client = FaunaClient(secret="your-secret-here")


def generate_identifier(n=6):
    identifier = ""
    for i in range(n):
        identifier += random.choice(string.ascii_letters)
    return identifier


@app.route("/")
def home():
    return "Hello World!"


@app.route("/generate/<path:address>/")
def generate(address):
    identifier = generate_identifier()
    client.query(q.create(q.collection("urls"), {
        "data": {
            "identifier": identifier,
            "url": address
        }
    }))

    shortened_url = request.host_url + identifier
    return jsonify({"identifier": identifier, "shortened_url": shortened_url})


if __name__ == "__main__":
    app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode

我们使用createFQL 客户端的方法,将用户提供的原始 URL 以及我们使用生成的短标识符存储在数据库集合中client.query(q.create(q.collection(collection_name), data))

这里,我们jsonify从 Flask 导入了用于 REST API 的方法,该方法返回 JSON 数据和request变量,以便我们能够访问浏览器随请求发送到服务器的数据。当我们在浏览器中访问此端点时,应该会收到类似这样的响应。我们还可以在 Fauna 控制面板中看到新创建的文档。

替代文字

替代文字

步骤 4:编写 URL 重定向逻辑

剩下的工作就是构建逻辑,当用户收到短链接时,将其重定向到原始链接。为此,我们需要创建一个接口,该接口接收标识符作为输入,查询数据库,如果原始链接存在则将用户重定向到原始链接,否则显示 404 页面。

@app.route("/<string:identifier>/")
def fetch_original(identifier):
    try:
        url = client.query(q.get(q.match(q.index("urls_by_identifier"), identifier)))
    except:
        abort(404)

    return redirect(url["data"]["url"])
Enter fullscreen mode Exit fullscreen mode

我们从 Flask 导入了两个方法(`stop()`abortredirect`redirect()`); `stop() abort` 方法会停止当前正在运行的代码并触发指定状态码的响应,而 ` redirectredirect()` 方法会将用户重定向到另一个网址,该网址可以是您的服​​务器上的网址,也可以是外部网址。完整的代码应该类似于下面的示例。

import string
import random
from flask import Flask, jsonify, request, abort, redirect
from faunadb import query as q
from faunadb.objects import Ref
from faunadb.client import FaunaClient

app = Flask(__name__)
client = FaunaClient(secret="your-secret-here")


def generate_identifier(n=6):
    identifier = ""
    for i in range(n):
        identifier += random.choice(string.ascii_letters)
    return identifier


@app.route("/")
def home():
    return "Hello World!"


@app.route("/generate/<path:address>/")
def generate(address):
    identifier = generate_identifier()
    client.query(q.create(q.collection("urls"), {
        "data": {
            "identifier": identifier,
            "url": address
        }
    }))

    shortened_url = request.host_url + identifier
    return jsonify({"identifier": identifier, "shortened_url": shortened_url})


@app.route("/<string:identifier>/")
def fetch_original(identifier):
    try:
        url = client.query(q.get(q.match(q.index("urls_by_identifier"), identifier)))
    except:
        abort(404)

    return redirect(url["data"]["url"])


if __name__ == "__main__":
    app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode

至此,我们使用 Python 和 Fauna 实现的 URL 缩短服务的全部代码就完成了。

将我们的 Python 应用部署到 Heroku

部署应用程序意味着将其上传到网上,以便世界各地的人都可以访问它。在本文中,我们将把我们的 Python 应用程序部署到一个名为 Heroku 的免费且流行的托管平台上。

使用 Heroku 的先决条件是 Heroku 帐户、Heroku CLI 和 GIT。

步骤 1:安装 Gunicorn

Gunicorn 是一个纯 Python HTTP 服务器,专为 WSGI 应用而设计。它允许你在单个 dyno 中运行多个 Python 进程,从而实现任何 Python 应用的并发运行。在将 Web 应用部署到Heroku等平台时,它完美地兼顾了性能、灵活性和配置简易性。

$ pip install gunicorn
Enter fullscreen mode Exit fullscreen mode

步骤 2:创建wsgi.py文件

from app import app

if __name__ == "__main__":
    app.run()
Enter fullscreen mode Exit fullscreen mode

wsgi.pyWSGI 文件是我们 Python 应用程序的一个入口点,请在与应用程序相同的文件夹中创建一个名为 WSGI 的文件app.py,并将上述内容保存到该文件中。我们的文件结构应该如下所示。

替代文字

步骤 3:生成requirements.txt文件

下一步是使用requirements.txt`requirements.txt`pip freeze或 ` requirements.txt` 生成文件pipreqs。无论使用哪种方法,请确保 ` gunicornrequirements.txt` 已添加到您的 requirements 文件中。

$ pip freeze > requirements.txt
Enter fullscreen mode Exit fullscreen mode

或者

$ pip install pipreqs
$ pipreqs .
Enter fullscreen mode Exit fullscreen mode

我们的文件结构requirements.txt应该如下图所示。

替代文字

步骤 4:创建Procfile

web: gunicorn wsgi:app
Enter fullscreen mode Exit fullscreen mode

AProcfile用于指定 Heroku 应用启动时应执行的命令。Procfile在与我们的目录相同的文件夹中创建一个名为的文件app.py,然后wsgi.py将上述内容保存到该文件中。我们的文件结构应如下所示。

替代文字

第五步:在 Heroku 上创建我们的应用

在 Heroku 控制面板中导航至相应Create new app选项卡,您将看到类似下图的屏幕。为您的应用选择一个名称以及部署到的区域。

替代文字

步骤 6:将我们的应用部署到 Heroku

$ heroku login
$ git init
$ heroku git:remote -a fauna-shortener
$ git add .
$ git commit -m "deploying to heroku"
$ git push heroku master
Enter fullscreen mode Exit fullscreen mode

替代文字

替代文字

恭喜!我们已成功将应用程序部署到 Heroku,部署完成后 Heroku 将为您提供一个网址,您可以从世界任何地方访问该应用程序。由于本教程中创建的应用程序名称为 `fauna-shortener` fauna-shortener,因此其网址为`https:// fauna-shortener.herokuapp.com/`。

测试我们的网址缩短器

现在我们已经将 Web 应用部署到 Heroku,我们可以使用generate端点缩短 URL。

替代文字

替代文字

结论

URL缩短服务可以将长URL转换为较短的URL。当用户访问缩短后的链接时,系统会将用户重定向到原始URL。在本文中,我们使用Fauna的无服务器数据库构建了一个简单的URL缩短服务。我们还了解了如何轻松地将Fauna与Python集成,并有机会探索其CRUD功能,最终将我们的应用程序部署到Heroku平台。

该应用的源代码已上传至GitHub。如有任何疑问,请随时通过 Twitter 联系我:@LordGhostX

文章来源:https://dev.to/lordghostx/build-and-deploy-a-serverless-url-shortener-with-python-and-fauna-3077