wtxlog (Flask BLOG/CMS)

Wtxlog 是基于 Python Flask 框架开发的开源的 BLOG/CMS 系统, 以 简单实用 为目标. Wtxlog 内置栏目、标签(Tags)、文章等主要模型, 可以满足绝大部分的内容输出需求. 程序通用性良好, 各种云主机、VPS以及应用程序引擎(BAE/JAE/SAE等)均可轻松部署.

主要特性

  • 内置模型: 栏目、标签、文章、专题、友情链接等
  • 数据库: 使用 SQLAlchemy 驱动, 主要支持 SQLite 和 Mysql 两种数据库
  • 缓存功能: 主要支持 Memcached 和 FileSystemCache 两种缓存方式
  • 编辑器: CKEditor 富文本编辑器, Markdown 编辑器, 内置图片上传功能
  • 后台管理: 使用 Flask-Admin 管理后台, 功能强大, 简单易用
  • 换肤功能: 可自定义皮肤(主题), 语法兼容 Jinja2. 内置实用的过滤器和上下文处理器, 可实现常用的查询功能. 模板设计符合 SEO 优化理念
  • 静态标签: 后台增加的HTML代码片断(静态标签), 可在模板文件中直接调用
  • 支持通过 MetaWeblog 发布文章
  • 新增文章发布后自动 Ping 通知百度
  • 其它功能: Sitemap, Feed, robots.txt, favicon.ico, etc.

注解

源码: wtxlog @ GitHub

主要依赖的 Flask 扩展插件

  • Flask-SQLAlchemy 数据库模型
  • Flask-Cache 缓存
  • Flask-Admin 后台管理
  • Flask-Login 用户登录
  • Flask-Mail 邮件发送

Contents:

应用部署

基本要求: Python 2.7.X

运行环境

APP的运行环境默认会根据服务器环境变量 SERVER_SOFTWARE 来确定. BAE/JAE/SAE 这 3 个环境的 SERVER_SOFTWARE 是固定的; 其他环境可以通过设置机器的环境变量 APP_CONFIG 来更改默认的运行环境.

LINUX设置方法(示例)

APP_CONFIG='production' python manage.py deploy

WINDOWS设置方法(示例)

set APP_CONFIG=production
python manage.py deploy

运行环境说明:

development/default/local 调试开发环境, 默认的选项, 使用内置服务器, 运行应用时为这个环境
production 生产环境, 一般是指通过 Gunicorn 运行应用时的环境
testing 测试环境
bae BAE应用引擎环境
jae JAE应用引擎环境
sae SAE应用引擎环境

部署应用

注解

SQLAlchemy 数据库连接 URI 也可通过操作系统环境变量 DATABASE_URI 设置.

本地环境

本地环境 是指对操作系统有绝对操作权的环境, 主要指 Windows 和 Linux 开发环境, 以及Linux生产环境.

本地环境通过 pip + virtualenv 方式部署.

下载源码:

https://github.com/wtx358/wtxlog/ 下载 wtxlog 最新源代码

安装依赖:

使用 requirements/common.txt 来安装依赖, 本地环境默认使用SQLite数据库:

pip install -r requirements/common.txt

运行程序:

如果通过 virtualenv 来运行程序, 需要先激活虚拟环境.

初始化数据库:

python manage.py deploy

运行程序:

python manage.py runserver

若需要强制开启 debug 和 reload 的模式, 请加上参数 -d -r.

BAE环境

参考: SECRET_KEY , 数据库配置 , 缓存Cache

准备工作:

  1. 申请 BAE 账号, 创建工程, 解决方案勾选 使用BAE, 类型选择 python-web, 代码版本工具建议选择 Git.
  2. 进入 BAE3 应用管理控制台, 开发者服务 -> 应用引擎
  3. 扩展服务 中添加 BAE MySQL数据库, 记下数据库相关信息, 后面会用到
  4. 扩展服务 中添加 Cache 服务 (如果有配额的话), 记下 资源名称
  5. 部署列表添加部署, 类型选择 python-web, 使用 SVN 或 GIT 工具将代码 checkout 到本地

