PostgreSQL 初识

要介绍 PostgreSQL 通过几个关键词就可以,开源,对象关系型数据库。本文主要是学习过程中的一些笔记,都是基础内容,大部分都是看得基础入门书籍和官方的文档内容,老手请直接跳过。

History

PostgreSQL 发展历程可以追溯到 1986 年,加州伯克利分校开发了一个名叫 Postgres 的关系型数据库服务器,这份代码被 Illustra 公司发展成为了一个商业化产品。到 1994 年, Andrew Yu 和 Jolly Chen 向 Postgres 中增加了 SQL 语言解释器 —- Postgres95,随后公布了其源码,成为一个开放源码数据库。

到 1996 年,Postgres95 被改名 PostgreSQL,支持查询语言标准,同时版本号从 6.0 开始迭代。

2011 年 9 月 12 日,PostgreSQL 9.1 发布,提供了强大的更新,同步复制,最近相邻索引,外部数据封装等功能。

这张图 充分的可以说明 PostgreSQL 的发展及流行程度。

Installation

在 Linux Mint 19,或者其他 Debian/Ubuntu 系列上安装:

sudo apt install postgresql postgresql-contrib

Mac

brew install postgresql

To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database

This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /usr/local/var/postgres
For more details, read:
  https://www.postgresql.org/docs/12/app-initdb.html

To have launchd start postgresql now and restart at login:
  brew services start postgresql
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgres start

PostgreSQL 安装之后会在系统上新增一个 postgres 用户,通过该用户来运行服务。

检查版本

sudo -u postgres psql -c "SELECT version();"

会输出 PostgreSQL 的版本

PostgreSQL 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit

PostgreSQL 默认端口是 5432,可以通过 sudo netstat -tupln 来查看服务是否启动。

PostgreSQL 默认用户名是 postgres,默认数据库也是 postgres,没有默认密码。

Configuration

PostgreSQL 的配置文件在 /etc/postgresql/10/main/postgresql.conf

允许远程访问 PostgreSQL 服务

打开配置文件 sudo vi /etc/postgresql/10/main/postgresql.conf , 然后找到如下一行,并配置

listen_addresses = '*'

然后重启服务

sudo systemctl restart postgresql

检查服务启动

ss -nlt | grep 5432

然后修改 sudo vi /etc/postgresql/10/main/pg_hba.conf 文件

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# The user test_user will be able access all databases from all locations using a md5 password
host    all             test_user            0.0.0.0/0                md5

# The user test_user will be able access only the test_db from all locations using a md5 password
host    test_db          test_user            0.0.0.0/0                md5

# The user test_user will be able access all databases from a trusted location (192.168.43.106) without a password
host    all             test_user            192.168.1.134            trust

登录和管理服务器

管理 PostgreSQL 可以通过命令行,也可以通过 GUI 工具,市场上现在 GUI 工具已经非常成熟,有开源方案,也有商业方案。这里就介绍一下 pgAdmin,其他工具可以自行了解。

GUI 管理工具 pgAdmin

详情见官网: https://www.pgadmin.org/download/

安装方式也都特别简单,略过。

命令行方式

PostgreSQL 只能在 postgres 用户下管理,所以可以切换到该用户操作

sudo su - postgres

然后使用 psql 命令登录 PostgreSQL 控制台

psql

此时相当于用 postgres 用户以同名身份登录了数据库,默认没有密码,系统提示符会变成 postgres=#.

为用户设置密码 \password .

\password postgres

然后输入密码。

创建其他用户,并为这些用户设定密码

CREATE USER your_username WITH PASSWORD 'your_password';

创建用户数据库

CREATE DATABASE sample_db OWNER your_username;

赋予用户所有权限,读写操作

GRANT ALL PRIVILEGES ON DATABASE sample_db to your_username;

退出控制台

\q

如果不想在控制台也可以直接从 shell 中设定

sudo -u postgres createuser --superuser your_username
sudo -u postgres psql
\password your_username
\q
sudo -u postgres createdb -O your_username sample_db



/usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start

在 PostgreSQL 中,超级用户角色连接到数据库允许绕过所有数据库权限检查,登录权限除外。因此不要轻易使用超级用户权限,PostgreSQL 文档建议将大多数数据库作为非超级用户角色管理。

