Python Gemini服务器
项目描述
Gemeaux:一个Python Gemini服务器
Gemini协议(Gemini协议)是一个持续进行的倡议,旨在构建一个无杂乱、以内容为中心的互联网浏览,类似于Gopher,但进行了现代化。它侧重于隐私(TLS +无用户跟踪)并消除了现代网络周围的冗余:cookies、广告、过重的JavaScript应用程序、浏览器不兼容性等。
它被设计为让开发者能在几小时内构建一个客户端或服务器。我用了两天下午就成功提供了Gemini静态内容,所以我想我是个平均开发者。但之后,我尝试改进它,使其更加灵活和可扩展。
因此,这就是:Gemeaux
服务器。
重要说明:由于该项目仍处于早期阶段,值得指出的是,此软件绝对不适合生产环境——并且可能永远都不会;o)。
客户端
关于Gemini协议的简要说明。由于它不同于HTTP、Gopher、FTP等协议,这意味着您将不得不放弃您心爱的网络浏览器来访问Gemini内容。希望有几个客户端可用。
下载并安装几个客户端,选择一个符合您需求的,或者如果您愿意,自己构建一个,您就可以准备好在Gemini生态系统中进行太空漫步了。
出于开发目的,我建议使用bollux,这是一个为bash制作的浏览器,因为它显示有用的调试消息(并且它的速度之快,超乎您的想象)。
要求
Gemeaux
是基于标准Python 3.6+库
和语法构建的。没有外部依赖
。
自动测试使用Python 3.6、3.7和3.8进行,因此Gemeaux
的内部在这些Python版本中是安全的。
您还需要openssl
来生成证书。
快速入门
通过PyPI安装
要安装gemeaux
软件包的最新版本,在虚拟环境中或在一个安全的环境中运行以下命令
pip install gemeaux
开发者模式
git clone https://github.com/brunobord/gemeaux.git
# You may also want to use this source: git@github.com:brunobord/gemeaux.git
cd gemeaux/
pip install -e .
生成证书
由于TLS是必需的,您将不得不生成自己的SSL证书文件。使用以下命令生成自签名证书文件,针对localhost/开发者模式
make cert
此命令将生成两个文件:cert.pem
和key.pem
。
再次强调,这可能对生产环境不安全。
用法
这个概念验证的“Hello World”将是为包含index.gmi
文件的目录提供服务。
例如,index.gmi
可以看起来像这样
# Hello World!
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
然后您将创建一个包含以下内容的Python文件(例如:app.py
)
from gemeaux import App, StaticHandler
if __name__ == "__main__":
urls = {
"": StaticHandler(
static_dir="path/to/your/directory/"
),
}
app = App(urls)
app.run()
注意:static_dir
参数可以是相对路径或绝对路径。
然后您将使用Python 3运行您的程序
python app.py
然后您可以将您的客户端指向gemini://localhost/
,您将看到您主页的内容。
默认情况下,应用程序将在本地主机的端口1965
上监听,并使用之前生成的cert.pem
和key.pem
文件。
为了将您的服务器向“世界”开放,您可以像这样更改--ip
选项
python app.py --ip 0.0.0.0
重大警告:由于此软件绝对不是生产就绪的,因此向外部连接开放您的服务器绝对不是一个好主意。
您可以使用可选参数更改默认配置值。有关更多详细信息,请运行
python app.py --help
高级用法
urls
配置是应用程序工作流程的核心。通过组合可用的Handler
和Response
类,您有能力创建更复杂的Gemini空间。
如果您想查看处理程序和响应的高级用法,可以阅读example_app.py
文件中的示例应用程序。
此库中提供了几个类
处理程序
大多数时候,当与Handler
基本类一起工作时,您必须实现/覆盖两个方法
Handler.__init__(*args, **kwargs)
:类构造函数将接受args
和kwargs
来提供参数。Handler.get_response(*args, *kwargs)
:根据参数和您的当前上下文,您将生成一个Gemini兼容的响应,可以是提供的Response
类之一,或者您自己构建的。
StaticHandler
此处理程序用于服务静态目录及其子目录。
如何实例化
StaticHandler(
static_dir,
directory_listing=True,
index_file="index.gmi"
)
static_dir
:要服务的根目录的路径(相对于您的程序或绝对路径)。directory_listing
(默认:True
):如果设置为True
,则在目录中没有“索引文件”的情况下,应用程序将显示目录列表。如果设置为False
,并且在此目录中仍没有索引文件,则将向客户端返回NotFoundResponse
。index_file
(默认:"index.gmi"
):当客户端尝试访问目录时,将搜索此文件名以将其渲染为“主页”。
注意:如果您的客户端正在尝试访问类似于这样的子目录:gemini://localhost/subdirectory
(不带尾部斜杠),客户端将收到一个指向gemini://localhost/subdirectory/
(带有尾部斜杠)的重定向响应。
TemplateHandler
此处理器提供渲染Gemini内容的方法,结合文本模板和上下文变量。
构造函数没有特定的参数,但接受*args
和**kwargs
。您需要覆盖/重写两个方法,以便正确地将模板内容与上下文变量混合。
要检索模板文件,您可以覆盖/重写get_template_file()
方法
TemplateHandler.get_template_file()
或者,您可以给它一个静态的template_file
属性,如下所示
class MyTemplateHandler(TemplateHandler):
template_file = "/path/to/template.txt"
模板文件名不需要特定的文件扩展名。默认情况下,TemplateHandler
实例将使用标准库中的string.Template
模块来渲染内容。
注意:我们知道这个“模板引擎”对于高级用途来说有点过于简约;但鉴于这个项目的座右铭是“无外部依赖”。不过,这个项目是一个Python项目;因此,您可以插入您最喜欢的模板引擎,并以您希望的方式提供动态内容。
示例模板
I am a template file. Refresh me to see what time it is: $datetime
要生成您的上下文变量,您需要覆盖/重写get_context()
方法
class DatetimeTemplateHandler(TemplateHandler):
template_file = "/path/to/template.txt"
def get_context(self, *args, **kwargs):
return {"datetime": datetime.datetime.now()}
此get_context()
方法应返回一个字典。当访问时,$datetime
变量将用上下文字典中的值替换。
已知错误 & 限制
这个项目主要用于教育目的,尽管它可能可以通过本地网络使用,提供Gemini内容。在成为其他Gemini服务器软件的更稳固替代品之前,还有重要的步骤和错误需要修复。
Gemeaux
的内部结构正在Python3.6+上测试,但不是主循环机制。- 大多数Gemini标准响应都没有实现。
- 缺少响应文档,以及docstrings。
- 性能可能非常低,可能存在优化空间。
名字的含义是什么?
"Gémeaux"是法语中"Gemini"的意思。而且,我出生在双子座。
免责声明:我不相信占星术。
其他项目
许可证
Gemeaux
服务器根据MIT许可协议作为自由软件分发。有关更多详细信息,请参阅LICENSE
文件的文件内容。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。