更改设置:

  1. https://github.com/wtx358/wtxlog/ 下载 wtxlog 最新源代码

  2. 编辑根目录下的 config.py 文件

    更改 SECRET_KEY (位于 Config 类):

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    

    SECRET_KEY 可使用 os.urandom(24) 随机生成.

    更改 BAE 相关信息 (位于 BAEConfig 类):

    BAE_AK = ''
    BAE_SK = ''
    
    # BAE MEMCACHE
    CACHE_TYPE = 'wtxlog.ext.baememcache'
    CACHE_BAE_USERNAME = BAE_AK
    CACHE_BAE_PASSWORD = BAE_SK
    CACHE_BAE_SERVERS = 'cache.duapp.com:20243'
    CACHE_BAE_ID = ''
    
    # mysql configuration
    MYSQL_USER = BAE_AK
    MYSQL_PASS = BAE_SK
    MYSQL_HOST = 'sqld.duapp.com'
    MYSQL_PORT = '4050'
    MYSQL_DB = ''
    

    若没有启用 Cache 服务或者方便调试, 请把 CACHE_TYPE 注释掉.

设置依赖:

修改根目录 requirements.txt 文件内容如下:

-r requirements/bae3.txt

应用引擎会自动安装依赖.

上传:

  1. 将前面修改好的 wtxlog 代码拷贝到 BAE 本地目录
  2. 通过 SVN/GIT 上传所有文件
  3. 上传之后发布到最新版本

接下来: 数据库初始化 , 网站管理员

SAE环境

参考: SECRET_KEY, 缓存Cache

准备工作:

  1. 申请 SAE 开发账号, 创建 Python Web 应用

    SAE 新手入门: http://sae.sina.com.cn/doc/tutorial/index.html

  2. 进入 SAE 应用管理控制台

  3. 在服务管理中初始化 MySQL 数据库

  4. 在服务管理中初始化 Memcache

  5. 使用 SVN 工具将代码 checkout 到本地

更改设置:

  1. https://github.com/wtx358/wtxlog/ 下载 wtxlog 最新源代码

  2. 修改应用信息, 编辑根目录下的 config.yaml 文件

    config.yamlnameversion 改为你自己的:

    name: appname
    version: 1
    
  3. 更改设置, 编辑根目录下的 config.py 文件

    更改 SECRET_KEY (位于 Config 类):

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    

    SECRET_KEY 可使用 os.urandom(24) 随机生成.

    缓存设置(位于 SAEConfig 类), SAE 内置 Memcached 缓存服务, 需要在控制面板初始化:

    CACHE_TYPE = 'memcached'
    

    若没有初始化 Memcached 服务或者方便调试, 请把 CACHE_TYPE 注释掉.

安装依赖:

SAE 预装有一些模块, 但有些版本比较旧, 且不支持通过 requirements.txt 自动安装依赖, 所以只能把依赖包导出来, 连同代码一起上传到 SVN 代码库.

基本思路: 先本地通过 virtualenv 安装好依赖, 然后利用 bundle.py 导出依赖, 最后复制到应用根目录下的 mydeps 或者 deps 目录.

步骤如下:

  1. 使用 virtualenv 创建一个 pip 虚拟环境, 并进入:

    LINUX:

    virtualenv myenv
    source myenv/bin/activate
    

    WINDOWS:

    virtualenv myenv
    myenv\Scripts\activate.bat
    
  2. requirements/common.txt 复制到当前目录, 并命名为 requirements.txt

  3. 使用 requirements.txt 安装依赖包:

    pip install -r requirements.txt
    
  4. 使用 bundle_local.py 导出依赖包:

    python bundle_local.py -r requirements.txt
    

    PS: bundle_local.py 可在 https://github.com/sinacloud/sae-python-dev-guide 找到.

  5. 现在当前目录下会有一个 virtualenv.bundle 目录, 把 virtualenv.bundle 目录下的所有内容复制到 mydeps 或者 deps 目录即可.

    虽然 SAE 支持 virtualenv.bundle.zip 这种依赖包导入方式, 但经过测试, 会引发一些不可控的问题, 所以不建议使用这种方式.

上传:

  1. 将前面修改好的 wtxlog 代码拷贝到 SAE 本地目录
  2. 使用 SVN 上传所有文件
  3. 代码上传后应用引擎会自动部署代码

接下来: 数据库初始化, 网站管理员