Usage

登录数据库

上面演示了如何创建用户及数据库,那么在 shell 中可以以如下方式来登录数据库

psql -U your_username -d sample_db -h 127.0.0.1 -p 5432

然后输入 your_username 的密码即可登录控制台。注意这里的 -d 参数是必须的。

修改数据库

对数据库的基本操作,和 MySQL 类似,只要懂得 SQL 基本就可以略过下面大部分的内容。

创建

CREATE DATABASE sample_db;
CREATE DATABASE sample_db OWNER username;

修改数据库

ALTER DATABASE sample_db RENAME TO new_sample_db;
ALTER DATABASE new_sample_db OWNER TO postgres;
ALTER DATABASE new_sample_db WITH CONNECTION LIMIT = 10;

删除数据库

DROP DATABASE sample_db[, ...n];

表相关操作

大部分都是 SQL 相关的内容,这里就做过引子,具体还是去学习 SQL

创建表

create table tb_demo1 (
	id int PRIMARY KEY,
	name varchar(25),
	age int,
	salary float
);

create table tb_demo2 (
	id int,
	name varchar(25) NOT NULL,
	age int,
	salary float,
	PRIMARY KEY(id, name)
);

CREATE TABLE dep (
	id INT,
	name VARCHAR(25)
)

创建外键关联,在表 demo5 中添加外键约束 fk_dep 将表 depId 列关联到 dep 表 id。

CREATE TABLE demo5 (
	id INT PRIMARY KEY,
	name VARCHAR(25) NOT NULL,
	age int,
	depId INT,
	CONSTRAINT fk_dep FOREIGN KEY(depId) REFERENCES dep(id)
)

修改表结构

ALTER TABLE old_table_name RENAME TO new_table_name;
ALTER TABLE table_name ALTER COLUMN column_name TYPE VARCHAR(30);
ALTER TABLE table_name RENAME old_column_name TO new_column_name new_type;
ALTER TABLE table_name ADD COLUMN new_column new_type;
ALTER TABLE table_name ADD COLUMN new_column new_type NOT NULL;
ALTER TABLE table_name DROP column_name;
ALTER TABLE table_name DROP CONSTRAINT constraint_name;

删除表

DROP TABLE [IF EXISTS] table1, table2 ...;

恢复外部数据

psql -U your_username -d sample_db -h 127.0.0.1 -p 5432 < backup_external.sql

其他控制台命令

\h            	explain sql, such as \h select
\?				help
\l 				list all db
\c [database_name] 		connect to db
\d 				list all tables of current db
\d [table_name] 	show table structure, like describe table in mysql
\du 			list all user
\e 				open text editor
\conninfo 		print database and connection infomation

数据类型

整数类型

类型 字节数 说明  取值范围
SMALLINT 2 字节   小整数 -32768 ~ 32767
INT 4 字节   整数 -2147483648 ~ 2147483647
BIGINT 8 字节   大整数 -92233720368547758089 ~ 9223372036854774807

浮点数

类型 字节数 说明  取值范围
REAL 4 6 位十进制数字精度   1E-37 ~ 1E+37
DOUBLE PRECISION 8 15 位十进制数字精度  1E-307 ~ 1E+308

PostgreSQL 支持 SQL 标准表示,float 和 float(p) 声明非精确的数值类型。p 声明以二进制表示的最低可接受精度。

  • REAL - float(1) 到 float(24)
  • DOUBLE PRECISION - float(25) 到 float(35)

范围之外的 p 值将导致错误,没有声明精度的 float 将被当作 DOUBLE PRECISION。

任意精度类型

NUMERIC 表示数值是任意精度,使用 NUMERIC(M, N) 表示,M 称为精度,总位数,N 表示标度,表示小数的位数。比如 123.456 ,精度是 6, 标度是 3

超出精度则四舍五入处理。

日期与时间

TIME, DATE, TIMESTAMP 和 INTERVAl,每一个类型都有合法取值范围,当不合法时会以零值插入到数据库。

类型 字节数 说明  取值范围
TIME 8 字节 一天内时间 00:00:00 - 24:00:00 插入 HHMMSS 字符串会自动转成时间 HH:MM:SS
DATE 4 字节 日期 YYYY-MM-DD
TIMESTAMP 8 字节 日期和时间 YYYY-MM-DD HH:MM:SS

