Flask支持多语言站点


Flask的多语言国际化可以使用Flask-Babel插件,在此不再细述,但对于所谓的多语言站点(即形如example.com/zh/uri、example.com/en/uri或者zh.example.com、en.example.com)文档上却未作细述

有一个 Flask URL Processors 需要对所有的uri都额外增加一个lang_code的前缀,路由数较少时没什么问题,但路由数较多时太过麻烦

实现example.com/en/uri可以有多种方式,除了使用Flask URL Processors中介绍的外,还可以

使用nginx重定向uri

这应该是各种方式里最简单的一种

location ~ ^/en/ {
    rewrite ^/en/(.*)$ /$1 last;
}
location = /en {
    rewrite ^/(.*)$ /index …

为pelican添加子站点功能


Table of Contents

创建翻译

babel-init:
    cd $(THEMEDIR) && pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot ./ && pybabel init -i messages.pot -d translations -l en

babel-update:
    cd $(THEMEDIR) && pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot ./ && pybabel update -i messages.pot -d translations

babel-compile:
    cd $(THEMEDIR) && pybabel compile -d translations

动态变量

在模板里,我有一些动态变量需要翻译,比如在分类里的 Python 需要翻译成 生活苦短,但很不幸, Babel …

为pelican添加文章加密功能


pelican是一个静态博客系统,很早之前就想要实现一个加密pelican文章的功能,但一直没什么时间,这次总算静下心花两天时间搞定了

为什么不用现有的插件encript-content

因为自己实现更有成就感啊!!!

前言

因为我不仅有静态博客honmaple.me,还有一个动态博客honmaple.com,所以此次加密功能我会在动态博客那边添加一个验证密码的接口,来对密码进行验证以及对加密文章进行解密,虽然验证也可以使用crypto-js.js进行双向解密,但还是觉得自定义的接口更安全一些。

自定义pelican插件

加密算法

加密算法我使用cryptography,使用起来很简单

>>> from cryptography.fernet import Fernet
>>> # Put this somewhere safe!
>>> key = Fernet.generate_key()
>>> f = Fernet(key)
>>> token = f.encrypt(b"A really secret message. Not for …

flask_maple文档


安装

To install Flask-Maple:

pip install flask-maple

Or alternatively, you can download the repository and install manually by doing:

git clone git …

为pelican增加上一篇下一篇功能


功能实现很简单, pelican也有类似的插件实现 https://github.com/getpelican/pelican-plugins/tree/master/neighbors

不过自己实现起来更爽不是吗? 而且类似prev_article_in_categoryprev_article_in_subcategory的功能我并不需要

首先参考pelican的文档,基础实现

def add_neighbors(generator):
    ....

def register():
    signals.article_generator_finalized.connect(add_neighbors)

然后在generator.articles列表上进行操作,为article增加previous_articlenext_article对象

先进行排序(按时间)

articles = generator.articles
articles.sort(key=(lambda x: x.date), reverse=True)

然后可以使用iter关键字,把列表变成生成器,使用next()( python2用a.next(),python3用a.__next__())获取下一个可迭代对象

pre_article …

一个简单的数据分组算法


Table of Contents

之前有这么一个需求

将数据按照时间分组,比如说每5分钟为一组,或者每30分钟为一组,开始时间如果分钟数大于等于30分钟,则设置为30,如果小于30,则设置为0(也可以设置为更复杂的逻辑)

当然中间还有一些数据的统计,分析和计算暂时不管

获取开始时间

def get_start_date(start_date):
    time = datetime.fromtimestamp(int(start_date) / 1000)
    if time.minute >= 30:
        minute = 30
    else:
        minute = 0
    start_date = datetime(time.year, time.month, time.day, time.hour, minute,
                          0)
    start_date = mktime(start_date.timetuple()) * 1000
    return start_date

开始时间很简单,需要注意的是设置分钟,需要将时间戳转换为datetime,设置分钟数后再将datetime转为时间戳

time = datetime.fromtimestamp(int(start_date) / 1000 …

基于whoosh实现的flask全文搜索插件


flask 貌似很少全文搜索的插件,有一个 https://github.com/gyllstromk/Flask-WhooshAlchemy , 但试了几次都用不了,所以参考 Flask-WhooshAlchemy 自己写了一个

Quickstart

插件基于 whoosh,纯 python 编写,使用上很简单

from flask_msearch import Search
[...]
search = Search()
search.init_app(app)

# models.py
class Post(db.Model):
    __tablename__ = 'post'
    __searchable__ = ['title', 'content']

# views.py
@app.route("/search")
def w_search():
    keyword = request.args.get('keyword')
    results = search.whoosh_search(Post,query …

himawari8图片下载改进版


第一版下载图片后设为壁纸,四周都是黑黑的不好看, 所以结合本地壁纸将两张图片进行合成

只要计算一下要缩减的大小与要放置的位置

我的方法是:打开 gimp,合成两张图片,记下缩减的大小(214,214)与位置(160,160)

每次只要运行一下

python himawari8.py

源码

from PIL import Image, ImageOps, ImageDraw
from io import BytesIO
from urllib.request import Request, urlopen
from datetime import datetime, timedelta
import json

SCALE = 2
WIDTH = 1368
HEIGHT = 768


def get_info():
    url = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json"
    request = Request(url …

下载Himawari8拍摄的实时地球图片


直接给出源码

设置壁纸

feh --bg-scale /tmp/earth.png

设置桌面大小,及图片放大倍数

SCALE = 4
WIDTH = 1368
HEIGHT = 768
from PIL import Image
from io import BytesIO
from urllib.request import Request, urlopen
from datetime import datetime
import json

SCALE = 4
WIDTH = 1368
HEIGHT = 768


def get_info():
    url = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json"
    request = Request(url)
    response = urlopen(request, timeout=10)
    return json …

sqlalchemy使用上的小tips


sqlalchemy object序列化为json

灵感来源于 Django REST framework

多个实例

posts = Post.query.all()
serializer = Seralizer(posts,many=True)
data = serializer.data

单个实例

post = Post.query.first()
serializer = Seralizer(post,many=False)
data = serializer.data

排除字段

serializer = Seralizer(post,exclude=['title'])

仅包括字段

serializer = Seralizer(post …