JAE环境

参考: SECRET_KEY , 数据库配置

准备工作

  1. 申请 JAE 开发账号, 新建应用, 应用服务器类型 选择 Python-Web
  2. 进入 JAE 应用引擎控制台
  3. 在云数据库中新建 MySQL 数据库, 记下数据库相关信息, 后面会用到
  4. 使用 GIT 工具将代码 clone 到本地

更改设置:

  1. https://github.com/wtx358/wtxlog/ 下载 wtxlog 最新源代码

  2. 编辑根目录下的 config.py 文件

    更改 SECRET_KEY (位于 Config 类):

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    

    SECRET_KEY 可使用 os.urandom(24) 随机生成.

    更改 JAE 相关信息(位于 JAEConfig 类):

    # mysql configuration
    MYSQL_USER = ''
    MYSQL_PASS = ''
    MYSQL_HOST = ''
    MYSQL_PORT = ''
    MYSQL_DB = ''
    

设置依赖:

修改根目录 requirements.txt 文件内容如下:

-r requirements/jae.txt

应用引擎会自动安装依赖.

上传:

  1. 将前面修改好的 wtxlog 代码拷贝到 BAE 本地目录

  2. 通过 GIT 上传所有文件

  3. 上传之后进行快速部署

    PS: 如果部署不成功, 多试几次, 或者加大内存再试.

接下来: 数据库初始化, 网站管理员

生产环境

推荐使用 Nginx + Gunicorn + Supervisor 这种相对简单的部署方式.

安装 Supervisor:

Supervisor 通过 easy_install 或 pip 在系统级别安装:

easy_install supervisor

或者:

pip install supervisor

安装 Gunicorn:

Gunicorn 通过 Virtualenv 在虚拟环境安装:

pip install gunicorn==18.0

安装依赖:

安装 requirements/common.txt 中的依赖即可:

pip install -r requirements/common.txt

配置文件:

注意: {{approot}} 为 wtxlog 应用程序实际所在绝对路径, 请替换为实际路径.

Supervisor 配置:

[program:wtxlog]
user=www
directory={{approot}}
command=/bin/env env/bin/gunicorn -b unix:app_wtxlog.sock manage:app
process_name=%(program_name)s
numprocs=1
autostart=true
autorestart=true
stopsignal=QUIT
redirect_stderr=true

Nginx 配置:

server
{
    server_name example.com;

    set $approot {{approot}};
    root $approot/wtxlog;

    location / { try_files $uri @myapp; }
    location @myapp {
        proxy_pass http://unix:$approot/app_wtxlog.sock;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ^~ /admin/static/ {
        alias $approot/wtxlog/static/admin/;
        expires 30d;
    }

    location ^~ /_themes/imtx/ {
        alias $approot/wtxlog/themes/imtx/static/;
        expires 10d;
    }

    access_log  /path/to/example.com.log  access;
}
数据库初始化

方法1

若拥有操作系统的操作权, 可通过下面的方法初始化:

$ python manage.py deploy

方法2

在应用引擎中, 通过导入 schema.sql 文件的方法初始化数据库.

网站管理员

方法1

config.py 中设置好之后, 在网页上用对应的邮箱注册账号并激活即可.

方法2

先注册账号, 然后修改数据库相关记录, 然后修改下面两个字段的值:

  • role_id 设置为 Administrator 对应的数值
  • confirmed 设置为逻辑真(或者数值1)

配置信息