字符串类型

字符串类型

类型 字节数 说明  取值范围
CHAR(n)/CHARACTER(n)   固定长度非二进制,不足补空白 由 n 决定
VARCHAR(n)/CHARACTER VARYING(n)   变长非二进制,有长度限制 n 决定
TEXT   变长非二进制,无长度限制 由字符串决定

二进制类型

PostgreSQL 提供 BYTEA 类型,用来存储二进制字符串,BYTEA 类型存储空间位 4 字节加上实际的二进制字符串。

CREATE TABLE tmp ( b BYTEA );
INSERT INTO tmp VALUES (E'\\000');
SELECT * from tmp;

布尔类型

PostgreSQL 提供 BOOLEAN 布尔类型,用一个字节来存储,有 TRUE,FALSE 两个值。

其他有效文本,可以代替 TRUE 或者 False。比如 ‘t’, ‘true’, ‘y’, ‘yes’, ‘1’, 或者 ‘f’, ‘false’, ‘n’, ‘no’, ‘0’

数组类型

PostgreSQL 允许将字段定义成变长或者变长的一维或者多维数组,数组类型可以是基本类型或者是用户定义类型。

声明数组

numbs INT[],
zz TEXT[4][4]

对于一维数组也可以

arr_column INT ARRAY[5]

插入数组

CREATE TABLE tmp (bt int[]);
INSERT INTO tmp VALUES('\{\{1,1,1\}, \{2,2,2\}, \{3,3,3\}\}');
SELECT * FROM tmp;

除开这些基础类型,PostgreSQL 还支持非常多的复杂类型,比如 json, xml 等等,具体可以参考官网 , 这些复杂类型的使用可以单开一篇文章来讲了,初识篇就到此。

reference


2019-08-25 postgresql , sql , mysql , db , database

利用 imewlconverter 制作 Rime 词库

之前就写过文章介绍这款跨平台的开源输入解决方案 Rime,所有的配置以及同步方法都在之前的文章中有介绍。这篇文章主要介绍如何制作 Rime 的扩展词库。虽然目前网上也有一些非常不错的词库,但是很多内容还是需要自己慢慢培养的。

词库转换工具

从 2.4 版本起支持加密的搜狗词库了,直接导出搜狗词库,然后转成 Rime 的格式即可。

安装 dotnet:

macOS 下直接 brew install dotnet-sdk

下载 release 对应版本,然后运行:

dotnet ImeWlConverterCmd.dll -?

在 macOS 下使用 dotnet ImeWlConverterCmd.dll "-?".

具体转换命令,比如导入一个搜狗细胞词库成 Rime 词库,则命令为:

dotnet ImeWlConverterCmd.dll -ct:pinyin -os:linux -i:scel ./input.scel -o:rime ./rime.txt

ImeWlConverterCmd.dll 工具的其他重要参数,对于输出为 rime 的 -ct:pinyin/wubi/zhengma,也可以通过 -os:windows/macos/linux 来指定操作系统。

繁简转换

安装 opencc 繁简转换工具

sudo apt install opencc

然后运行装换

opencc -i source.txt -o dest.txt

会将 source.txt 文本内容全部转换成 dest.txt 繁体的文本。

然后将文本内容全部拷贝到 luna_pinyin.mywords.dict.yaml 文件中,并添加文件头:

---
name: luna_pinyin.mywords
version: "0.0.1"
sort: by_weight
use_preset_vocabulary: true
...

说明:

  • sort: by_weight,词条的排序方式,可选填 by_weight 按照词频高到低,original 保持原码表中的顺序
  • use_preset_vocabulary: true 表示是否导入预设的词汇表,当词库中没有定义拼音和词频的时候开启

然后找到 luna_pinyin.extended.dict.yaml,打开文件导入新的词库

import_tables:
  - luna_pinyin.mywords

搜狗细胞词库

下载对应的细胞词库:

然后使用上面的方法转换。

搜狗拼音备份词库 bin

dotnet ImeWlConverterCmd.dll -ct:pinyin -os:linux -i:sgpybin ./input.bin -o:rime ./rime.txt

