跳转到主要内容

一个用于从SQLite数据库直接提供简单网站、JSON API和静态文件的工具。

项目描述

SQLSite

Build Status

一个从SQLite数据库直接提供简单网站、静态文件和JSON API的工具。

为什么?

SQLite是一种将数据以安全、结构良好、统一的方式存储并快速查询的绝佳方式。该项目帮助您将数据暴露给网络。

SQLSite受到Datasette的启发,但更简单。与Datasette不同,SQLSite不会自动执行任何操作。它不允许您在格式化的表格和图表中以优雅的方式探索和可视化您的数据。相反,您必须手动使用SQL查询定义如何将数据暴露给Web。

用例

  • 构建简单的网站(SQLSite适用于您可能通常使用静态网站生成器,但希望数据结构化和可查询的情况)。
  • 创建非常快速且简单的JSON API,以将SQLite数据库中的数据暴露给网络。
  • 直接从SQLite存档提供静态文件。

先决概念

首先要注意的是,SQLSite是专门为构建只读网络应用程序而设计的。它不允许您以任何方式修改底层SQLite数据库。请使用其他工具(如sqlite3命令行工具、sqlite-utils或SQLite GUI)创建和编辑您的数据库。

您需要了解的第二个概念是SQLite存档。这是一个类似于ZIP存档或Tarball的文件容器格式,但基于SQLite数据库。这使得由SQLSite服务的网站可以完全自包含。网站应用程序需要的HTML模板和静态文件与它的关系数据存储在同一文件中。下面将提供更多关于此的信息。

如何使用SQLSite

SQLSite允许您创建将传入的HTTP请求URL映射到可配置的处理器路由。处理器类似于“视图”(如果您习惯了Django、Flask等)。

在大多数Web框架中,传入URL到视图的路由配置在代码中(Django的URLConf、Flask的@app.route装饰器等)。在SQLSite中,路由配置在SQLite数据库本身中。

以下是route表的架构。要使用SQLSite的SQLite数据库,此表必须存在

CREATE TABLE route (
    pattern TEXT PRIMARY KEY NOT NULL,
    handler TEXT NOT NULL,
    config TEXT NOT NULL,
    existsquery TEXT
);

此表的列包括

pattern