内置的配置值
THEME 主题(模板)的名称
SITE_NAME 站点名称
BLOG_MODE 博客模式, 默认为 True, 如果要做为 CMS, 则设为 False
BODY_FORMAT 正文格式, 支持 MARKDOWN 和 HTML 两种
SECRET_KEY 密钥, 必须设置, 很重要
MAIL_SERVER 邮件服务器地址
MAIL_PORT 邮件服务器端口, 默认为25
MAIL_USERNAME 邮件服务器用户名, 注意是明文的
MAIL_PASSWORD 邮件服务器用户密码, 注意是明文的
MAIL_USE_TLS 使用 TLS 连接, GMAIL邮箱需要设置为 True
MAIL_USE_SSL 使用 SSL 连接, QQ企业邮箱需要设置为 True
APP_ADMIN 网站管理员邮箱
CACHE_TYPE 缓存类型, 有 simple, memcached, filesystem, wtxlog.ext.baememcache 4 种.
CACHE_KEY 缓存名称, 默认值为 view/%s
CACHE_DEFAULT_TIMEOUT 缓存过期时间, 默认为 300 秒
CACHE_KEY_PREFIX 内存类缓存前缀, 只对 RedisCache/MemcachedCache/GAEMemcachedCache 有效
QINIU_AK 七牛云存储 API Key
QINIU_SK 七牛云存储 Secret Key
QINIU_BUCKET 七牛云存储 bucket 名称
QINIU_DOMAIN 七牛云存储域名, 默认为 bucket.qiniudn.com
BAE_AK BAE 应用引擎 API Key
BAE_SK BAE 应用引擎 Secret Key
CACHE_BAE_SERVERS BAE CACHE 服务主机地址
CACHE_BAE_ID BAE CACHE 服务名称
CACHE_BAE_USERNAME BAE CACHE 服务用户名, 默认与 BAE_AK 相同
CACHE_BAE_PASSWORD BAE CACHE 服务用户密码, 默认与 BAE_SK 相同
MYSQL_HOST MYSQL 主机地址
MYSQL_PORT MYSQL 主机端口
MYSQL_USER MYSQL 用户名
MYSQL_PASS MYSQL 用户密码
MYSQL_DB MYSQL 数据库名称
管理员邮箱及SMTP信息

编辑 config.py, 找到下面的内容(位于 Config 类), 并修改为自己对应的信息即可:

MAIL_SERVER = os.environ.get('MAIL_SERVER')
MAIL_PORT = int(os.environ.get('MAIL_PORT') or 25)
MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
#MAIL_USE_TLS = True

APP_MAIL_SUBJECT_PREFIX = '[%s]' % SITE_NAME
APP_MAIL_SENDER = '%s Admin <%s>' % (SITE_NAME, MAIL_USERNAME)
APP_ADMIN = os.environ.get('APP_ADMIN')

示例:

MAIL_SERVER = 'smtp.126.com'
MAIL_PORT = int(os.environ.get('MAIL_PORT') or 25)
MAIL_USERNAME = 'test01@126.com'
MAIL_PASSWORD = 'yourpassword'
#MAIL_USE_TLS = True

APP_MAIL_SUBJECT_PREFIX = '[%s]' % SITE_NAME
APP_MAIL_SENDER = '%s Admin <%s>' % (SITE_NAME, MAIL_USERNAME)
APP_ADMIN = 'myadmin@126.com'

说明: 因为有些 SMTP 服务器强制要求发件地址与发件人一致(以防发送假冒邮件), 所以建议 MAIL_USERNAME 设置为完整邮件地址.

七牛云存储接口信息

编辑 config.py, 找到下面的内容(位于 Config 类), 并修改为自己对应的信息即可:

# QiNiu Cloud Storage
QINIU_AK = os.environ.get('QINIU_AK')
QINIU_SK = os.environ.get('QINIU_SK')
QINIU_BUCKET = os.environ.get('QINIU_BUCKET')

说明: 虽然各个引用引擎都提供云存储功能, 但接口差别比较大, 为了方便和统一, 决定使用第三方云存储来存储上传的文件.

七牛云存储官网: http://www.qiniu.com/

静态文件映射

默认情况下已经根据各平台对静态文件映射进行处理了, JAE 目前不支持静态映射.

特别说明: 如果新增加主题模板, 则需要在 app.confconfig.yaml 增加映射关系.

网站名称

编辑 config.py, 找到下面的内容(位于 Config 类), 并修改为自己对应的信息即可:

SITE_NAME = u'wtxlog'

注意是 Unicode 类型的.

SECRET_KEY

编辑 config.py, 找到下面的内容(位于 Config 类), 并修改为自己对应的信息即可:

SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'

小提示: 可以使用 os.urandom(24) 来生成随机字符串.

示例:

SECRET_KEY = '6\xbbyVZ\xe7\xb5\x80\xff\xcf\xae`*\xf32\x82\xcf=\xf9\x97z\x01_'
缓存Cache