清华大学开放中文词库

包含了 IT, 财经,成语,地名,历史名人,诗词,医学,饮食,法律,汽车,动物,等几大类词库。

通讯录姓名

我所有的通讯录都在 Google 通讯录 中保存着,页面上可以很方便的导出 csv 文件。有了这个文本文件就可以快速制作通讯录姓名的词库。

简单观察一下通讯录 csv 的结构就知道第一列就是姓名,解析一下文件然后将第一列弄出来。和上面的流程一直,制作一个 luna_pinyin.contacts.dict.yaml 文件保存这些通讯录名字,然后将该词库添加到 extended 中。部署即可生效。

纯文本词库

dotnet ImeWlConverterCmd.dll -ct:pinyin -os:linux -i:word ~/Downloads/entry.csv -o:rime ./rime-.txt

Rime 导入词库

通过扩展来导入词库,纯文本管理,

Rime 导出词库

同步后在同步的文件夹中能找到纯文本保存的词库。


2019-08-24 rime , 词库 , 小狼毫 , 中州韵 , trime , input-method

Linux Mint 19 自定义登录界面

Linux Mint 19 不支持 MDM 显示管理器,您需要安装 LightDM

检查当前显示管理

cat /etc/X11/default-display-manager

如果输出 mdm 则需要更换

sudo apt install lightdm lightdm-settings slick-greeter
sudo dpkg-reconfigure lightdm

这里的 mdm 和 lightdm 值得都是 Linux Login manager,或者也被叫做 Linux Display Manager。更多的选择可以看这里

配置

显示配置

/usr/sbin/lightdm --show-config

修改背景图片

Linux Mint 下系统自带壁纸在

/usr/share/backgrounds/

更多的配置参考: https://wiki.debian.org/LightDM

更多主题

  • https://www.gnome-look.org/search/projectSearchText/login

2019-08-24 linux , mint , linux-mint , lightdm , mdm , login-manager

apt update 相关内容记录