这是一个模式,定义了哪些传入的URL路径将被路由匹配。例如

  • 空字符串匹配根路径(/
  • blog/ - 匹配/blog/

模式也可以是动态的:它们可以包含参数,这些参数将从路径中提取。参数语法基于Django和Flask中的类似<type:name>功能。

  • blog/<int:year>/ - 匹配(例如)/blog/2019//blog/2020/
  • blog/<slug:slug>/ - 匹配/blog/some-blog-post-slug/

可用类型包括

  • str - 匹配不带斜杠的任何文本
  • path - 类似于str但也可以接受斜杠
  • int - 匹配正整数
  • uuid - 匹配格式化的UUID(小写,带短划线)
  • slug - 匹配由ASCII字母、数字以及短划线和下划线字符组成的任何字符串

注意事项

  • 不要在模式中包含前导/
  • 如果您的模式以/结尾,则不以斜杠结尾的传入路径将重定向到带有尾随斜杠的版本(即301重定向)。如果您的模式不以/结尾,它将完全匹配传入路径(即不会重定向)。
  • 与Django和Flask不同,参数没有默认类型。您必须为每个参数指定类型和名称。

handler

这是应响应与给定pattern匹配的HTTP请求的处理器名称。有效的处理器有templatejsonstaticredirect。有关每个处理器的详细信息,请参阅下面

config

处理器的配置。此字段的意义因处理器而异。有关详细信息,请参阅下面

existsquery

此列是可选的。如果使用,它应包含在处理器运行之前执行的SQL查询,并且应返回包含单个列的单行布尔值。如果值为0,则处理器将不会运行,并且将返回404 Not Found。SQL查询可以包含命名参数,这些参数将用从路由的URL模式中捕获的值填充。

这允许您在尝试渲染之前检查数据库中是否存在行。existsquery列的示例值可能为

SELECT EXISTS(SELECT 1 FROM blogpost WHERE slug=:slug)

您还可以将查询放在SQLite存档中的文件内,并在existsquery列中使用file=yourfilename.sql

处理器

template处理器

此处理器用于通过渲染HTML页面来响应请求。它使用Jinja,并通过运行数据库查询动态构建HTML。

如果您使用template处理程序,则应将路由的config字段设置为要使用的模板的名称。但是,与通常使用Jinja2的情况不同,SQLSite不使用存储在文件系统中的模板。相反,SQLSite使用SQLite的“归档”功能将模板存储在数据库内部。有关如何使用此功能的详细信息,请参阅下文

请注意,模板路径从归档的根目录开始,因此如果您的模板位于“目录”(templates/)中,您应提供完整的路径(templates/index.html)。如果您使用Jinja的模板继承功能,也应完全限定模板名称,例如:{% extends "templates/base.html" %}

在模板中运行SQL

您的Jinja模板将包含一个特殊函数sql,该函数包含在其上下文中。这允许您运行任何数据库查询,并使用结果动态生成HTML。例如,要构建博客索引页面,您可以使用如下模板

<html>
  <head><title>Blog!</title></head>
  <body>
    <h1>My blog!</h1>
    <ul>
    {% for post in sql("SELECT * FROM blogpost") %}
      <li><a href="/posts/{{ post.slug }}/">{{ post.title }}</a></li>
    {% endfor %}
    </ul>
  </body>
</html>

使用sql函数运行的查询可以包含命名参数。到sql的第二个可选参数是一个参数值的字典。您的模板上下文中包含一个名为url的变量,它是一个包含从URL模式捕获的所有值的字典。

例如,给定路由模式blog/<slug:slug>/,您的模板在博客文章详情页中可能包含以下内容

{% with post = sql("SELECT title, content FROM blogpost WHERE slug=:slug", {"slug": url.slug})[0] %}
<h2>{{ post.title }}</h2>
{% endwith %}

您还可以通过将文件名前缀为file=传递给sql模板函数,而不是SQL字符串,将SQL放入文件中(与模板一样,文件必须存储在SQLite归档中)。

渲染Markdown

SQLSite支持使用Misaka库在模板中渲染Markdown。如果Misaka已安装(pip install misaka),则模板中可用markdown过滤器。

{{ post.content | markdown }}

static处理程序

此处理程序提供静态文件。它不提供存储在文件系统中的文件,而是直接从数据库内部的SQLite归档中提供文件。有关此功能的详细信息,请参阅下文

如果您使用static处理程序,则应将路由的config字段设置为要提供文件的归档内部的路径前缀(“目录”)。例如,要提供前缀为static的文件,您应将config列的值设置为static

路由的pattern必须包含一个名为name的参数,该参数应捕获在config中提供的前缀之后的文件名剩余部分。您应使用path参数类型。

例如,要使用文件前缀staticdir在URL前缀media下提供静态文件,请使用

INSERT INTO route (pattern, handler, config)
VALUES ('media/<path:name>', 'static', 'staticdir')

无需填充existsquery列:如果归档内部不存在文件,处理程序将自动返回404。

json处理程序

此处理程序将查询结果序列化为JSON对象列表。应将config字段设置为要执行的查询。

您还可以将查询放入SQLite归档中的文件中,并在config列中使用file=yourfilename.sql

redirect处理程序

此处理程序返回一个301永久重定向响应。应将config字段设置为一个返回要重定向到的Location的SQL查询。SQL查询可以包含命名参数,这些参数将使用从路由URL模式捕获的值填充。

例如,要重定向单个静态路径

INSERT INTO route (pattern, handler, config)
VALUES ('before/', 'redirect', 'SELECT "/after/"')

要动态路由,请尝试

INSERT INTO route (pattern, handler, config)
VALUES ('before/<slug:slug>/', 'redirect', 'SELECT "/after/" || :slug || "/"')

当然,您的查询可以执行任何任意操作,例如在表中查找重定向等。

您还可以将查询放入SQLite归档中的文件中,并在config列中使用file=yourfilename.sql

SQLite归档

SQLSite将构建网站所需的HTML模板和静态文件存储在SQLite数据库内部本身。为了实现这一点,它使用SQLite存档格式。请阅读SQLite文档以获取该功能的完整详细信息,但以下是一些简要说明。

SQLite存档只是一个普通的SQLite数据库,其中包含一个名为特定名称和模式的普通表。sqlite3命令行工具附带一些命令,用于处理存储在此表中的文件。

首先,您需要使用以下命令在数据库中创建特殊的sqlar

sqlite3 db.sqlite -Ac

然后,假设在磁盘上的以下文件夹结构

db.sqlite
static/
  cat.gif
templates/
  index.html

您可以将这些数据按以下方式复制到存档中

sqlite3 db.sqlite -Au static/* templates/*

要列出数据库中存储的文件

sqlite3 db.sqlite -At

这将返回

static/cat.gif
templates/index.html

安装SQLSite

您可以使用pip install sqlsite安装SQLSite。它需要Python 3.7+。

配置

可用的唯一配置选项是使用的SQLite数据库文件的名称。默认情况下,SQLSite使用名为db.sqlite的数据库。要更改此设置,请设置环境变量SQLSITE_DATABASE为数据库文件的名称。

运行和部署SQLSite

SQLSite实现为一个WSGI应用程序。WSGI是Python标准,用于在Web应用程序和Web服务器之间进行接口。SQLSite本身不包含Web服务器,因此您必须安装自己的。

Gunicorn是一个广泛使用的Python Web应用程序服务器。仔细阅读其文档。本地开发的一个示例命令可能是

pip install gunicorn
gunicorn --bind 0.0.0.0:8000 sqlsite:app

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

sqlsite-0.0.3.tar.gz (18.6 kB 查看哈希值)

上传时间

构建分发

sqlsite-0.0.3-py3-none-any.whl (19.8 kB 查看哈希值)

上传时间 Python 3

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面