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


    在这里插入图片描述

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

    在这里插入图片描述


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

    什么是 MDict ?

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

    什么是 Flask-MDict ?

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

    构建镜像

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

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

    FROM python:3.8-slim
    LABEL maintainer=laosu
    
    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

    # 直接下载代码
    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 .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    安装

    在群晖上以 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 端口号
    
    • 1
    • 2
    本地端口容器端口
    58605000

    在这里插入图片描述

    环境

    可变
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    也可以用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    然后执行下面的命令

    # 新建文件夹 flaskmdict 和子文件夹
    mkdir -p /volume2/docker/flaskmdict/content
    
    # 进入 flaskmdict 目录
    cd /volume2/docker/flaskmdict
    
    # 将 docker-compose.yml 放入当前目录
    
    # 一键启动
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行

    在浏览器中输入 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

  • 相关阅读:
    Unity 关于低版本是否可以引用高版本构建内容的可行性验证
    leetcode143-Reorder List
    springcloud24:分布式事务 Seata处理分布式事务总结篇
    计算机网络——网络层の选择题整理
    代码随想录算法训练营第40天|● 343. 整数拆分 ● 96.不同的二叉搜索树
    PDF解除密码怎么操作?教你一键解除密码
    使用htmlWebpackPlugin添加代码版本信息
    获得New Bing资格后,在Ubuntu环境下使用New Bing
    LVGL---按钮(lv_btn)
    万字干货_JDK动态代理及其源码解析 拿捏了
  • 原文地址:https://blog.csdn.net/wbsu2004/article/details/126007090