应用程序引擎一般会支持 Memcached 缓存(或者兼容 Memcached), 云主机(VPS)可使用 Memcached 或者 FileSystemCache.

SAE

SAE不需要设置, 只需要在控制面板初始化 Memcached 即可.

若需要禁用缓存或者方便调试, 请设置 SAEConfig.CACHE_TYPE 的值.

BAE

若要使用缓存, 需要先在扩展服务里申请 Cache 服务, 并填写 Cache 相关信息.

编辑 config.py, 找到下面的内容(位于 BAEConfig 类), 并修改为自己对应的信息即可:

# BAE MEMCACHE
CACHE_TYPE = 'wtxlog.ext.baememcache'
CACHE_BAE_USERNAME = BAE_AK
CACHE_BAE_PASSWORD = BAE_SK
CACHE_BAE_SERVERS = 'cache.duapp.com:20243'
CACHE_BAE_ID = ''

BAE_AK, BAE_SK 需要预先定义.

JAE

JAE 目前不支持 Memcached 缓存.

云主机/VPS

默认启用 Memcached 缓存.

若要启用 FileSystemCache, 编辑 config.py, 找到下面的内容(位于 ProductionConfig 类), 把注释取消掉:

# memcached type configuration values
CACHE_TYPE = 'memcached'
CACHE_MEMCACHED_SERVERS = ['127.0.0.1:11211']

# filesystem type configuration values
#CACHE_TYPE = 'filesystem'
#CACHE_DIR = os.path.join(basedir, 'data', 'cache')
数据库配置

本地环境或者虚拟主机可以使用 SQLite 数据库, 但 BAE, SAE, JAE 目前只能使用 MySQL 数据库.

BAE

编辑 config.py, 找到下面的内容(位于 BAEConfig 类中), 并修改为自己对应的信息即可:

# mysql config
MYSQL_USER = BAE_AK
MYSQL_PASS = BAE_SK
MYSQL_HOST = 'sqld.duapp.com'
MYSQL_PORT = '4050'
MYSQL_DB = ''

BAE_AK, BAE_SK 需要预先定义.

SAE

SAE 环境数据库信息可以通过应用引擎常量获取, 无需手动设置.

JAE

编辑 config.py, 找到下面的内容(位于 JAEConfig 类中), 并修改为自己对应的信息即可:

# mysql config
MYSQL_USER = ''
MYSQL_PASS = ''
MYSQL_HOST = ''
MYSQL_PORT = ''
MYSQL_DB = ''
网站图标 favicon.ico

favicon.ico 默认路径为 wtxlog/static/favicon.ico, 若有需要, 直接替换即可. 建议尺寸 16x16 或者 32x32.

模型

栏目/分类 Category

属性分类 属性名称 中文说明
基本属性 id 自动编号
slug 英文标识符
longslug 栏目路径
name 栏目名称
parent 父级栏目
seotitle SEO标题
seokey SEO关键词
seodesc SEO描述
thumbnail 缩略图URL
template 栏目页模板文件
article_template 栏目下属文章页模板文件
body 栏目介绍
body_html 栏目介绍HTML
特殊属性 link 栏目的URL链接(包含域名)
shortlink 栏目的URL链接
count 栏目文章数(包含子栏目)
parents 栏目的上级目录列表
tree 树形列表

标签 Tag

属性分类 属性名称 中文说明
基本属性 id 自动编号
name Tag名称
seotitle SEO标题
seokey SEO关键词
seodesc SEO描述
thumbnail 缩略图URL
template Tag列表页模板文件
body Tag介绍
body_html Tag介绍HTML
特殊属性 link Tag的URL链接(包含域名)
shortlink Tag的URL链接
count Tag文章数

专题 Topic

属性分类 属性名称 中文说明
基本属性 id 自动编号
slug 英文唯一标识符
name 专题名称
seotitle SEO标题
seokey SEO关键词
seodesc SEO描述
thumbnail 缩略图URL
template 专题页模板文件
body 专题介绍
body_html 专题介绍HTML
特殊属性 link Tag的URL链接(包含域名)
shortlink Tag的URL链接
count Tag文章数

文章 Article

