暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Flask-MDict搭建在线Mdict词典服务

各种折腾 2022-07-27
1249

根据昨天发布的『 告杨浦居民书(二十六)』,新一轮的核酸开始了。


本文是应网友 司徒
的要求折腾的

什么是 MDict ?

MDict
是一个开放的词典平台。

什么是 Flask-MDict ?

Flask-MDict
是在线 Mdict
词典服务器,可用于读取 MDX/MDD
字典数据并对外提供标准 HTTP
服务。

构建镜像

如果你不想自己构建,可以跳过,直接阅读下一章节

Flask-MDict
官方没有提供镜像,代码也有点老,但看起来应该是个标准的 flask
应用,下面的 Dockerfile
是老苏基于标准的 flask
框架改的。

FROM python:3.8-slim
LABEL maintainer=laosu<wbsu2003@gmail.com>

ENV NAME FlaskMDict
VOLUME /app

WORKDIR /app
COPY . .
  
# Environment
# 阿里源 
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
    pip install --upgrade pip && \
    pip install -r requirements.txt

  
# Application
EXPOSE 5000

RUN chmod +x check_mdx.sh
CMD ["sh""check_mdx.sh"]

check_mdx.sh
 是用来检测 /content
目录下是否有 mdx
文件的。

2
点需要特别说明一下:

  1. 官方提供的说明比较简单,但看起来必须先要有字典才能运行,为了避免容器直接挂掉,老苏增加了一个死循环来确保进程不退掉,只有当检测到 mdx
    字典文件时才退出死循环,所以在导入 mdx
    字典文件之前,web
    服务是访问不了的;
  2. 因为使用了 ls
    来检测 /content
    目录下是否有 mdx
    文件,所以容器需要用 --privileged
    提升权限,否则会因为 Operation not permitted
    而无法正确检测;

【已知问题】:在能正常使用后再删空字典,虽然容器不会挂,但是访问网页会报错👇

这个时候就算你再把字典拷回去也没用,因为已经退出了死循环,所以只能重启启动容器,正常情况下也应该不会有人这么干吧?

再次申明,老苏不是程序员,也不懂 linux
,所以用的方法比较挫 😓,见谅见谅~

#!/bin/bash    
  

# Just keep this script running   
while true   
do   
   sleep 1   
   echo "--loop--"  
   # 在content 中查找 mdx 文件,如果有的话退出死循环  
   count=`ls -1 ./content/*.mdx 2>/dev/null | wc -l`    
   if [ $count != 0 ]; then    
      echo "find mdx files!"   
      break;  
   fi  
done  

# 复制词频文件
cp ecdict_wfd.db content/

python3 -m flask run --host=0.0.0.0

构建镜像和容器运行的基本命令如下👇

# 直接下载代码
git clone https://github.com/liuyug/flask-mdict.git

# 通过代理下载源代码
git clone https://ghproxy.com/github.com/liuyug/flask-mdict.git

# 进入目录
cd flask-mdict

# 将 Dockerfile 、check_mdx.sh 放入当前目录

# 构建镜像
docker build -t wbsu2003/flaskmdict:v1 .

安装

在群晖上以 Docker 方式安装。

老苏发布了 30
多个镜像,但是你只能在群晖中搜索到 29

如果直接在注册表中搜索 flaskmdict
是什么都搜不到

直接在 映像
--> 新增
--> 从 URL 添加

输入 https://hub.docker.com/r/wbsu2003/flaskmdict
`

新增
之后,选择版本 latest
就可以了

权限

勾选 使用高权限执行容器

docker
文件夹中,创建一个新文件夹 flaskmdict
,并在其中建一个子文件夹 content
,将网上下载的 mdx
放入这个目录即可,如果有同名 .mdd
文件、 .css
文件的,也要一起放入。

文件夹装载路径说明
docker/flaskmdict/content
/app/content
存放 mdx
字典

端口

本地端口不冲突就行,不确定的话可以用命令查一下

# 查看端口占用
netstat -tunlp | grep 端口号

本地端口容器端口
5860
5000

环境

可变
FLASK_ENV
默认设为 development
,不要改
FLASK_APP
默认设为 app.py
,不要改
MDICT_DIR
默认设为 /app/content
,不要改

命令行安装

如果你熟悉命令行,可能用 docker cli
更快捷

# 新建文件夹 flaskmdict 和子文件夹
mkdir -p /volume2/docker/flaskmdict/content

# 进入 flaskmdict 目录
cd /volume2/docker/flaskmdict

# 生成容器
docker run -d \
   --name=flaskmdict \
   --privileged \
   -p 5860:5000 \
   -v $(pwd)/content:/app/content \
   -e FLASK_ENV=development \
   -e FLASK_APP=app.py \
   -e MDICT_DIR=/app/content \
   wbsu2003/flaskmdict

也可以用 docker-compose
安装,将下面的内容保存为 docker-compose.yml
文件

version: '3'

services:
  yarr:
    image: wbsu2003/flaskmdict
    container_name: flaskmdict
    restart: unless-stopped
    ports:
      - 5860:5000
    volumes:
      - ./content:/app/content
    environment:
      - FLASK_ENV=development
      - FLASK_APP=app.py
      - MDICT_DIR=/app/content

然后执行下面的命令

# 新建文件夹 flaskmdict 和子文件夹
mkdir -p /volume2/docker/flaskmdict/content

# 进入 flaskmdict 目录
cd /volume2/docker/flaskmdict

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:5860
就能看到主界面

  • 必须要在 content
    中放入了字典文件才能访问 web
    页面
  • 第一次打开的时间可能会比较长,因为会将 mdx
    文件转为 db
    文件,文件越大越慢

软件很简单就不用介绍了,老苏得到网友 司徒
的授权,贴几张他使用不同字典的实际效果(老苏对原图做了裁剪处理)

参考文档

liuyug/flask-mdict: Flask Mdict Server. Query word online with MDICT dictionary
地址:https://github.com/liuyug/flask-mdict

牛津 / 朗文 / 柯林斯 / 韦氏词典mdx词库文件(适用于欧路词典 / Mdict / 深蓝词典) - 米斯特范工作室®
地址:https://www.mrfan.org/dicts

@所有人:写文不易,如果你都看到了这里,请点个
在看
,分享给更多的朋友;为确保你能收到每一篇文章,请主页右上角设置星标。

文章转载自各种折腾,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论