我们很高兴地宣布推出 Cactus 3。它带来了一系列出色的新功能,例如资产指纹识别、资产管道、漂亮的 URL、本机 Mac 文件系统事件、自动名称服务器配置、对多个部署后端(Google 站点)的支持等等。大部分代码已被重写,并附有广泛的单元测试套件。非常感谢 Thomas Orozco 和其他贡献者。
Cactus 是一个简单但功能强大的静态网站生成器,使用 Python 和 Django 模板系统。 Cactus 还可以轻松进行本地开发并将站点直接部署到 S3。它非常适合公司、投资组合、个人、支持网站和博客。
要快速了解,请观看这个简短的视频教程。
Cactus 的理念是,当今网站上的大多数动态功能都可以使用 Javascript 来完成,而实际网站可以保持静态。静态网站易于托管并且通常速度非常快。
我开发 Cactus 是因为我想要一个标准、简单的系统,Sofa 的设计人员可以使用它来构建和部署快速网站。因此,典型的用户是精通技术的设计师,想要使用模板,但不喜欢乱七八糟地设置 django 或 S3。
从那时起,它已经发展了相当大的一个插件系统,支持博客、精灵、版本控制并且是可扩展的。
您可以在此黑客新闻讨论中找到有关静态站点生成器的更多讨论。
还包括一个示例博客项目。
使用以下衬垫安装 Cactus
sudo easy_install cactus
如果没有看到错误,您现在可以生成一个新项目
cactus create ~/www.mysite.com
要开始编辑和预览您的网站,请输入以下内容。然后将浏览器指向 localhost:8000 并开始编辑。 Cactus 将自动重建您的项目并根据更改刷新您的浏览器。
cd ~/www.mysite.com
cactus serve
准备好将站点部署到 S3 后,您可以运行以下命令。您将需要您的亚马逊访问密钥。如果您还没有,请在此处阅读如何获取。
cactus deploy
瞧。您的网站由 Cactus 生成并托管在 S3 上!
您可以通过生成这样的新项目结构来创建新项目。确保目标文件夹尚不存在。
cactus create [path]
如果您没有看到任何错误,那么您指向的路径现在应该如下所示。
- .build Generated site (upload this to your host)
- pages Your actual site pages
- index.html
- sitemap.xml
- robots.txt
- error.html A default 404 page
- templates Holds your django templates
- base.html
- static Directory with static assets
- images
- css
- js
- plugins A list of plugins. To enable remove disabled from the name
生成网站后,您可以通过向内容添加页面来开始构建,这可以依赖于模板。例如,如果您想要一个页面/articles/2010/my-article.html
您将在页面文件夹中创建包含目录的文件。然后你可以编辑该文件并使用django的模板功能。
当您构建站点时,它将在构建文件夹中生成一个静态版本,您可以将其上传到任何主机。基本上,它会渲染页面文件夹中的每个页面,将其复制到构建文件夹并向其中添加所有静态资源,使其成为一个独立的网站。您可以像这样构建您的网站:
cd [your-cactus-path]
cactus build
您渲染的网站现在可以在(隐藏)[path]/.build 文件夹中找到。 Cactus 还可以运行一个小型网络服务器来预览您的网站并在您进行任何更改时更新它。这在开发以获得实时视觉反馈时非常方便。
你可以像这样运行它:
cactus serve
Cactus 通过使用模板标签 {% static %} 和 {% url %} 可以轻松地相对链接到项目内的页面和静态资源。例如,如果您位于/blog/2011/Jan/my-article.html
页面并且想要链接到/contact.html
您可以编写以下内容:
<a href="{% url '/contact.html' %}">Contact</a>
只需使用您通常使用的 URL:不要忘记前导斜杠。
Cactus 使用 Django 模板。它们应该与其他模板系统非常相似,并且具有一些很好的功能,例如继承。简而言之:变量看起来像这样{{ name }}
,标签像这样{% block title %}Welcome{% endblock %}
。您可以在 django 站点阅读完整文档。
要为您的站点启用插件,请将文件名从 [PLUGIN].disabled.py 更改为 [PLUGIN].py。
Cactus 可以将您的网站直接部署到 S3,您只需要您的 Amazon 凭证和存储桶名称。 Cactus 会在配置文件 config.json 中记住这些内容,以便将来的部署变得轻松。密钥安全地存储在钥匙串或其他操作系统上的类似服务中。
cactus deploy
部署完成后即可直接访问网站。 Cactus 还确保所有文本文件都被压缩并添加缓存标头。
有关如何在 Cactus 之上构建博客的完整示例,请参阅 CactusBlog。
博客插件从元数据中获取帖子标题、作者和日期。例如:
title: My first post
author: Koen Bok
date: 22-07-2012
{% extends "post.html" %}
{% block body %}
{% endblock %}
修改config.json
以设置自定义博客路径、默认作者姓名或用于解析元数据的日期模式。默认值是:
"blog": {
"path": "blog",
"author": "Unknown",
"date-format": "%d-%m-%Y"
}
默认情况下,您可以声明要包含在每个页面上方的变量,例如:
test_text: Lorem Ipsum
<p>{{ test_text }}</p>
您可以使用 YAML 来声明变量。只需用---
和...
文档分隔符包围该块即可。然后对象和数组将在模板内可用:
---
header_text: Lorem Ipsum
custom_object:
name: Lorem
description: Ipsum
custom_array:
-
name: lorem
-
name: ipsum
...
{% for item in custom_array %}
<p>{{ header_text }}: {{ item.name }}</p>
{% endfor %}
<p>{{ custom_object.name }} | {{ custom_object.description }}</p>
PyYAML库用于此功能。
Cactus 为您的静态文件提供了资产管道。如果您想使用它,请确保使用 {% static %} 模板标记链接到您的静态资源:它们可能会在此过程中被重命名。
修改config.json
,并添加您想要指纹识别的扩展:
"fingerprint": [
"js",
"css"
],
这使您可以启用具有长过期日期的缓存。当文件更改时,其名称将反映更改。非常适合使用 CDN 时。
修改config.json
,并添加您想要优化的扩展:
"optimize": [
"js",
"css"
],
默认情况下,Cactus 将使用:
查看项目中的plugins/static_optimizes.py
以了解其工作原理。添加您自己的优化器非常容易!
如果您希望站点地图具有绝对路径,则需要将 site-url 键添加到 config.json
您可以通过添加修改配置并添加以下内容来启用此功能:
"site-url": "http://yoursite.com",
请注意,如果您希望站点地图对 Google 网站管理员工具有效,则需要执行此操作。
如果您不想在 URL 中包含“.html”,Cactus 可以为您重写这些内容,并通过创建“/my-”,使“/my-page.html”看起来显示为“/my-page/”页/index.html”文件。
您可以通过添加修改配置并添加以下内容来启用此功能:
"prettify": true
请注意,如果您要使用此功能,则绝对应该将“元规范”设置为您正在使用的 URL,以免影响您的搜索排名:
<link rel="canonical" href="{{ CURRENT_PAGE.absolute_final_url }}" />
要设置托管区域并为您的域生成正确的名称服务器记录,请确保您的存储桶是有效的域名,然后运行:
cactus domain:setup
Cactus 将返回一组名称服务器,然后您可以通过注册商输入这些名称服务器。要再次查看列表,请运行:
cactus domain:list
如果您的域名是“裸域名”(例如,没有 www),Cactus 将创建一个额外的存储桶,将您域名的 www 变体重定向到您的裸域名(因此将 www.cactus.com 重定向到 cactus.com)。以上所有内容目前仅限亚马逊。
Cactus 会根据您的页面自动生成robots.txt
和sitemap.xml
文件。
例如,这将帮助机器人为 Google 和 Bing 等索引您的页面。
Cactus 在 Python 2.6、2.7、3.4 和 3.5 上进行了测试。它可能也适用于 Python 3.3。