属性分类 属性名称 中文说明
基本属性 id 自动编号
slug 英文标识符,目前暂时无效
title 标题
seotitle SEO标题
seokey SEO关键词
seodesc SEO描述
category 所属栏目(基于Category模型)
topic 所属专题(基于Topic模型)
tags Tags标签列表(基于Tag模型)
thumbnail 缩略图URL
thumbnail_big 大缩略图URL
template 内容页模板文件
summary 摘要
body 正文
body_html 正文HTML
published 发表标记
ontop 置顶标记
recommend 推荐标记
hits 点击数
author 作者(基于User模型)
created 创建的时间
last_modified 最后更新的时间
特殊属性 has_more 是否有MORE分隔符
link 文章的URL链接(包含域名)
shortlink 文章的URL链接
get_next 返回下一篇文章(Article模型)
get_prev 返回上一篇文章(Article模型)

单页面 Flatpage

属性分类 属性名称 中文说明
基本属性 id 自动编号
slug 英文唯一标识符
title 页面标题
seotitle SEO标题
seokey SEO关键词
seodesc SEO描述
template 页面内容页模板文件
body 页面介绍
body_html 页面介绍HTML
特殊属性 link 页面的URL链接(包含域名)
shortlink 页面的URL链接

静态标签 Label

属性分类 属性名称 中文说明
基本属性 id 自动编号
slug 英文唯一标识符
title 标签标题
html 标签HTML代码

重定向 Redirect

属性分类 属性名称 中文说明
基本属性 id 自动编号
old_path 需要重定向的旧路径
new_path 要重定向到的新路径
note 备注信息

用户 User

属性分类 属性名称 中文说明
基本属性 id 自动编号
email 电子邮件
username 用户名
name 昵称
role 所属角色(基于Role模型)
password_hash 密码哈希(Hash)值
confirmed 确认标记
about_me 自我介绍
member_since 注册时间
last_seen 上次活动时间
avatar_hash Gravatar头像哈希(Hash)值

角色 Role

属性分类 属性名称 中文说明
基本属性 id 自动编号
name 角色名称
default 默认角色标记
permissions 角色权限值
users 角色对应的用户(User模型)列表

可调用的方法:

  • insert_roles 插入默认的角色分组信息

设置 Setting

属性分类 属性名称 中文说明
基本属性 id 自动编号
name 设置的名称
rawvalue 设置的原始值
formatter 设置的格式化类型
builtin 内置标记
description 描述

注解

当名称为大写且内置标记为真时, 这个设置会更新到应用程序配置字典.

主题(皮肤)

Wtxlog 支持主题切换功能(换肤功能), 可以准备多套主题, 只需简单设置就可以轻松切换.

主题 也可以理解为 皮肤.

主题

Wtxlog 使用 flask-themes 作为主题管理工具. 主题目录下包含若干模板文件.

文件结构

下面是默认主题的文件结构:

├── info.json
├── static
└── templates
        ├── account
        ├── mobile
        ├── errors
        ├── archives.html
        ├── article.html
        ├── article_lists.html
        ├── category.html
        ├── flatpage.html
        ├── index.html
        ├── layout.html
        ├── search.html
        ├── tag.html
        ├── tags.html
        ├── topic.html
        └── topics.html

主要由3部分组成: info.json, static, templates, 说明:

info.json 模板描述文件
static 静态文件夹, 放置 JavaScript/CSS 等文件
template 模板文件夹
info.json

示例:

{
    "application": "wtxlog",
    "identifier": "imtx",
    "name": "imtx theme",
    "author": "digwtx",
    "description": "imtx.me theme",
    "license": "MIT/X11",
    "doctype": "html5"
}
application 应用程序标识符, 必须需为 wtxlog
identifier 主题标识符, 不能存在两个标识符相同的主题
name 易于人理解的主题名字
author 主题作者
description 主题描述
license 主题许可证
doctype 主题HTML版本

更多内容参考: http://pythonhosted.org/Flask-Themes/#info-json-fields

