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 …

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 …

基于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 …

使用flask实现一个简单的图片上传存储服务


GitHub地址: https://github.com/honmaple/maple-file

maple-file

使用flask实现的一个简单的图片上传服务

设计初衷

对于图片的存储,有很多选择,一般采用云服务如(七牛,又拍等),但是国内的服务像七牛 自定义域名竟然需要域名备案(Excuse me,当初就是因为备案麻烦才选择国外的),而且浪费了我十块钱,

而我又想像七牛一样可以直接在本地就可以上传图片,找来找去,没有找到一个比较合适的,所以花两天时间自己写了一个

使用

由于初衷是本地脚本就可以发布,所以没有前端界面,等以后有时间了再加上

API

  • /api/login
    • POST 登录 …

flask使用token进行验证


为什么需要用token验证

原因呢是因为写博客时已经在本地写好了,但是要发表到网站上还需要这么几步:

  • 打开浏览器
  • 打开我的网站
  • 进入登陆页
  • 登陆
  • 进入后台页
  • 进入文章发表页
  • 复制粘贴
  • 发表

所以使用token验证成为必然

如何使用token?

生成token

使用itsdangerous对token进行加密

class User(model):
    ......

    @property
    def token(self):
        config = current_app.config
        secret_key = config.setdefault('SECRET_KEY')
        salt = config.setdefault('SECURITY_PASSWORD_SALT')
        serializer = URLSafeTimedSerializer(secret_key)
        # column = self.(需要加密的字段)
        token = serializer.dumps(column, salt=salt)
        return token

请保管好SECRET_KEY 和 …

如何安装及使用honmaple社区程序


如何安装及使用

安装需要的package

pip install -r requirements.txt

配置config

查看配置详细介绍

注释下面代码

因为如果不注释的话 初始化数据库 会报错

文件位置: maple/topic/forms.py

category = SelectField(
    _('Category:'),
    choices=[(b.id …

flask时间格式化


在前端显示为该问题 "几分钟前发表或几天前发表"

后端通过filter注册

参考资料

设计需求

  • 如果问题发表超过 10天 ,则显示为 /%Y-%m-%d %H:%M/
  • 如果小于 10天 ,但是大于 1天 ,则显示为 /n天前/ 发表
  • 如果小于 1天 ,但是大于 1小时 ,则显示为 /n小时前/ 发表
  • 如果小于 1小时 ,但是大于 90秒 ,则显示为 /n分钟前/ 发表
  • 如果小于 90秒 ,则显示为 /刚刚/ 发表

具体实现

通过 diff.daysdiff.seconds 实现

比如,大于10天

if diff.days > 10:
    return dt.strftime('%Y-%m- …

基于restful的flask权限管理


为什么需要restful形式的权限管理

最近在写flask应用时使用了 restful 形式的flask.views.MethodView,但是在对其进行权限管理时遇到了一些问题

flask文档上介绍说用

decorators = []

添加装饰器,但实际使用上,比如

  • getpost 采用不同的权限

get 不使用 login_required
post 需要 login_required

这样就不能使用 decorators 对视图进行装饰

  • post ,delete, put 都需要 login_required,但是get不需要 而 delete 又需要更高级别的权限,我们可以这样

    class AAA(MethodView):
    
        def get(self,uid):
            ...
    
        @login_required
        def post(self):
            ...
    
        @login_required
        def put(self,uid):
            ...
    
        @login_required
        @more_required
        def delete(self,uid):
            ...
    

    是不是看起来还不错, 但是,如果再加上类似EditBlogPostPermission …

flask日志处理


使用文档上的一句话:

Applications fail, servers fail. Sooner or later you will see an exception in production. Even if your code is 100% correct, you will still see exceptions from time to time. Why? Because everything else involved will fail.

应用发生错误时发送邮件

这里文档上个人认为说的不清不楚,毕竟想要使用还要看logging的文档

原文档

ADMINS = ['[email protected]']
if not app.debug:
    import logging
    from logging.handlers import SMTPHandler
    mail_handler = SMTPHandler('127.0.0.1' …

flask中生成atom


参考资料1 参考资料2

下面是具体代码
# from urlparse import urljoin #python2
from urllib.parse import urljoin
from flask import request
from werkzeug.contrib.atom import AtomFeed


def make_external(url):
    return urljoin(request.url_root, url)


@site.route('/atom.xml')
def feed():
    feed = AtomFeed('Recent Articles',
                    feed_url=request.url,
                    url=request.url_root,
                    subtitle='I like solitude, yearning for freedom')
    articles = Articles.query.limit(15).all()
    for article in articles …