我们都知道 Ubuntu 系列的软件仓库可以通过 /etc/apt/sources.list 以及 /etc/apt/sources.list.d/*.list 来配置。

sources.list 格式

sources.list 的格式大部分情况下都是

deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3

这几部分可以划分为这几类:

  • 包类型 deb , deb-src
  • 仓库地址
  • 发行版
  • 软件包分类

deb 和 deb-src 区别

  • deb 表示二进制内容,会使用仓库中的二进制预编译软件包,可以直接通过 apt 来安装
  • deb-src 表示源代码,在使用 apt 时会根据源代码来进行安装,通常可以使用 apt source $pacakge 来下载然后编译

仓库地址

在配置中的 url 一般为仓库的地址,世界各地会有不同的镜像,选择一个比较快的镜像即可。

发行版

不同版本的系统有着不同的代号,比如 Ubuntu

  • Xenial 16.04
  • Bionic 18.04

软件包分类

跟在发行版之后的就是软件包的具体分类了,可以有一个或多个

Debian

  • main 包含符合 DFSG 指导原则的自由软件包,而且这些软件包不依赖不符合该指导原则的软件包。这些软件包被视为 Debian 发型版的一部分
  • contrib 包含符合 DFSG 指导原则的自由软件包,不过这些软件包依赖不在 main 分类中的软件包
  • non-free 包含不符合 DFSG 指导原则的非自由软件包

Ubuntu

  • main 官方支持的[[自由软件]]
  • restricted 官方支持的非完全自由的软件
  • universe 社区维护的自由软件
  • multiverse 非自由软件

apt update 时最前面标识含义

在运行 apt update 时会发现在输出的没一行前面会有 GET, HIT 等等字符的出现,这几个字符有着其自身的含义:

  • GET 表示在该源中有更新,并且新的内容已经被保存
  • HIT 表示已经在该源中有最新的包
  • IGN 表示包被忽略,要不然是没有更新,要不然就是该包已经被废弃,如果开发者改变了版本或者更换了仓库密钥也会这样

2019-08-22 apt , ubuntu , linux , package-management

Linux 下的输入法 fcitx vs ibus

无论在那个系统下,输入法几乎是必备的软件,在 Linux 下有两大主要的输入法支持框架 fcitx 和 IBus,当然有些还有 XIM ,scim 等等。Linux 下本来没有多少用起来非常舒服的中文输入法,有出名很久的 rime, 也有搜狗开发的输入法,不过也是不久之前的事情。

但是稍微注意一下就是知道,搜狗使用的是 fcitx, 而 rime 声称二者都支持,但是 fcitx-rime 已经很久没有更新,主要的更新还在 IBus 那边。那这就需要一个抉择,因为 Linux 下无法将二者并存。

fcitx

fcitx 是 Free Chinese Input Toy for X 的简称。

源代码托管在 Gitlab

在 Debian/Ubuntu 下可以使用

apt install fcitx
apt install fcitx-pinyin    # 汉语拼音方案
apt install fcitx-googlepinyin
apt install fcitx-hangul    # 韩语
apt install fcitx-rime      # 小狼毫

配置文件内容在

  • /usr/share/fcitx/data/
  • ~/.config/fcitx/

在看 fcitx 的一些历史 不经唏嘘,如今 2019 年已经过去 12 年 fcitx 依然健在,而那些说 fcitx 不好的人却不知道在哪里。

主题

一个非常漂亮的 fcitx 主题

IBus

IBus 是 Intelligent Input Bus 的简称。

IBus 下也有 rime

sudo apt install ibus-rime

切换输入法

切换输入法可以使用如下命令:

im-config -s fcitx

如果要查看当前可用的输入法可以使用 im-config -l ,更多查看 man im-config

或者在界面搜索 input method

Rime

OS X 下的配置管理工具

reference


2019-08-21 linux , fcitx , ibus , input-method , rime

Ubuntu 从 16.04 升级 18.04

经常看到的 Ubuntu 16.04 或者 18.04 都是 Ubuntu 长期支持版本

A Long Term Support release or LTS release, means that Ubuntu will support the version for five years.

如果要从 16.04 升级到 18.04 包括两个部分,一是将当前安装的程序及 lib 升级到 18.04 兼容的版本,另外一个就是将系统升级到 18.04.

sudo apt update && sudo apt upgrade
sudo apt autoremove
sudo apt dist-upgrade

运行 apt dist-upgrade 会升级所有 packeges 到想要升到的 Ubuntu 版本,而 sudo do-release-upgrade 会将 Ubuntu 升级到新版本。大部分情况下不需要手动触发 sudo apt dist-upgrade,因为在运行 sudo do-release-upgrade 会自动先运行 dist-upgrade 。预先将所有的应用程序都更新到最新版本避免兼容性问题。

最后进行升级 Do upgrade

sudo do-release-upgrade

要注意該命令无法回滚,做好相应的备份工作,或者知道如何处理失败。

Install Cinnamon

sudo add-apt-repository ppa:embrosyn/cinnamon
sudo apt update && sudo apt install cinnamon

Remove

sudo apt-get install ppa-purge
sudo ppa-purge ppa:embrosyn/cinnamon

升级到非 LTS

编辑 /etc/update-manager/release-upgrades 并设置

Prompt=normal

然后再运行 sudo do-release-upgrade


2019-08-19 ubuntu , linux

记一次 fail2ban 启动失败

前两天重启服务器之后发现 fail2ban 启动失败,出现如下错误:

/etc/init.d/fail2ban restart
[....] Restarting fail2ban (via systemctl): fail2ban.service
Job for fail2ban.service failed because the control process exited with error code. See "systemctl status fail2ban.service" and "journalctl -xe" for details.
 failed!

检查日志

journalctl -xe

查看具体错误

/usr/bin/fail2ban-client -v -v start

看到结果:

fail2ban.service: Failed with result 'start-limit-hit'.

具体错误一目了然。其实重要的就是 Debug 的内容。


2019-08-18 fail2ban , linux

Python 为什么需要 with 语法

Python 中的 with 语法经常被用来在管理资源的访问和清理中,常见的场景有文件的使用和关闭,锁的获取和释放等等。

with open("file.txt") as file:
	data = file.read()

with 语法特别容易联想起 Java 中的 try-with-resources AutoCloseable,同样实现资源的自动释放。

基本格式

从基本使用开始了解 with,with 的结构如下:

with context_expression [as target(s)]:
    content

With 工作原理

如果要聊 with 的实现,就不得不提到 Python 中的上下文管理:

with 语句执行过程:

  • 执行 context_expression 生成上下文管理器 context_manager
  • 调用 context manager 的 enter() 方法,如果使用 as 子句,将 enter 方法返回值赋值给 target(s)
  • 执行 with-body
  • 不管是否异常,执行 exit() 方法,exit() 方法负责清理工作
  • 出现异常时, exit(type, value, traceback) 返回 False,重新抛出异常,让 with 之外的语句逻辑来处理异常;如果返回 True,这忽略异常,不再对异常处理

    class Dummy: def enter(self): print “in enter” return “Foo” def exit(self, exc_type, exc_val, exc_tb): print “in exit

    def get_dummy(): return Dummy()

    with get_dummy() as dummy: print “Dummy: “, dummy

除了上面这种实现 __enter____exit__ 方法来生成 context manger 的方式,还可以使用 contextlib

from contextlib import contextmanager

@contextmanager
def open_file(name, mode):
  f = open(name, mode)
  yield f
  f.close()

然后使用:

with open_file('file.txt', 'w') as f:
  f.write("Hello, world.")

reference


2019-08-11 python , java , programming

Substratum Android 上的主题引擎

Substratum 是一款 Android 上的主题工具,能够不用 root 来达到系统级主题修改。并且在该工具下有一群爱好者和社区开发了无数的美观且实用的主题。Substratum 开始于以前非常流行的 CyanogenMod, Cyanogen 内置了该主题引擎,并使得修改主题异常简单。但是不幸的是,Cyanogen 没有继续下去, 但是 Substratum 死灰复燃。最初的时候 Substratum 还需要 Root 来使用,但是 Android Oreo 之后就可以不依赖于 Root 了。

Installation

如果想要正式版从 Play Store 下载:

如果要开发版可以在 Telegram channel 下载

Substratum Themes

Substratum 有非常多著名的主题,可以从 Play Store 搜索,或者到 xda 寻找

  • Swift Black
  • Flux White
  • Victory
  • VaLeRie youtube
  • Transparent

Conclusion

最后,Swift theme 看起来不错,1.99 刀还可以,果断购入。

reference


2019-08-10 theme , android , substratum , oneplus-7-pro , oneplus , android-pie

Flask Babel 使用

Flask babel 是 Flask 的语言扩展,允许非常简单的方式让 Flask 支持多语言。

Installation

pip install flask-babel

安装时会安装依赖

  • Babel, Python 国际化
  • pytz 时区
  • speaklater 辅助工具集

Configuration

在 python 文件中要使用多语言的文字时引入

from flask_babel import gettext

比如

gettext('author')

在 html 模板文件中

<pre>{\% trans \%\}Submit{\% endtrans \%\}</pre>

在项目目录中新建 babel.cfg

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_,webassets.ext.jinja2.AssetsExtension

然后生成模板文件

pybabel extract -F babel.cfg -o translations/messages.pot .

文件 messages.pot 就是翻译模板文件

然后生成中文翻译文件

pybabel init -i translations/messages.pot -d translations -l zh_Hans_CN

复杂的项目可以借助 GUI 工具 poedit

编辑后编译

pybabel compile -d translations

如果更新了项目文件,新增了需要翻译的字段,在生成 messages.pot 之后可以使用如下方法将更新合并到需要翻译的文件中

pybabel update -i translations/messages.pot -d translations

Flask Babel 和 Flask WTF 一起使用

如果直接定义时使用 gettext 可能无法使用 babel 的翻译,需要使用 lazy_gettext('').

class LoginForm(Form):
    username = TextField(gettext(u'Username'), validators=[validators.Required()])

Notice

translations 位置

translations 目录必须是跟你 Flask 的 app 应用对象在同一目录下,如果你的 app 对象是放在某个包里,那 translations 目录也必须放在那个包下。

如果使用自定义的目录那么,需要自己手动指定目录名字。

app.config['BABEL_TRANSLATION_DIRECTORIES'] = 'translation'

Other

可以使用 pybabel --list-locales 来查看本机语言编码。

reference


2019-08-03 flask , flask , flask-babel , translations , langauge

电子书

本站提供服务

最近文章