templates
文件名 说明
archives.html 归档
article.html 文章内容页
article_lists 文章列表页
category.html 栏目内容页, 显示某个栏目所有的文章
flatpage.html 简单页面内容页
index.html 首页
layout.html 布局页面(可自定义, 非必需)
search.html 搜索结果页
tag.html Tags标签内容页, 显示某个Tag所有的文章
tags.html Tags标签聚合页, 显示所有Tags标签
topic.html 专题内容页, 显示某个专题所有的文章
topics.html 专题聚合页, 显示所有专题
errors/403.html 403错误页
errors/404.html 404错误页
errors/500.html 500错误页
mobile/* 移动端模板文件夹, 文件结构与上面相同(上面的电脑版模板)
模板写作技巧

主题模板引用:

可以使用 theme(template_name) 引入模板文件, 比如:

{% extends theme('layout.html') %}

主题静态文件:

可以使用 theme_static 环境处理器引用主题下的静态文件, 比如:

<link rel=stylesheet href="{{ theme_static('style.css') }}">

模板

模板语法与 Jinja2 相同.

过滤器

Jinja2所有内置的过滤器都是可以使用的. 本文介绍的是定制的一些过滤器:

markdown

用Markdown语法处理文本.

参数:

  • codehilite: 是否高亮代码, 默认为 True
date

日期格式化, 格式化选项与Python标准相同.

timestamp

时间戳格式化, 格式化选项与Python标准相同.

emphasis

强调关键词, 即给文本中出现的关键词加上 em 标签.

主要用于搜索时高亮显示搜索词.

参数:

  • keyword: 要强调的关键词

上下文处理器

本文介绍程序内置的一些 上下文处理器, 可在模板文件中直接使用.

上下文处理器 在模板渲染之前运行, 并且可以在模板上下文中插入新值.

archives

返回从第一篇文章开始到现在所经历的月份列表

category_lists

返回栏目列表.

参数:

  • parent 父级栏目, 默认为 None
  • limit 限制返回的数量, 默认为 None, 即全部返回
tag_lists

返回Tags标签列表

参数:

  • limit 限制返回的数量
topic_lists

返回专题列表

参数:

  • limit 限制返回的数量
category_tree

返回栏目树形列表.

get_latest_articles

返回最新文章列表.

参数:

  • category 文章栏目, 如果指定, 则返回当前栏目(含子栏目)的最新文章, 否则返回全局的
  • limit 限制返回的数量, 默认为10
get_top_articles

返回热门文章列表, 根据 hits 降序.

参数:

  • days 天数, 比如显示一周热门, 就可以设置为7, 默认为365, 即按年筛选
  • limit 限制返回的数量, 默认为10
get_recommend_articles

返回推荐的文章列表.

参数:

  • category 文章栏目, 如果指定, 则返回当前栏目(含子栏目)的最新文章, 否则返回全局的
  • limit 限制返回的数量, 默认为10
get_thumbnail_articles

返回有缩略图的文章列表.

参数:

  • category 文章栏目, 如果指定, 则返回当前栏目(含子栏目)的最新文章, 否则返回全局的
  • limit 限制返回的数量, 默认为10
get_articles_by_category

根据栏目路径(longslug)返回文章列表.

参数:

  • longslug 栏目路径, 字符串, 不要以 / 结尾
  • limit 返回的个数, 整数
  • expand 是否返回子栏目文章, 若为 False 则只返回当前栏目的文章
label

返回静态标签的内容

参数:

  • slug 标签的英文标识符, Unicode 类型

示例:

{{ label('index_title') }}
model_query

模型复杂查询

参数:

  • model 实例模型, 比如 Article , Category , Tag , etc.
  • search_params 参数字典, 为dict类型, 参照 flask-restless文档

示例:

{% set longslug = '' %}
{% if article %}{% set longslug = article.category.longslug %}{% endif %}
{% if category %}{% set longslug = category.longslug %}{% endif %}
{% with recent_articles = model_query(Article,
{'order_by': [{'field': 'id', 'direction': 'desc'}],
 'limit': 15,
 'filters': [
  {'name': 'category_id', 'op': 'in', 'val': get_category_ids(longslug)},
  {'name': 'published', 'op': 'eq', 'val': True}],
}) %}
{% for article in recent_articles -%}
<li><a href="{{ article.link }}">{{ article.title }}</a></li>
{% endfor %}
{% endwith %}

因为这个方法使用相当复杂(参数看起来比较多, 语法略为复杂), 所以只有当上面列举的上下文处理器无法实现某个查询功能时, 才建议使用这个方法来实现.