基于Python3.10.6+Flask+SQLite的中文分词接口使用说明网站开发教程

发布于:2025-08-20 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、网站项目概述与技术栈

(一)项目背景与意义

        已部署的中文分词接口系统(http://47.107.172.52:5001/)提供了基础分词、词性标注、自定义词典等核心功能,但缺乏直观的可视化使用指南。开发一个接口使用说明网站,可降低用户接入门槛,展示接口功能细节、调用示例及错误处理方案,同时支持在线测试接口,帮助用户快速集成服务。

        有关“中文分词接口系统”的内容,可以看我的CSDN文章:基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程-CSDN博客         本项目基于Python3.10.6、Flask框架和SQLite数据库,构建一个功能全面的接口说明网站,包含文档展示、在线调试、使用统计等模块,满足开发者对接口的学习、测试与集成需求。

        本项目通过“配置定义 - 应用初始化 - 路由绑定 - 模板渲染 - 生产部署”的完整链路,实现了中文分词接口说明网站的规范化开发与部署。核心设计原则包括:

(1)环境隔离:通过config.py和.env区分开发/生产环境,避免敏感信息泄露;

(2)模块化:通过蓝图、模板继承拆分功能,降低代码耦合;

(3)生产就绪:使用Gunicorn作为服务器,配置日志和进程管理,确保部署后稳定运行。

(二)技术栈详解

1.Python3.10.6

作为开发语言,提供稳定的语法支持和丰富的库生态,适配Flask及数据处理需求。

2.Flask 3.1.1

轻量级Web框架,用于构建网站路由、模板渲染和后端逻辑,支持扩展插件(如 Flask-SQLAlchemy、Flask-RESTful)。

3.SQLite 3

嵌入式关系型数据库,无需独立服务,适合存储网站配置、用户反馈、接口调用示例等轻量数据。

4.前端技术

(1)HTML5/CSS3:构建页面结构与样式,采用响应式设计适配多设备。

(2)JavaScript(ES6+):实现交互功能(如在线接口测试、表单验证)。

(3)Bootstrap 5:提供UI组件库,简化页面开发。

(4)Ace Editor:代码编辑器组件,用于展示和编辑示例代码。

5.辅助工具

(1)Flask-SQLAlchemy:ORM工具,简化SQLite数据库操作。

(2)Flask-WTF:处理表单提交与验证。

(3)Requests:后端调用分词接口,支持在线测试功能。

(4)Pygments:代码语法高亮,提升示例代码可读性。

(三)项目目标与功能规划

1.核心目标

构建一个集“文档说明 - 在线调试 - 问题反馈”于一体的接口服务平台,帮助用户快速掌握接口使用方法。

2.功能模块

(1)文档中心:三级目录展示接口详情(功能描述、参数说明、返回格式、错误码)。

(2)在线测试:可视化表单填写请求参数,实时调用接口并展示返回结果。

(3)示例代码库:提供多语言(Python、JavaScript、Java等)调用示例。

(4)使用统计:展示接口调用量、响应时间等监控数据(需接口支持)。

(5)用户反馈:收集用户问题与建议,存储于SQLite数据库。

二、开发环境搭建

(一)开发环境准备

1.操作系统

支持Windows 10/11、macOS 12+、Ubuntu 20.04+,本教程以Windows 11为例。

2.Python3.10.6安装

下载地址:https://www.python.org/downloads/release/python-3106/

安装选项:勾选“Add Python 3.10 to PATH”,自定义路径(如D:\Python310)。

验证:python --version输出“Python 3.10.6”。

3.虚拟环境配置

CMD进入项目所在目录后,进行如下操作:

# 创建项目目录

mkdir api-docs-website && cd api-docs-website

# 创建虚拟环境

python -m venv adw-venv

# 激活虚拟环境(Windows CMD)

adw-venv\Scripts\activate.bat

# 激活虚拟环境(PowerShell)

.\venv\Scripts\Activate.ps1

4.依赖包安装

创建requirements.txt,在文件中写如下内容:

blinker==1.9.0

certifi==2025.8.3

charset-normalizer==3.4.3

click==8.2.1

colorama==0.4.6

Deprecated==1.2.18

dnspython==2.7.0

dotenv==0.9.9

email_validator==2.2.0

Flask==3.1.1

flask-cors==6.0.1

Flask-Limiter==3.12

Flask-SQLAlchemy==3.1.1

Flask-WTF==1.2.2

greenlet==3.2.4

idna==3.10

itsdangerous==2.2.0

Jinja2==3.1.6

limits==5.5.0

markdown-it-py==4.0.0

MarkupSafe==3.0.2

mdurl==0.1.2

ordered-set==4.1.0

packaging==25.0

Pygments==2.19.2

python-dotenv==1.1.1

requests==2.32.4

rich==13.9.4

SQLAlchemy==2.0.43

typing_extensions==4.14.1

urllib3==2.5.0

Werkzeug==3.1.3

wrapt==1.17.3

WTForms==3.2.1

CMD进入项目所在目录后,安装依赖:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

(二)项目结构设计

项目的文件组织结构如下:

api-docs-website/

├── app/

│   ├── __init__.py          # 应用初始化

│   ├── config.py            # 配置文件

│   ├── models.py            # SQLite模型定义

│   ├── routes/              # 路由模块

│   │   ├── __init__.py

│   │   ├── main.py          # 首页、文档页路由

│   │   ├── test.py          # 在线测试路由

│   │   └── feedback.py      # 用户反馈路由

│   ├── static/              # 静态资源

│   │   ├── css/             # 样式表(Bootstrap、自定义)

│   │   ├── js/              # 脚本(测试工具、代码高亮)

│   │   └── img/             # 图片(logo、截图)

│   └── templates/           # 模板文件

│       ├── base.html        # 基础模板

│       ├── index.html        # 首页

│       ├── docs/             # 文档页模板

│       ├── test.html         # 在线测试页

│       └── feedback.html     # 反馈页

├── instance/                # SQLite数据库文件(自动生成)

│   └── api_docs.db

├── .env                     # 环境变量配置

├── .gitignore               # Git忽略文件

├── requirements.txt         # 依赖列表

└── run.py                   # 应用启动入口

(三)数据库设计(SQLite)

通过Flask-SQLAlchemy定义数据模型,存储用户反馈和接口调用示例,以下内容都放在app/models.py文件中。

1.反馈表(Feedback)

存储用户提交的问题与建议:

from datetime import datetime
from . import db  # 导入 __init__.py 中创建的全局db实例,而非重新创建

class Feedback(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), nullable=False)  # 用户名
    email = db.Column(db.String(100), nullable=False)   # 邮箱
    content = db.Column(db.Text, nullable=False)        # 反馈内容
    created_at = db.Column(db.DateTime, default=datetime.utcnow)  # 提交时间

2.接口示例表(ApiExample)

存储多语言调用示例:

class ApiExample(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    api_name = db.Column(db.String(50), nullable=False)  # 接口名称(如segment)
    language = db.Column(db.String(20), nullable=False)  # 语言(python、js等)
    code = db.Column(db.Text, nullable=False)            # 示例代码
    description = db.Column(db.String(200))              # 说明

三、网站核心功能开发

(一)应用初始化配置

1.配置文件(app/config.py)

作用:定义应用的核心配置参数,实现“配置与代码分离”,便于开发环境与生产环境的参数切换。

python代码如下:

import os
from datetime import timedelta
from dotenv import load_dotenv

# 加载.env环境变量(生产环境使用)
load_dotenv()

class Config:
    """基础配置类(开发/生产环境共用)"""
    # 密钥(用于会话加密、CSRF保护,生产环境从.env读取)
    SECRET_KEY = os.getenv('SECRET_KEY', 'dev-key-for-debug')  # 开发环境默认值,生产环境需修改
    
    # SQLite数据库配置(数据库文件存储路径)
    SQLALCHEMY_DATABASE_URI = os.getenv(
        'DATABASE_URI', 
        'sqlite:///../instance/api_docs.db'  # SQLite数据库路径
    )
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 关闭SQLAlchemy的修改跟踪(提升性能)
    
    # 中文分词接口基础URL(供在线测试页调用)
    API_BASE_URL = os.getenv('API_BASE_URL', 'http://47.107.172.52:5001')
    
    # 接口请求频率限制(默认100次/分钟)
    RATE_LIMIT = os.getenv('RATE_LIMIT', '100/minute')
    
    # 静态文件缓存时间(生产环境启用)
    SEND_FILE_MAX_AGE_DEFAULT = timedelta(hours=1)

class DevelopmentConfig(Config):
    """开发环境配置(本地调试用)"""
    DEBUG = True  # 启用调试模式(自动重启、错误详情展示)
    TESTING = False

class ProductionConfig(Config):
    """生产环境配置(服务器部署用)"""
    DEBUG = False
    TESTING = False
    # 生产环境必须从.env读取密钥,禁止使用默认值
    SECRET_KEY = os.getenv('SECRET_KEY')  # 强制从环境变量获取

# 配置映射(便于根据环境变量切换配置)
config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}

关键说明

(1)区分开发/生产环境:开发环境启用DEBUG模式,生产环境禁用并强制从环境变量读取敏感信息(如SECRET_KEY);

(2)数据库路径:SQLite数据库文件默认存储在instance/api_docs.db,避免硬编码绝对路径;

(3)接口URL配置:通过API_BASE_URL统一管理分词接口地址,方便测试页调用时直接引用。

2.应用初始化(app/__init__.py)

作用:创建Flask应用实例初始化核心组件(数据库、蓝图、扩展),是应用的“入口工厂”。

python代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS  # 解决跨域问题(在线测试页调用接口用)
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from .config import config
import os

# 初始化数据库实例(全局共享)
db = SQLAlchemy()

# 初始化频率限制器(防止接口滥用)
limiter = Limiter(
    key_func=get_remote_address,  # 基于客户端IP限制
    default_limits=["100/minute"],  # 默认限制(可被接口单独覆盖)
    storage_uri="memory://"  # 内存存储(轻量部署用,高并发可用Redis)
)

def create_app(config_name=None):
    """应用工厂函数:根据配置名称创建并配置应用实例"""
    if not config_name:
        config_name = 'default'  # 默认使用开发环境配置
    
    app = Flask(
        __name__,
        instance_relative_config=False,  # 不使用instance文件夹(简化部署)
        static_folder='static',  # 静态文件目录(CSS/JS/图片)
        template_folder='templates'  # 模板文件目录(HTML)
    )
    
    # 加载配置
    app.config.from_object(config[config_name])
    
    # 初始化扩展
    db.init_app(app)  # 数据库绑定应用
    limiter.init_app(app)  # 频率限制器绑定应用
    CORS(app, resources={r"/test/*": {"origins": "*"}})  # 允许测试页跨域请求
    
    # 确保instance目录存在(instance下放数据库)
    os.makedirs(app.instance_path, exist_ok=True)

    # 创建数据库表(首次运行时自动创建)
    with app.app_context():
        # 注册路由蓝图(模块化管理路由)
        from .routes import main_bp, test_bp, feedback_bp
        app.register_blueprint(main_bp)  # 主路由(首页、文档)
        app.register_blueprint(test_bp, url_prefix='/test')  # 在线测试路由
        app.register_blueprint(feedback_bp, url_prefix='/feedback')  # 用户反馈路由

        db.create_all()  # 基于models.py的模型定义创建表,已有表可注释
    
    return app

关键说明

(1)应用工厂模式:通过create_app函数动态创建应用,支持多环境配置切换;

(2)扩展初始化:集成SQLAlchemy(数据库)、CORS(跨域)、Limiter(频率限制),满足接口稳定性需求;

(3)蓝图注册:将路由按功能拆分(主页面、测试页、反馈页),避免单文件路由臃肿。

3.启动入口(run.py)

作用:应用的启动脚本,根据环境变量决定启动模式(开发/生产),是开发者启动应用的入口。

python代码如下:

import os
from app import create_app

# 从环境变量获取配置名称(默认开发环境)
config_name = os.getenv('FLASK_CONFIG', 'default')

# 创建应用实例
app = create_app(config_name)

if __name__ == '__main__':
    # 开发环境:使用Flask内置服务器(仅用于本地调试)
    # 生产环境:通过Gunicorn启动(见下文Gunicorn配置)
    app.run(
        host=os.getenv('FLASK_HOST', '0.0.0.0'),  # 允许外部访问(服务器部署时)
        port=int(os.getenv('FLASK_PORT', 5002)),  # 端口(默认5002,避免与分词接口冲突)
        threaded=True  # 启用多线程(处理并发请求)
    )

关键说明

(1)环境变量控制:通过FLASK_CONFIG切换开发/生产环境(如export FLASK_CONFIG=production);

(2)端口配置:默认使用5002端口,避免与中文分词接口服务(默认5001)冲突;

(3)开发与生产区分:内置服务器仅用于开发,生产环境需通过Gunicorn启动

基础页面

1. 页面路由与模板设计

(1)路由定义(app/routes/main.py)

作用:定义网站核心路由(首页、文档中心),关联URL与模板,是用户访问页面的“导航中枢”。

python代码如下:

from flask import Blueprint, render_template
from app.models import ApiExample  # 用于获取接口示例代码

# 初始化蓝图(与base.html中的导航路径对应)
main_bp = Blueprint('main', __name__)

# 首页路由
@main_bp.route('/')
def index():
    """网站首页"""
    return render_template('index.html')

# 文档概览页路由
@main_bp.route('/docs')
def docs_overview():
    """接口概述文档页"""
    return render_template('docs/overview.html')

# 1. 基础分词接口文档路由
@main_bp.route('/docs/segment')
def docs_segment():
    """基础分词接口(/api/segment)文档页"""
    # 从数据库获取该接口的多语言示例代码
    examples = ApiExample.query.filter_by(api_name='segment').all()
    return render_template('docs/segment.html', examples=examples)

# 2. 词性标注接口文档路由
@main_bp.route('/docs/pos_tag')
def docs_pos_tag():
    """词性标注接口(/api/pos_tag)文档页"""
    examples = ApiExample.query.filter_by(api_name='pos_tag').all()
    return render_template('docs/pos_tag.html', examples=examples)

# 3. 自定义词典接口文档路由
@main_bp.route('/docs/custom_dict')
def docs_custom_dict():
    """自定义词典接口(/api/custom_dict)文档页"""
    examples = ApiExample.query.filter_by(api_name='custom_dict').all()
    return render_template('docs/custom_dict.html', examples=examples)

# 4. 批量分词接口文档路由
@main_bp.route('/docs/batch_segment')
def docs_batch_segment():
    """批量分词接口(/api/batch_segment)文档页"""
    examples = ApiExample.query.filter_by(api_name='batch_segment').all()
    return render_template('docs/batch_segment.html', examples=examples)

# 5. 服务状态接口文档路由
@main_bp.route('/docs/status')
def docs_status():
    """服务状态接口(/api/status)文档页"""
    examples = ApiExample.query.filter_by(api_name='status').all()
    return render_template('docs/status.html', examples=examples)

关键说明

1)蓝图隔离:通过main_bp蓝图统一管理主页面路由,与test_bp(测试页)、feedback_bp(反馈页)分离;

2)数据关联:路由函数从数据库(ApiExample模型)获取接口示例代码,动态渲染到文档页,避免模板硬编码;

3)URL设计:文档页URL与模板路径一致(如/docs/segment对应docs/segment.html),符合RESTful风格。

(2)基础模板(app/templates/base.html)

采用Bootstrap 5布局,包含导航栏、侧边栏和内容区。

作用:定义网站统一布局(导航栏、侧边栏、页脚),通过模板继承减少重复代码,确保页面风格一致。

app/templates/base.html页面的代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}中文分词接口文档{% endblock %}</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="{{ url_for('static', filename='css/custom.css') }}">
    {% block extra_css %}{% endblock %}
</head>
<body>
    <!-- 导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
        <div class="container">
            <a class="navbar-brand" href="/">中文分词接口文档</a>
            <div class="collapse navbar-collapse">
                <ul class="navbar-nav me-auto">
                    <li class="nav-item"><a class="nav-link" href="/docs">文档中心</a></li>
                    <li class="nav-item"><a class="nav-link" href="/test">在线测试</a></li>
                    <li class="nav-item"><a class="nav-link" href="/feedback">用户反馈</a></li>
                </ul>
            </div>
        </div>
    </nav>

    <!-- 主体内容 -->
    <div class="container mt-4">
        <div class="row">
            <!-- 侧边栏(文档目录,按文档接口类型补充完整) -->
            <div class="col-md-3">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">文档目录</h5>
                        <ul class="list-group list-group-flush">
                            <li class="list-group-item">
                                <a href="/docs">1. 接口概述</a>
                                <ul class="ms-3 mt-2">
                                    <li><a href="/docs#info">1.1 基础信息</a></li>
                                    <li><a href="/docs#response-format">1.2 通用返回格式</a></li>
                                    <li><a href="/docs#error-codes">1.3 错误码说明</a></li>
                                </ul>
                            </li>
                            
                            <li class="list-group-item">
                                <a href="/docs/segment">2. 基础分词接口</a>
                                <ul class="ms-3 mt-2">
                                    <li><a href="/docs/segment#parameters">2.1 请求参数</a></li>
                                    <li><a href="/docs/segment#response">2.2 返回格式</a></li>
                                    <li><a href="/docs/segment#examples">2.3 调用示例</a></li>
                                </ul>
                            </li>
                            
                            <li class="list-group-item">
                                <a href="/docs/pos_tag">3. 词性标注接口</a>
                                <ul class="ms-3 mt-2">
                                    <li><a href="/docs/pos_tag#parameters">3.1 请求参数</a></li>
                                    <li><a href="/docs/pos_tag#response">3.2 返回格式</a></li>
                                    <li><a href="/docs/pos_tag#tag-explain">3.2.1 词性标签说明</a></li>
                                    <li><a href="/docs/pos_tag#examples">3.3 调用示例</a></li>
                                </ul>
                            </li>
                            
                            <li class="list-group-item">
                                <a href="/docs/custom_dict">4. 自定义词典接口</a>
                                <ul class="ms-3 mt-2">
                                    <li><a href="/docs/custom_dict#parameters">4.1 请求参数</a></li>
                                    <li><a href="/docs/custom_dict#response">4.2 返回格式</a></li>
                                    <li><a href="/docs/custom_dict#examples">4.3 调用示例</a></li>
                                    <li><a href="/docs/custom_dict#file-format">4.3.3 词典文件格式</a></li>
                                </ul>
                            </li>
                            
                            <li class="list-group-item">
                                <a href="/docs/batch_segment">5. 批量分词接口</a>
                                <ul class="ms-3 mt-2">
                                    <li><a href="/docs/batch_segment#parameters">5.1 请求参数</a></li>
                                    <li><a href="/docs/batch_segment#response">5.2 返回格式</a></li>
                                    <li><a href="/docs/batch_segment#examples">5.3 调用示例</a></li>
                                </ul>
                            </li>
                            
                            <li class="list-group-item">
                                <a href="/docs/status">6. 服务状态接口</a>
                                <ul class="ms-3 mt-2">
                                    <li><a href="/docs/status#parameters">6.1 请求参数</a></li>
                                    <li><a href="/docs/status#response">6.2 返回格式</a></li>
                                    <li><a href="/docs/status#examples">6.3 调用示例</a></li>
                                </ul>
                            </li>
                        </ul>
                    </div>
                </div>
            </div>

            <!-- 主内容区(由子模板填充) -->
            <div class="col-md-9">
                {% block content %}{% endblock %}
            </div>
        </div>
    </div>

    <!-- 页脚 -->
    <footer class="mt-5 py-3 bg-light">
        <div class="container text-center">
            <p class="mb-0">© 2025 中文分词接口文档 | 基于Python3.10.6+Flask开发</p>
        </div>
    </footer>

    <!-- 外部JS资源 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    {% block extra_js %}{% endblock %}  <!-- 页面专属JS -->
</body>
</html>

关键说明

1)静态资源引用:通过url_for('static', filename='...')动态生成静态文件路径,避免硬编码导致的路径错误;

2)路由关联:导航栏和侧边栏的链接通过url_for生成(如url_for('main.docs_overview')),与main.py中的路由函数绑定,确保 URL 变更时自动同步;

3)条件渲染:仅文档页显示侧边栏(通过request.path.startswith('/docs')判断),优化非文档页的布局空间。

2.首页(index.html)

核心作用:网站入口与功能总览,引导用户快速定位所需资源。

主要内容:

(1)简介中文分词接口的核心功能(如多模式分词、词性标注等)和服务地址(http://47.107.172.52:5001/);

(2)提供导航入口,包括“文档中心”“在线测试”“用户反馈”三大核心模块的快捷链接;

(3)突出接口的优势(如易于集成、支持多语言调用、稳定可靠等),降低用户认知门槛。

app/templates/Index.html页面的代码如下:

<!-- app/templates/index.html -->
{% extends 'base.html' %}

{% block title %}中文分词接口文档 - 首页{% endblock %}

{% block content %}
<div class="jumbotron">
    <h1 class="display-4">中文分词接口服务</h1>
    <p class="lead">基于Python3.10.6与jieba库的高性能中文分词接口,支持多模式分词、词性标注、自定义词典等功能。</p>
    <hr class="my-4">
    <p>接口地址:<code>http://47.107.172.52:5001/</code></p>
    <a class="btn btn-primary btn-lg" href="/docs" role="button">查看文档</a>
    <a class="btn btn-success btn-lg" href="/test" role="button">在线测试</a>
</div>

<table class="table table-striped">
    <thead>
        <tr>
            <th>接口名称</th>
            <th>接口地址</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>基础分词接口</td>
            <td><code>http://47.107.172.52:5001/api/segment</code></td>
        </tr>
        <tr>
            <td>词性标注接口</td>
            <td><code>http://47.107.172.52:5001/api/pos_tag</code></td>
        </tr>
        <tr>
            <td>自定义词典接口</td>
            <td><code>http://47.107.172.52:5001/api/custom_dict</code></td>
        </tr>
        <tr>
            <td>批量分词接口</td>
            <td><code>http://47.107.172.52:5001/api/batch_segment</code></td>
        </tr>
        <tr>
            <td>服务状态接口</td>
            <td><code>http://47.107.172.52:5001/api/status</code></td>
        </tr>
    </tbody>
</table>

<div class="row mt-5">
    <div class="col-md-4">
        <h3>功能特点</h3>
        <p>支持精确模式、全模式、搜索引擎模式三种分词方式,满足不同场景需求。</p>
    </div>
    <div class="col-md-4">
        <h3>易于集成</h3>
        <p>提供多语言调用示例,支持Python、JavaScript、Java等主流开发语言。</p>
    </div>
    <div class="col-md-4">
        <h3>稳定可靠</h3>
        <p>部署于Windows Server 2022,支持高并发处理,平均响应时间低于100ms。</p>
    </div>
</div>
{% endblock %}

界面效果如下:

文档中心(docs/目录下页面)

文档中心是网站的核心模块,以“三级目录”结构详细说明接口的使用规范,包含以下页面:

1. 接口概述页(docs/overview.html)

核心作用:提供接口的基础信息和通用规则,帮助用户建立整体认知。

主要内容:

(1)接口基础信息:服务地址、通信协议(HTTP)、请求方式(POST/GET)、数据格式(JSON)、认证方式(API-Key);

(2)通用返回格式:统一的 JSON 结构(code状态码、message描述、data业务数据)及字段说明;

(3)错误码说明:列举常见错误码(如 1001 参数错误、1002 权限错误)及解决方案,减少用户调试成本。

app/templates/docs/overview.html页面的代码如下:

<!-- app/templates/docs/overview.html -->
{% extends 'base.html' %}

{% block title %}接口概述 - 文档中心{% endblock %}

{% block content %}
<h1>1. 接口概述</h1>
<p class="lead">本文档详细介绍中文分词接口的调用方式、参数说明及返回格式,帮助开发者快速集成服务。</p>

<h2 id="info">1.1 基础信息</h2>
<table class="table table-striped">
    <thead>
        <tr>
            <th>项目</th>
            <th>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>服务地址</td>
            <td><code>http://47.107.172.52:5001/</code></td>
        </tr>
        <tr>
            <td>通信协议</td>
            <td>HTTP/HTTPS</td>
        </tr>
        <tr>
            <td>请求方式</td>
            <td>POST(除服务状态接口为GET)</td>
        </tr>
        <tr>
            <td>数据格式</td>
            <td>JSON</td>
        </tr>
        <tr>
            <td>认证方式</td>
            <td>API-Key(请求头<code>Authorization: API-Key {your_key}</code>)</td>
        </tr>
    </tbody>
</table>

<!-- 1.2 通用返回格式(完整展示) -->
<h2 id="response-format">1.2 通用返回格式</h2>
<p>所有接口返回JSON结构,包含以下字段:</p>
<pre><code class="language-json">{
  "code": 0,          // 状态码(0:成功,非0:错误)
  "message": "success",  // 状态描述
  "data": {}          // 业务数据(成功时返回)
}</code></pre>
<p><strong>字段说明:</strong></p>
<ul>
  <li><code>code</code>:状态码,0表示成功,非0表示错误(详见1.3错误码说明);</li>
  <li><code>message</code>:状态描述,成功时为"success",错误时为具体错误信息;</li>
  <li><code>data</code>:业务数据,成功时返回接口具体结果,错误时可能为null。</li>
</ul>

<!-- 1.3 错误码说明(完整展示) -->
<h2 id="error-codes">1.3 错误码说明</h2>
<p>接口返回的非0状态码对应以下错误类型:</p>
<table class="table table-striped">
    <thead>
        <tr>
            <th>错误码</th>
            <th>说明</th>
            <th>解决方案</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1001</td>
            <td>参数错误</td>
            <td>检查请求参数是否完整(如text为必填项)、格式是否正确(如mode只能为"accurate"|"full"|"search")</td>
        </tr>
        <tr>
            <td>1002</td>
            <td>权限错误</td>
            <td>验证API-Key是否有效,或是否遗漏请求头<code>Authorization: API-Key {your_key}</code></td>
        </tr>
        <tr>
            <td>1003</td>
            <td>资源不存在</td>
            <td>自定义词典接口加载文件时,检查file_url是否有效或文件是否存在</td>
        </tr>
        <tr>
            <td>1004</td>
            <td>请求频率限制</td>
            <td>降低请求频率,确保不超过<code>RATE_LIMIT</code>配置(默认100次/分钟)</td>
        </tr>
        <tr>
            <td>2001</td>
            <td>服务器内部错误</td>
            <td>联系管理员,通过服务日志(<code>logs/</code>目录)排查具体错误</td>
        </tr>
        <tr>
            <td>2002</td>
            <td>服务暂时不可用</td>
            <td>服务可能处于维护中,稍后重试;或通过<code>/api/status</code>接口查看服务状态</td>
        </tr>
    </tbody>
</table>
{% endblock %}

{% block extra_js %}
<!-- 引用本地Ace.js -->
<script src="{{ url_for('static', filename='js/ace-builds/src-noconflict/ace.js') }}"></script>
<script>
    document.addEventListener('DOMContentLoaded', function() {
        document.querySelectorAll('pre code').forEach(block => {
            const preElement = block.parentElement;
            const editor = ace.edit(preElement);
            editor.setTheme('ace/theme/github'); // 本地主题文件
            const language = block.className.split('-')[1] || 'text';
            try {
              editor.session.setMode(`ace/mode/${language}`);  // 本地模式文件
            } catch (e) {
              console.warn(`模式文件缺失: ace/mode/${language},使用文本模式替代`);
              editor.session.setMode('ace/mode/text');
            }
            editor.setReadOnly(true);
            editor.resize();
        });
    });
</script>
{% endblock %}

界面效果如下:

2. 基础分词接口文档页(docs/segment.html)

核心作用:详细说明最常用的/api/segment接口的使用方法。

主要内容:

(1)功能描述:支持精确模式、全模式、搜索引擎模式三种分词方式,可过滤停用词和标点;

(2)请求参数:详细说明text(待分词文本)、mode(分词模式)、use_hmm(是否启用 HMM 模型)等参数的类型、必填性和示例值;

(3)返回格式:展示分词结果的JSON结构(如segments数组包含分词后的词语);

(4)调用示例:提供Python、JavaScript、curl等多语言的调用代码,方便不同技术栈的用户直接复用。

app/templates/docs/segment.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}基础分词接口 - 文档中心{% endblock %}

{% block content %}
<h1>2. 基础分词接口</h1>
<p class="lead">对中文文本进行分词处理,支持三种分词模式(精确模式、全模式、搜索引擎模式),可过滤停用词和标点符号。</p>
<table class="table table-striped">
    <thead>
        <tr>
            <th>项目</th>
            <th>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>接口地址</td>
            <td><code>http://47.107.172.52:5001/api/segment</code></td>
        </tr>
        <tr>
            <td>通信协议</td>
            <td>HTTP</td>
        </tr>
        <tr>
            <td>请求方式</td>
            <td>POST</td>
        </tr>
        <tr>
            <td>数据格式</td>
            <td>JSON</td>
        </tr>
        <tr>
            <td>认证方式</td>
            <td>API-Key(请求头<code>Authorization: API-Key {your_key}</code>)</td>
        </tr>
    </tbody>
</table>
<h2 id="parameters">2.1 请求参数</h2>
<table class="table table-striped">
    <thead>
        <tr>
            <th>参数名</th>
            <th>类型</th>
            <th>是否必填</th>
            <th>默认值</th>
            <th>说明</th>
            <th>示例值</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>text</td>
            <td>string</td>
            <td>是</td>
            <td>-</td>
            <td>待分词的中文文本,长度不超过10000字</td>
            <td>"我来到北京清华大学"</td>
        </tr>
        <tr>
            <td>mode</td>
            <td>string</td>
            <td>否</td>
            <td>"accurate"</td>
            <td>分词模式:<br>
                - "accurate":精确模式(默认,最精准分词)<br>
                - "full":全模式(列出所有可能的分词结果)<br>
                - "search":搜索引擎模式(在精确模式基础上拆分长词)
            </td>
            <td>"search"</td>
        </tr>
        <tr>
            <td>use_hmm</td>
            <td>bool</td>
            <td>否</td>
            <td>true</td>
            <td>是否启用HMM模型识别未登录词(词典中未收录的词)</td>
            <td>true</td>
        </tr>
        <tr>
            <td>filter_stopwords</td>
            <td>bool</td>
            <td>否</td>
            <td>false</td>
            <td>是否过滤停用词(如“的”“是”“在”等无实际意义的词,停用词表见`data/stopwords.txt`)</td>
            <td>true</td>
        </tr>
        <tr>
            <td>filter_punctuation</td>
            <td>bool</td>
            <td>否</td>
            <td>false</td>
            <td>是否过滤标点符号(如“,”“。”“!”等)</td>
            <td>true</td>
        </tr>
    </tbody>
</table>

<h2 id="response">2.2 返回格式</h2>
<p>接口返回JSON结构,包含以下字段:</p>
<pre><code class="language-json">{
  "code": 0,
  "message": "success",
  "data": {
    "text": "我来到北京清华大学",  // 原始输入文本
    "segments": ["我", "来到", "北京", "清华大学"],  // 分词结果列表
    "mode": "accurate",  // 实际使用的分词模式
    "use_hmm": true,  // 是否启用HMM模型
    "timestamp": 1718000000  // 处理时间戳(秒级)
  }
}</code></pre>
<p><strong>字段说明:</strong></p>
<ul>
  <li><code>code=0</code>表示成功,非0表示错误(详见1.3错误码说明);</li>
  <li><code>segments</code>为分词结果核心字段,按文本顺序排列。</li>
</ul>

<h2 id="examples">2.3 调用示例</h2>

<h3>2.3.1 Python示例(使用requests库)</h3>
<pre><code class="language-python">import requests
import json

# 接口地址
url = "http://47.107.172.52:5001/api/segment"

# 请求头(包含API密钥认证)
headers = {
    "Content-Type": "application/json",
    "Authorization": "API-Key your_secure_api_key_here"  # 替换为实际API密钥
}

# 请求参数
data = {
    "text": "我来到北京清华大学",
    "mode": "accurate",
    "use_hmm": True,
    "filter_stopwords": False,
    "filter_punctuation": False
}

# 发送POST请求
response = requests.post(
    url,
    headers=headers,
    data=json.dumps(data, ensure_ascii=False)  # 确保中文正常编码
)

# 打印响应结果
print(json.dumps(response.json(), indent=2, ensure_ascii=False))</code></pre>

<h3>2.3.2 JavaScript示例(浏览器/Node.js)</h3>
<pre><code class="language-javascript">// 接口地址
const url = "http://47.107.172.52:5001/api/segment";

// 请求参数
const data = {
    "text": "我来到北京清华大学",
    "mode": "search",
    "use_hmm": true
};

// 发送请求
fetch(url, {
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Authorization": "API-Key your_secure_api_key_here"  // 替换为实际API密钥
    },
    body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => {
    console.log(JSON.stringify(result, null, 2));  // 打印格式化结果
})
.catch(error => console.error("请求失败:", error));</code></pre>

<h3>2.3.3 curl命令示例(Windows CMD)</h3>
<pre><code class="language-bash">curl -X POST http://47.107.172.52:5001/api/segment ^
  -H "Content-Type: application/json" ^
  -H "Authorization: API-Key your_secure_api_key_here" ^
  -d "{\"text\": \"我来到北京清华大学\", \"mode\": \"full\", \"use_hmm\": true}"</code></pre>
{% endblock %}

{% block extra_js %}
<!-- 加载Ace Editor库 -->
<script src="{{ url_for('static', filename='js/ace-builds/src-noconflict/ace.js') }}"></script>
<script>
  // 等待DOM加载完成后初始化(关键:避免代码块未加载时执行)
  document.addEventListener('DOMContentLoaded', function() {
    // 选择所有代码块
    document.querySelectorAll('pre code').forEach(block => {
      // 获取父元素(pre标签)作为编辑器容器
      const preElement = block.parentElement;
      // 初始化Ace编辑器
      const editor = ace.edit(preElement);
      // 设置主题(文档推荐github主题)
      editor.setTheme('ace/theme/github');
      // 根据code标签的class确定语言模式(如language-json → json模式)
      const language = block.className.split('-')[1] || 'text';
      try {
            editor.session.setMode(`ace/mode/${language}`);  // 本地模式文件
        } catch (e) {
            console.warn(`模式文件缺失: ace/mode/${language},使用文本模式替代`);
            editor.session.setMode('ace/mode/text');
        }
      // 只读模式
      editor.setReadOnly(true);
      // 自适应大小
      editor.resize();
    });
  });
</script>
{% endblock %}

界面效果如下:

3. 词性标注接口文档页(docs/pos_tag.html)

核心作用:说明/api/pos_tag接口的功能与使用,该接口在分词基础上增加词性标注。

主要内容:

(1)功能描述:返回每个词语的词性标签(如名词n、动词v、形容词a等);

(2)词性标签说明:列举常见标签的含义及示例(如r代表代词、x代表标点);

(3)调用示例:与基础分词接口类似,提供多语言代码示例,突出“词性标注”的返回字段(tags数组包含word和tag)。

app/templates/docs/pos_tag.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}词性标注接口 - 文档中心{% endblock %}

{% block content %}
<h1>3. 词性标注接口</h1>
<p class="lead">在分词基础上,为每个词语添加词性标签(如名词、动词、形容词等),支持与基础分词接口相同的参数配置。</p>
<table class="table table-striped">
    <thead>
        <tr>
            <th>项目</th>
            <th>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>接口地址</td>
            <td><code>http://47.107.172.52:5001/api/pos_tag</code></td>
        </tr>
        <tr>
            <td>通信协议</td>
            <td>HTTP</td>
        </tr>
        <tr>
            <td>请求方式</td>
            <td>POST</td>
        </tr>
        <tr>
            <td>数据格式</td>
            <td>JSON</td>
        </tr>
        <tr>
            <td>认证方式</td>
            <td>API-Key(请求头<code>Authorization: API-Key {your_key}</code>)</td>
        </tr>
    </tbody>
</table>
<h2 id="parameters">3.1 请求参数</h2>
<table class="table table-striped">
    <thead>
        <tr>
            <th>参数名</th>
            <th>类型</th>
            <th>是否必填</th>
            <th>默认值</th>
            <th>说明</th>
            <th>示例值</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>text</td>
            <td>string</td>
            <td>是</td>
            <td>-</td>
            <td>待处理的中文文本,长度不超过10000字</td>
            <td>"我爱自然语言处理"</td>
        </tr>
        <tr>
            <td>mode</td>
            <td>string</td>
            <td>否</td>
            <td>"accurate"</td>
            <td>分词模式(同基础分词接口:accurate/full/search)</td>
            <td>"accurate"</td>
        </tr>
        <tr>
            <td>use_hmm</td>
            <td>bool</td>
            <td>否</td>
            <td>true</td>
            <td>是否启用HMM模型识别未登录词</td>
            <td>true</td>
        </tr>
        <tr>
            <td>filter_stopwords</td>
            <td>bool</td>
            <td>否</td>
            <td>false</td>
            <td>是否过滤停用词</td>
            <td>true</td>
        </tr>
        <tr>
            <td>filter_punctuation</td>
            <td>bool</td>
            <td>否</td>
            <td>false</td>
            <td>是否过滤标点符号</td>
            <td>true</td>
        </tr>
    </tbody>
</table>

<h2 id="response">3.2 返回格式</h2>
<pre><code class="language-json">{
  "code": 0,
  "message": "success",
  "data": {
    "text": "我爱自然语言处理",
    "tags": [
      {"word": "我", "tag": "r"},    // r:代词
      {"word": "爱", "tag": "v"},    // v:动词
      {"word": "自然", "tag": "a"},  // a:形容词
      {"word": "语言", "tag": "n"},  // n:名词
      {"word": "处理", "tag": "v"}   // v:动词
    ],
    "mode": "accurate",
    "use_hmm": true,
    "timestamp": 1718000100
  }
}</code></pre>

<h3>3.2.1 常见词性标签说明</h3>
<table class="table table-striped">
    <thead>
        <tr>
            <th>标签</th>
            <th>说明</th>
            <th>示例</th>
        </tr>
    </thead>
    <tbody>
        <tr><td>n</td><td>名词</td><td>北京、语言、计算机</td></tr>
        <tr><td>v</td><td>动词</td><td>来到、处理、学习</td></tr>
        <tr><td>a</td><td>形容词</td><td>自然、优秀、热门</td></tr>
        <tr><td>r</td><td>代词</td><td>我、你、他、这</td></tr>
        <tr><td>p</td><td>介词</td><td>于、在、从、对于</td></tr>
        <tr><td>c</td><td>连词</td><td>和、但、如果、因为</td></tr>
        <tr><td>x</td><td>标点符号</td><td>,、。!?</td></tr>
    </tbody>
</table>

<h2 id="examples">3.3 调用示例</h2>

<h3>3.3.1 Python示例</h3>
<pre><code class="language-python">import requests
import json

url = "http://47.107.172.52:5001/api/pos_tag"
headers = {
    "Content-Type": "application/json",
    "Authorization": "API-Key your_secure_api_key_here"
}
data = {
    "text": "我爱自然语言处理",
    "mode": "accurate"
}

response = requests.post(url, headers=headers, data=json.dumps(data))
print(json.dumps(response.json(), indent=2, ensure_ascii=False))</code></pre>

<h3>3.3.2 curl示例</h3>
<pre><code class="language-bash">curl -X POST http://47.107.172.52:5001/api/pos_tag ^
  -H "Content-Type: application/json" ^
  -H "Authorization: API-Key your_secure_api_key_here" ^
  -d "{\"text\": \"我爱自然语言处理\", \"mode\": \"accurate\"}"</code></pre>
{% endblock %}

{% block extra_js %}
<!-- 引用本地Ace.js -->
<script src="{{ url_for('static', filename='js/ace-builds/src-noconflict/ace.js') }}"></script>
<script>
    document.addEventListener('DOMContentLoaded', function() {
        document.querySelectorAll('pre code').forEach(block => {
            const preElement = block.parentElement;
            const editor = ace.edit(preElement);
            editor.setTheme('ace/theme/github'); // 本地主题文件
            const language = block.className.split('-')[1] || 'text';
            try {
              editor.session.setMode(`ace/mode/${language}`);  // 本地模式文件
            } catch (e) {
              console.warn(`模式文件缺失: ace/mode/${language},使用文本模式替代`);
              editor.session.setMode('ace/mode/text');
            }
            editor.setReadOnly(true);
            editor.resize();
        });
    });
</script>
{% endblock %}

界面效果如下:

4. 自定义词典接口文档页(docs/custom_dict.html)

核心作用:说明/api/custom_dict接口的使用,支持用户添加/删除专业词汇,优化特定领域分词效果。

主要内容:

(1)功能描述:支持三种操作(add添加词语、delete删除词语、load加载外部词典文件);

(2)请求参数:详细说明action(操作类型)、words(词语列表)、file_url(词典文件 URL)的格式要求;

(3)自定义词典格式:示例词典文件的规范(如“词语 词频 词性”格式);

(4)调用示例:提供添加词语、加载外部词典的代码示例,解决专业领域(如医疗、金融)的分词误差问题。

app/templates/docs/custom_dict.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}自定义词典接口 - 文档中心{% endblock %}

{% block content %}
<h1>4. 自定义词典接口</h1>
<p class="lead">支持动态添加/删除自定义词语,或加载外部词典文件,优化特定领域(如医疗、金融)的分词效果。</p>
<table class="table table-striped">
    <thead>
        <tr>
            <th>项目</th>
            <th>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>接口地址</td>
            <td><code>http://47.107.172.52:5001/api/custom_dict</code></td>
        </tr>
        <tr>
            <td>通信协议</td>
            <td>HTTP</td>
        </tr>
        <tr>
            <td>请求方式</td>
            <td>POST</td>
        </tr>
        <tr>
            <td>数据格式</td>
            <td>JSON</td>
        </tr>
        <tr>
            <td>认证方式</td>
            <td>API-Key(请求头<code>Authorization: API-Key {your_key}</code>)</td>
        </tr>
    </tbody>
</table>
<h2 id="parameters">4.1 请求参数</h2>
<table class="table table-striped">
    <thead>
        <tr>
            <th>参数名</th>
            <th>类型</th>
            <th>是否必填</th>
            <th>说明</th>
            <th>示例值</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>action</td>
            <td>string</td>
            <td>是</td>
            <td>操作类型:<br>
                - "add":添加词语<br>
                - "delete":删除词语<br>
                - "load":加载词典文件
            </td>
            <td>"add"</td>
        </tr>
        <tr>
            <td>words</td>
            <td>array</td>
            <td>仅action=add/delete时必填</td>
            <td>词语列表:<br>
                - 元素为字符串时:仅指定词语(如"李小福")<br>
                - 元素为对象时:可指定词频(freq)和词性(tag)(如{"word": "创新办", "freq": 5, "tag": "n"})
            </td>
            <td>["李小福", {"word": "创新办", "freq": 5}]</td>
        </tr>
        <tr>
            <td>file_url</td>
            <td>string</td>
            <td>仅action=load时必填</td>
            <td>自定义词典文件的URL(文件格式:每行一个词语,支持"词语 词频 词性"格式)</td>
            <td>"https://example.com/custom_dict.txt"</td>
        </tr>
    </tbody>
</table>

<h2 id="response">4.2 返回格式</h2>

<h3>4.2.1 当action=add/delete时</h3>
<pre><code class="language-json">{
  "code": 0,
  "message": "success",
  "data": {
    "action": "add",
    "success_count": 2,  // 成功添加/删除的词语数量
    "failed_words": [],  // 失败的词语列表(如格式错误)
    "timestamp": 1718000200
  }
}</code></pre>

<h3>4.2.2 当action=load时</h3>
<pre><code class="language-json">{
  "code": 0,
  "message": "success",
  "data": {
    "action": "load",
    "success": true,  // 是否加载成功
    "file_url": "https://example.com/custom_dict.txt",
    "timestamp": 1718000200
  }
}</code></pre>

<h2 id="examples">4.3 调用示例</h2>

<h3>4.3.1 添加自定义词语</h3>
<pre><code class="language-python">import requests
import json

url = "http://47.107.172.52:5001/api/custom_dict"
headers = {
    "Content-Type": "application/json",
    "Authorization": "API-Key your_secure_api_key_here"
}
data = {
    "action": "add",
    "words": [
        "李小福",  // 仅指定词语
        {"word": "创新办", "freq": 5, "tag": "n"}  // 指定词频和词性
    ]
}

response = requests.post(url, headers=headers, data=json.dumps(data))
print(json.dumps(response.json(), indent=2))</code></pre>

<h3>4.3.2 加载外部词典文件</h3>
<pre><code class="language-bash">curl -X POST http://47.107.172.52:5001/api/custom_dict ^
  -H "Content-Type: application/json" ^
  -H "Authorization: API-Key your_secure_api_key_here" ^
  -d "{\"action\": \"load\", \"file_url\": \"https://example.com/custom_dict.txt\"}"</code></pre>

<h3>4.3.3 自定义词典文件格式示例(custom_dict.txt)</h3>
<pre><code class="language-text">云计算 5  # 词语 词频(可选)
人工智能 3 n  # 词语 词频 词性(可选)
机器学习  # 仅词语
自然语言处理 10 n</code></pre>
{% endblock %}

{% block extra_js %}
<!-- 引用本地Ace.js -->
<script src="{{ url_for('static', filename='js/ace-builds/src-noconflict/ace.js') }}"></script>
<script>
    document.addEventListener('DOMContentLoaded', function() {
        document.querySelectorAll('pre code').forEach(block => {
            const preElement = block.parentElement;
            const editor = ace.edit(preElement);
            editor.setTheme('ace/theme/github'); // 本地主题文件
            const language = block.className.split('-')[1] || 'text';
            try {
              editor.session.setMode(`ace/mode/${language}`);  // 本地模式文件
            } catch (e) {
              console.warn(`模式文件缺失: ace/mode/${language},使用文本模式替代`);
              editor.session.setMode('ace/mode/text');
            }
            editor.setReadOnly(true);
            editor.resize();
        });
    });
</script>
{% endblock %}

界面效果如下:

5. 批量分词接口文档页(docs/batch_segment.html)

核心作用:说明/api/batch_segment接口的使用,支持同时处理多条文本,提升批量处理效率。

主要内容:

(1)功能描述:一次请求处理多条文本(最多100条),返回批量分词结果;

(2)请求参数:重点说明texts(文本数组)的格式要求;

(3)返回格式:展示包含多条文本分词结果的JSON结构(results数组对应每条文本的segments);

(4)调用示例:提供批量处理的代码示例,适合文档集合分词等场景。

app/templates/docs/batch_segment.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}批量分词接口 - 文档中心{% endblock %}

{% block content %}
<h1>5. 批量分词接口</h1>
<p class="lead">同时处理多条文本,返回批量分词结果,适合批量处理场景(如文档集合分词),提高处理效率。</p>
<table class="table table-striped">
    <thead>
        <tr>
            <th>项目</th>
            <th>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>接口地址</td>
            <td><code>http://47.107.172.52:5001/api/batch_segment</code></td>
        </tr>
        <tr>
            <td>通信协议</td>
            <td>HTTP</td>
        </tr>
        <tr>
            <td>请求方式</td>
            <td>POST</td>
        </tr>
        <tr>
            <td>数据格式</td>
            <td>JSON</td>
        </tr>
        <tr>
            <td>认证方式</td>
            <td>API-Key(请求头<code>Authorization: API-Key {your_key}</code>)</td>
        </tr>
    </tbody>
</table>
<h2 id="parameters">5.1 请求参数</h2>
<table class="table table-striped">
    <thead>
        <tr>
            <th>参数名</th>
            <th>类型</th>
            <th>是否必填</th>
            <th>默认值</th>
            <th>说明</th>
            <th>示例值</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>texts</td>
            <td>array</td>
            <td>是</td>
            <td>-</td>
            <td>待分词的文本列表,每个元素为字符串,最多支持100条文本</td>
            <td>["我来到北京清华大学", "我爱自然语言处理"]</td>
        </tr>
        <tr>
            <td>mode</td>
            <td>string</td>
            <td>否</td>
            <td>"accurate"</td>
            <td>分词模式(同基础分词接口:accurate/full/search)</td>
            <td>"accurate"</td>
        </tr>
        <tr>
            <td>use_hmm</td>
            <td>bool</td>
            <td>否</td>
            <td>true</td>
            <td>是否启用HMM模型识别未登录词</td>
            <td>true</td>
        </tr>
        <tr>
            <td>filter_stopwords</td>
            <td>bool</td>
            <td>否</td>
            <td>false</td>
            <td>是否过滤停用词</td>
            <td>true</td>
        </tr>
        <tr>
            <td>filter_punctuation</td>
            <td>bool</td>
            <td>否</td>
            <td>false</td>
            <td>是否过滤标点符号</td>
            <td>true</td>
        </tr>
    </tbody>
</table>

<h2 id="response">5.2 返回格式</h2>
<pre><code class="language-json">{
  "code": 0,
  "message": "success",
  "data": {
    "total": 2,  // 处理的文本总数
    "results": [
      {
        "text": "我来到北京清华大学",
        "segments": ["我", "来到", "北京", "清华大学"]
      },
      {
        "text": "我爱自然语言处理",
        "segments": ["我", "爱", "自然", "语言", "处理"]
      }
    ],
    "mode": "accurate",
    "use_hmm": true,
    "timestamp": 1718000300
  }
}</code></pre>

<h2 id="examples">5.3 调用示例</h2>

<h3>5.3.1 Python示例</h3>
<pre><code class="language-python">import requests
import json

url = "http://47.107.172.52:5001/api/batch_segment"
headers = {
    "Content-Type": "application/json",
    "Authorization": "API-Key your_secure_api_key_here"
}
data = {
    "texts": [
        "我来到北京清华大学",
        "我爱自然语言处理",
        "中文分词是自然语言处理的基础"
    ],
    "mode": "accurate",
    "filter_stopwords": true
}

response = requests.post(url, headers=headers, data=json.dumps(data))
print(json.dumps(response.json(), indent=2, ensure_ascii=False))</code></pre>

<h3>5.3.2 JavaScript示例</h3>
<pre><code class="language-javascript">const url = "http://47.107.172.52:5001/api/batch_segment";
const data = {
    "texts": ["我来到北京清华大学", "我爱自然语言处理"],
    "mode": "search"
};

fetch(url, {
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Authorization": "API-Key your_secure_api_key_here"
    },
    body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => console.log(JSON.stringify(result, null, 2)));</code></pre>
{% endblock %}

{% block extra_js %}
<!-- 引用本地Ace.js -->
<script src="{{ url_for('static', filename='js/ace-builds/src-noconflict/ace.js') }}"></script>
<script>
    document.addEventListener('DOMContentLoaded', function() {
        document.querySelectorAll('pre code').forEach(block => {
            const preElement = block.parentElement;
            const editor = ace.edit(preElement);
            editor.setTheme('ace/theme/github'); // 本地主题文件
            const language = block.className.split('-')[1] || 'text';
            try {
              editor.session.setMode(`ace/mode/${language}`);  // 本地模式文件
            } catch (e) {
              console.warn(`模式文件缺失: ace/mode/${language},使用文本模式替代`);
              editor.session.setMode('ace/mode/text');
            }
            editor.setReadOnly(true);
            editor.resize();
        });
    });
</script>
{% endblock %}

界面效果如下:

6. 服务状态接口文档页(docs/status.html)

核心作用:说明/api/status接口的使用,用于监控服务运行状态,无需认证即可访问。

主要内容:

(1)功能描述:返回服务版本、运行状态、资源占用(CPU /内存)、请求统计等监控数据;

(2)返回格式:展示包含version(版本)、status(运行状态)、cpu_usage(CPU使用率)等字段的JSON结构;

(3)调用示例:提供 curl、Python 等简单调用方式,方便用户快速检查服务健康度。

app/templates/docs/status.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}服务状态接口 - 文档中心{% endblock %}

{% block content %}
<h1>6. 服务状态接口</h1>
<p class="lead">返回服务运行状态、版本信息、资源占用等监控数据,无需认证即可访问,用于监控服务健康度。</p>
<table class="table table-striped">
    <thead>
        <tr>
            <th>项目</th>
            <th>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>接口地址</td>
            <td><code>http://47.107.172.52:5001/api/status</code></td>
        </tr>
        <tr>
            <td>通信协议</td>
            <td>HTTP</td>
        </tr>
        <tr>
            <td>请求方式</td>
            <td>GET</td>
        </tr>
        <tr>
            <td>数据格式</td>
            <td>JSON</td>
        </tr>
        <tr>
            <td>认证方式</td>
            <td>API-Key(请求头<code>Authorization: API-Key {your_key}</code>)</td>
        </tr>
    </tbody>
</table>
<h2 id="parameters">6.1 请求参数</h2>
<p>无请求参数,直接发送GET请求即可。</p>

<h2 id="response">6.2 返回格式</h2>
<pre><code class="language-json">{
  "code": 0,
  "message": "success",
  "data": {
    "version": "1.0.0",  // 服务版本号
    "status": "running",  // 服务状态(running/initializing/error)
    "start_time": 1718000000,  // 服务启动时间戳
    "current_time": 1718000400,  // 当前时间戳
    "request_count": 500,  // 累计请求次数
    "average_response_time": 45.2,  // 平均响应时间(毫秒)
    "cpu_usage": 15.3,  // 当前CPU使用率(%)
    "memory_usage": 25.8,  // 当前内存使用率(%)
    "debug_mode": false  // 是否启用调试模式
  }
}</code></pre>

<h2 id="examples">6.3 调用示例</h2>

<h3>6.3.1 curl示例</h3>
<pre><code class="language-bash">curl -X GET http://47.107.172.52:5001/api/status</code></pre>

<h3>6.3.2 Python示例</h3>
<pre><code class="language-python">import requests

url = "http://47.107.172.52:5001/api/status"
response = requests.get(url)
print(response.json())</code></pre>

<h3>6.3.3 浏览器直接访问</h3>
<p>在浏览器地址栏输入:<br>
<code>http://47.107.172.52:5001/api/status</code><br>
即可查看服务状态(JSON格式)。</p>
{% endblock %}

{% block extra_js %}
<!-- 引用本地Ace.js -->
<script src="{{ url_for('static', filename='js/ace-builds/src-noconflict/ace.js') }}"></script>
<script>
    document.addEventListener('DOMContentLoaded', function() {
        document.querySelectorAll('pre code').forEach(block => {
            const preElement = block.parentElement;
            const editor = ace.edit(preElement);
            editor.setTheme('ace/theme/github'); // 本地主题文件
            const language = block.className.split('-')[1] || 'text';
            try {
              editor.session.setMode(`ace/mode/${language}`);  // 本地模式文件
            } catch (e) {
              console.warn(`模式文件缺失: ace/mode/${language},使用文本模式替代`);
              editor.session.setMode('ace/mode/text');
            }
            editor.setReadOnly(true);
            editor.resize();
        });
    });
</script>
{% endblock %}

界面效果如下:

2. 示例代码初始化

通过Flask CLI命令初始化数据库中的示例代码:

app/cli.py代码如下:

# app/cli.py
import click
from flask import Flask
from .models import db, ApiExample

def register_cli(app: Flask):
    @app.cli.command('init-examples')
    def init_examples():
        """初始化接口示例代码"""
        examples = [
            # 基础分词接口-Python示例
            {
                "api_name": "segment",
                "language": "python",
                "description": "使用requests库调用接口",
                "code": """import requests
import json

url = "http://47.107.172.52:5001/api/segment"
headers = {
    "Content-Type": "application/json",
    "Authorization": "API-Key your_api_key"
}
data = {
    "text": "我来到北京清华大学",
    "mode": "accurate"
}

response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
"""
            },
            # 其他语言和接口的示例...
        ]

        # 清空现有数据并插入新示例
        ApiExample.query.delete()
        for item in examples:
            db.session.add(ApiExample(**item))
        db.session.commit()
        click.echo("示例代码初始化完成")

)在线测试功能开发

1. 在线测试功能说明

核心作用提供可视化的接口测试工具,允许用户无需编写代码即可调用接口并查看结果,降低测试门槛。

主要功能:

(1)接口选择:支持切换测试的接口(如基础分词、词性标注、批量分词等);

(2)参数配置:根据所选接口动态显示对应的参数输入框(如text文本框、mode下拉框、use_hmm复选框等);

(3)一键调用:填写参数后点击“调用接口”,自动向后端发送请求并展示返回结果(含语法高亮);

(4)错误提示:若请求失败(如参数错误、API-Key 无效),显示详细错误信息(如状态码、非JSON响应内容),帮助用户快速排查问题。

2. 测试页面与表单设计

(1)路由(app/routes/test.py)

python代码如下:

# app/routes/test.py
from flask import Blueprint, render_template, request, jsonify, current_app
import requests
import json

test_bp = Blueprint('test', __name__)

@test_bp.route('/')
def test_index():
    return render_template('test.html')

@test_bp.route('/call', methods=['POST'])
def call_api():
    try:
        API_BASE_URL = current_app.config['API_BASE_URL']
        data = request.json  # 获取前端传递的JSON数据
        api_endpoint = data.get('endpoint')
        api_key = data.get('api_key', '')

        # 1. 确定请求方法
        method = 'GET' if api_endpoint == 'status' else 'POST'

        # 2. 构建接口参数(针对不同接口适配)
        params = {}
        if api_endpoint == 'segment' or api_endpoint == 'pos_tag':
            # 基础分词/词性标注
            params = {
                "text": data.get('text', ''),
                "mode": data.get('mode', 'accurate'),
                "use_hmm": data.get('use_hmm', True),
                "filter_stopwords": data.get('filter_stopwords', False),
                "filter_punctuation": data.get('filter_punctuation', False)
            }
        elif api_endpoint == 'batch_segment':
            # 批量分词
            params = {
                "texts": data.get('texts', []),  # 接收数组
                "mode": data.get('mode', 'accurate'),
                "use_hmm": data.get('use_hmm', True),
                "filter_stopwords": data.get('filter_stopwords', False),
                "filter_punctuation": data.get('filter_punctuation', False)
            }
        elif api_endpoint == 'custom_dict':
            # 自定义词典
            params = {
                "action": data.get('action', ''),
                "words": data.get('words', []),  # 接收数组
                "file_url": data.get('file_url', '')
            }

        # 3. 调用接口
        url = f"{API_BASE_URL}/api/{api_endpoint}"
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"API-Key {api_key}"
        }

        response = requests.request(
            method=method,
            url=url,
            headers=headers,
            json=params if method == 'POST' else None,
            timeout=10
        )

        # 4. 解析响应
        try:
            response_json = response.json()
        except json.JSONDecodeError:
            return jsonify({
                "success": False,
                "error": f"接口返回非JSON内容:{response.text[:500]}",
                "status_code": response.status_code
            })

        if not response.ok:
            return jsonify({
                "success": False,
                "error": f"接口请求失败(状态码:{response.status_code})",
                "response": response_json
            })

        return jsonify({
            "success": True,
            "result": response_json
        })

    except requests.exceptions.RequestException as e:
        return jsonify({
            "success": False,
            "error": f"请求接口失败:{str(e)}"
        })
    except Exception as e:
        return jsonify({
            "success": False,
            "error": f"服务器处理错误:{str(e)}"
        })

(2)测试页面模板(app/templates/test.html)

app/templates/test.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}在线测试 - 接口文档{% endblock %}

{% block content %}
<h1>在线接口测试</h1>
<p class="lead">填写参数并调用接口,实时查看返回结果。</p>

<div class="row">
    <!-- 表单区 -->
    <div class="col-md-6">
        <form id="testForm" class="card p-4">
            <div class="mb-3">
                <label for="endpoint" class="form-label">接口选择</label>
                <select id="endpoint" name="endpoint" class="form-select">
                    <option value="segment">基础分词接口(POST)</option>
                    <option value="pos_tag">词性标注接口(POST)</option>
                    <option value="custom_dict">自定义词典接口(POST)</option>
                    <option value="batch_segment">批量分词接口(POST)</option>
                    <option value="status">服务状态接口(GET)</option>
                </select>
            </div>

            <!-- 1. 基础分词/词性标注共用参数(text单文本) -->
            <div class="mb-3" id="singleTextContainer">
                <label for="text" class="form-label">待处理文本(text)</label>
                <textarea id="text" name="text" class="form-control" rows="3">我来到北京清华大学</textarea>
            </div>

            <!-- 2. 批量分词专属参数(texts数组) -->
            <div class="mb-3" id="batchTextContainer" style="display: none;">
                <label for="texts" class="form-label">批量文本(texts,每行一个)</label>
                <textarea id="texts" name="texts" class="form-control" rows="3">我来到北京清华大学
我爱自然语言处理
中文分词是NLP的基础</textarea>
                <small class="text-muted">提示:每行输入一个文本,自动转换为数组</small>
            </div>

            <!-- 3. 自定义词典专属参数 -->
            <div id="customDictContainer" style="display: none;">
                <div class="mb-3">
                    <label for="action" class="form-label">操作类型(action)</label>
                    <select id="action" name="action" class="form-select">
                        <option value="add">添加词语(add)</option>
                        <option value="delete">删除词语(delete)</option>
                        <option value="load">加载词典文件(load)</option>
                    </select>
                </div>

                <div class="mb-3" id="wordsContainer">
                    <label for="words" class="form-label">词语列表(words,每行一个,add/delete时必填)</label>
                    <textarea id="words" name="words" class="form-control" rows="3">李小福
{"word": "创新办", "freq": 5, "tag": "n"}</textarea>
                    <small class="text-muted">提示:每行一个词语,可直接写词或JSON对象(如{"word":"云计算"})</small>
                </div>

                <div class="mb-3" id="fileUrlContainer" style="display: none;">
                    <label for="file_url" class="form-label">词典文件URL(file_url,load时必填)</label>
                    <input type="text" id="file_url" name="file_url" class="form-control" 
                           placeholder="https://example.com/custom_dict.txt">
                </div>
            </div>

            <!-- 通用参数(mode、api_key等) -->
            <div class="row g-3 mb-3" id="commonParamsContainer">
                <div class="col-md-6">
                    <label for="mode" class="form-label">分词模式(mode)</label>
                    <select id="mode" name="mode" class="form-select">
                        <option value="accurate">精确模式</option>
                        <option value="full">全模式</option>
                        <option value="search">搜索引擎模式</option>
                    </select>
                </div>
                <div class="col-md-6">
                    <label for="api_key" class="form-label">API密钥(API-Key)</label>
                    <input type="text" id="api_key" name="api_key" class="form-control" 
                           placeholder="your_api_key" value="your_secure_api_key_here">
                </div>
            </div>

            <div class="mb-3" id="optionsContainer">
                <div class="form-check form-check-inline">
                    <input class="form-check-input" type="checkbox" id="use_hmm" name="use_hmm" checked>
                    <label class="form-check-label" for="use_hmm">使用HMM模型</label>
                </div>
                <div class="form-check form-check-inline">
                    <input class="form-check-input" type="checkbox" id="filter_stopwords" name="filter_stopwords">
                    <label class="form-check-label" for="filter_stopwords">过滤停用词</label>
                </div>
                <div class="form-check form-check-inline">
                    <input class="form-check-input" type="checkbox" id="filter_punctuation" name="filter_punctuation">
                    <label class="form-check-label" for="filter_punctuation">过滤标点符号</label>
                </div>
            </div>

            <button type="submit" class="btn btn-primary">调用接口</button>
        </form>
    </div>

    <!-- 结果展示区 -->
    <div class="col-md-6">
        <div class="card p-4">
            <h5 class="card-title">返回结果</h5>
            <pre id="result" class="bg-light p-3 rounded"><code class="language-json">等待调用...</code></pre>
        </div>
    </div>
</div>
{% endblock %}

{% block extra_js %}
<script>
    // 1. 动态切换参数输入框(核心修正)
    const endpointSelect = document.getElementById('endpoint');
    const singleTextContainer = document.getElementById('singleTextContainer');
    const batchTextContainer = document.getElementById('batchTextContainer');
    const customDictContainer = document.getElementById('customDictContainer');
    const commonParamsContainer = document.getElementById('commonParamsContainer');
    const optionsContainer = document.getElementById('optionsContainer');
    const actionSelect = document.getElementById('action');
    const wordsContainer = document.getElementById('wordsContainer');
    const fileUrlContainer = document.getElementById('fileUrlContainer');

    // 根据接口类型显示对应参数
    function toggleParamsByEndpoint() {
        const endpoint = endpointSelect.value;
        // 隐藏所有容器,再按需显示
        singleTextContainer.style.display = 'none';
        batchTextContainer.style.display = 'none';
        customDictContainer.style.display = 'none';
        commonParamsContainer.style.display = 'none';
        optionsContainer.style.display = 'none';

        switch (endpoint) {
            case 'segment':
            case 'pos_tag':
                // 基础分词/词性标注:显示单文本+通用参数
                singleTextContainer.style.display = 'block';
                commonParamsContainer.style.display = 'block';
                optionsContainer.style.display = 'block';
                break;
            case 'batch_segment':
                // 批量分词:显示多文本+通用参数
                batchTextContainer.style.display = 'block';
                commonParamsContainer.style.display = 'block';
                optionsContainer.style.display = 'block';
                break;
            case 'custom_dict':
                // 自定义词典:显示专属参数
                customDictContainer.style.display = 'block';
                commonParamsContainer.style.display = 'block'; // 保留API-Key
                toggleCustomDictParams(); // 联动显示action对应的参数
                break;
            case 'status':
                // 状态接口:无需参数
                break;
        }
    }

    // 自定义词典接口:根据action显示words或file_url
    function toggleCustomDictParams() {
        const action = actionSelect.value;
        wordsContainer.style.display = (action === 'add' || action === 'delete') ? 'block' : 'none';
        fileUrlContainer.style.display = (action === 'load') ? 'block' : 'none';
    }

    // 绑定事件
    endpointSelect.addEventListener('change', toggleParamsByEndpoint);
    actionSelect.addEventListener('change', toggleCustomDictParams);
    toggleParamsByEndpoint(); // 初始化

    // 2. 表单提交处理(参数格式转换)
    document.getElementById('testForm').addEventListener('submit', async (e) => {
        e.preventDefault();
        const resultEl = document.getElementById('result');
        resultEl.innerHTML = '<code>调用中...</code>';

        const endpoint = document.getElementById('endpoint').value;
        const formData = {
            endpoint: endpoint,
            api_key: document.getElementById('api_key').value,
            mode: document.getElementById('mode').value,
            use_hmm: document.getElementById('use_hmm').checked,
            filter_stopwords: document.getElementById('filter_stopwords').checked,
            filter_punctuation: document.getElementById('filter_punctuation').checked
        };

        // 针对不同接口处理参数
        if (endpoint === 'segment' || endpoint === 'pos_tag') {
            // 单文本接口
            formData.text = document.getElementById('text').value;
        } else if (endpoint === 'batch_segment') {
            // 批量分词:将多行文本转为数组
            formData.texts = document.getElementById('texts').value.split('\n')
                .map(line => line.trim()).filter(line => line); // 去除空行
        } else if (endpoint === 'custom_dict') {
            // 自定义词典:处理action、words、file_url
            formData.action = document.getElementById('action').value;
            if (formData.action === 'add' || formData.action === 'delete') {
                // 将多行words转为数组(支持文本或JSON对象)
                formData.words = document.getElementById('words').value.split('\n')
                    .map(line => {
                        line = line.trim();
                        if (!line) return null;
                        // 尝试解析为JSON对象,否则作为字符串
                        try { return JSON.parse(line); } 
                        catch { return line; }
                    }).filter(item => item !== null);
            } else if (formData.action === 'load') {
                formData.file_url = document.getElementById('file_url').value;
            }
        }

        try {
            // 调用后端测试接口
            const response = await fetch('/test/call', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(formData)
            });

            if (!response.ok) throw new Error(`状态码 ${response.status}`);
            const data = await response.json();

            // 展示结果
            if (data.success) {
                resultEl.innerHTML = `<code class="language-json">${JSON.stringify(data.result, null, 2)}</code>`;
                if (window.ace) {
                    const editor = ace.edit(resultEl);
                    editor.setTheme('ace/theme/github');
                    editor.session.setMode('ace/mode/json');
                    editor.setReadOnly(true);
                    editor.resize();
                }
            } else {
                resultEl.innerHTML = `<code class="text-danger">错误:${data.error}\n状态码:${data.status_code || '未知'}</code>`;
            }
        } catch (err) {
            resultEl.innerHTML = `<code class="text-danger">请求失败:${err.message}</code>`;
        }
    });
</script>
{% endblock %}

界面效果如下:

)用户反馈功能开发

1.用户反馈功能说明

核心作用:收集用户在接口使用或网站浏览中遇到的问题、建议,用于优化服务。

主要功能:

(1)反馈表单:包含用户名、邮箱、反馈内容三个必填项,通过表单验证确保信息完整;

(2)提交反馈:数据存储到SQLite数据库(Feedback表),方便管理员查看和跟进;

(3)反馈提示:提交成功后显示感谢信息,提升用户体验。

2. 用户反馈页面与表单设计

(1)路由(app/routes/feedback.py)

python代码如下:

from flask import Blueprint, render_template, request, redirect, url_for, flash
from app.models import db, Feedback
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email

feedback_bp = Blueprint('feedback', __name__)

# 反馈表单
class FeedbackForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired()])
    email = EmailField('邮箱', validators=[DataRequired(), Email()])
    content = TextAreaField('反馈内容', validators=[DataRequired()])
    submit = SubmitField('提交反馈')

@feedback_bp.route('/', methods=['GET', 'POST'])
def feedback_index():
    form = FeedbackForm()
    if form.validate_on_submit():
        # 保存反馈到数据库
        feedback = Feedback(
            username=form.username.data,
            email=form.email.data,
            content=form.content.data
        )
        db.session.add(feedback)
        db.session.commit()
        flash('反馈提交成功,感谢您的建议!', 'success')
        return redirect(url_for('feedback.feedback_index'))
    return render_template('feedback.html', form=form)
(2)用户反馈页面模板(app/templates/feedback.html)

app/templates/feedback.html页面的代码如下:

{% extends 'base.html' %}

{% block title %}用户反馈 - 接口文档{% endblock %}

{% block content %}
<h1>用户反馈</h1>
<p class="lead">如有接口使用问题或功能建议,请填写以下表单。</p>

<div class="row">
    <div class="col-md-8">
        <form method="POST" class="card p-4">
            {{ form.hidden_tag() }}  <!-- CSRF保护 -->
            
            <div class="mb-3">
                {{ form.username.label(class="form-label") }}
                {{ form.username(class="form-control") }}
                {% for error in form.username.errors %}
                    <div class="text-danger">{{ error }}</div>
                {% endfor %}
            </div>

            <div class="mb-3">
                {{ form.email.label(class="form-label") }}
                {{ form.email(class="form-control") }}
                {% for error in form.email.errors %}
                    <div class="text-danger">{{ error }}</div>
                {% endfor %}
            </div>

            <div class="mb-3">
                {{ form.content.label(class="form-label") }}
                {{ form.content(class="form-control", rows="5") }}
                {% for error in form.content.errors %}
                    <div class="text-danger">{{ error }}</div>
                {% endfor %}
            </div>

            {{ form.submit(class="btn btn-primary") }}
        </form>
    </div>
</div>
{% endblock %}

界面效果如下:

四、网站部署与优化

(一)生产环境部署

1.配置生产环境变量文件.env(ini)

作用存储生产环境的敏感配置(如密钥、数据库路径),避免代码中硬编码敏感信息,提升安全性。

# 应用配置

FLASK_CONFIG=production  # 启用生产环境配置

FLASK_HOST=0.0.0.0       # 服务器绑定所有网络接口

FLASK_PORT=5002          # 应用端口

# 敏感信息(必须修改为自定义值)

SECRET_KEY=your-very-secure-random-key-here-123  # 随机生成的密钥(推荐32位以上)

# 数据库配置(生产环境可替换为MySQL/PostgreSQL)

DATABASE_URI=sqlite:////api-docs-website/instance/api_docs.db  # 绝对路径(服务器上)

# 接口配置

API_BASE_URL=http://47.107.172.52:5001  # 分词接口正式地址

RATE_LIMIT=200/minute  # 生产环境放宽频率限制

关键说明

(1)安全要求:.env文件禁止提交到代码仓库(需在.gitignore中添加),仅在服务器部署时手动创建;

(2)与config.py联动:通过python-dotenv库加载,Config类中的os.getenv方法读取,实现配置动态注入;

(3)路径规范:生产环境数据库路径使用绝对路径(如/var/www/...),避免相对路径在服务器部署时出错。

2.使用Gunicorn作为WSGI服务器

作用:Gunicorn是生产环境的WSGI服务器,相比Flask内置服务器,支持更高并发、更稳定的请求处理,适合部署到Windows Server 2022或Linux服务器。配置与使用步骤:

(1)安装Gunicorn

在虚拟环境中安装(支持Python 3.10+)

pip install gunicorn

(2)创建Gunicorn配置文件(gunicorn_config.py)

# 生产环境启动配置

bind = "0.0.0.0:5002"  # 绑定地址和端口(与.env中的FLASK_PORT一致)

workers = 4  # 工作进程数(推荐=CPU核心数*2+1)

worker_class = "sync"  # 同步工作模式(适合I/O密集型接口)

timeout = 120  # 请求超时时间(秒)

keepalive = 5  # 长连接超时时间(秒)

accesslog = "./logs/access.log"  # 访问日志路径

errorlog = "./logs/error.log"  # 错误日志路径

loglevel = "info"  # 日志级别(info/warning/error)

(3)启动入口(wsgi.py)

作用:应用的生产环境的启动脚本,是开发者启动应用的入口。

python代码如下:

import os
from app import create_app

# 从环境变量获取配置名称(生产环境)
config_name = os.getenv('FLASK_CONFIG', 'production')

# 创建应用实例
app = create_app(config_name)

if __name__ == '__main__':
    # 生产环境:通过Gunicorn启动
    app.run(
        host=os.getenv('FLASK_HOST', '0.0.0.0'),  # 允许外部访问(服务器部署时)
        port=int(os.getenv('FLASK_PORT', 5002)),  # 端口(默认5002,避免与分词接口冲突)
        threaded=True  # 启用多线程(处理并发请求)
    )

(4)启动命令(生产环境)

在项目根目录执行(确保已加载.env环境变量),Windows Server 2022需在PowerShell中运行。

gunicorn -c gunicorn_config.py "wsgi:app"

(5)关键说明

1)替代内置服务器:Flask内置服务器仅用于开发,Gunicorn通过多进程处理并发请求,提升稳定性;

2)日志管理:通过accesslog和errorlog记录请求详情和错误,便于排查生产环境问题;

3)进程配置:workers数量根据服务器CPU核心数调整(如4核CPU设为4-8个进程),避免资源浪费。

(二)性能优化

1.静态资源缓存

在Nginx中配置静态资源缓存:

location /static {

    alias /path/to/api-docs-website/app/static;

    expires 1d;  # 缓存1天

}

2.数据库查询优化

在models.py中,为常用查询添加索引(如ApiExample.api_name):

class ApiExample(db.Model):

    # ...

    __table_args__ = (db.Index('idx_api_name', 'api_name'),)

3.前端优化

压缩CSS/JS文件(使用Gzip)。

延迟加载非关键资源(如代码高亮组件)。

(三)功能扩展

1.接口调用统计

集成Chart.js展示接口调用趋势,需后端接口提供/api/status端点返回统计数据。

2.用户认证

添加注册/登录功能,支持保存用户的测试历史和API密钥。

3.多语言支持

使用Flask-Babel实现中英文切换,适配国际化需求。

五、接口文档详细内容

(一)接口概述

1. 接口基础信息

服务地址:http://47.107.172.52:5001/

通信协议:HTTP

请求方式:POST(除服务状态接口为 GET)

数据格式:JSON

认证方式:API-Key(请求头Authorization: API-Key {your_key})

2. 通用返回格式

所有接口返回JSON结构,包含以下字段:

{

  "code": 0,          // 状态码(0:成功,非0:错误)

  "message": "success",  // 状态描述

  "data": {}          // 业务数据(成功时返回)

}

3. 错误码说明

错误码

说明

解决方案

1001

参数错误

检查请求参数是否完整(如text为必填项)、格式是否正确(如mode只能为"accurate"|"full"|"search")

1002

权限错误

验证API-Key是否有效,或是否遗漏请求头Authorization: API-Key {your_key}

1003

资源不存在

自定义词典接口加载文件时,检查file_url是否有效或文件是否存在

1004

请求频率限制

降低请求频率,确保不超过RATE_LIMIT配置(默认100次/分钟)

2001

服务器内部错误

联系管理员,通过服务日志(logs/目录)排查具体错误

2002

服务暂时不可用

服务可能处于维护中,稍后重试;或通过/api/status接口查看服务状态

(二)基础分词接口(/api/segment)

1. 功能描述

对输入的中文文本进行分词,支持三种模式(精确、全模式、搜索引擎),可过滤停用词和标点符号。

2. 请求参数

参数名

类型

是否必填

默认值

说明

text

string

-

待分词的中文文本,长度不超过10000字

mode

string

"accurate"

分词模式:

- "accurate":精确模式

- "full":全模式

- "search":搜索引擎模式

use_hmm

bool

true

是否使用 HMM 模型识别未登录词

filter_stopwords

bool

false

是否过滤停用词(如 “的”“是”)

filter_punctuation

bool

false

是否过滤标点符号(如 “,”“。”)

3. 返回示例

接口返回的内容都是json格式:

{

  "code": 0,

  "message": "success",

  "data": {

    "text": "我来到北京清华大学",

    "segments": ["我", "来到", "北京", "清华大学"],

    "mode": "accurate",

    "use_hmm": true,

    "timestamp": 1718000000

  }

}

4. 调用示例

(1)Python示例

python程序调用接口的实例如下:

import requests

import json

url = "http://47.107.172.52:5001/api/segment"

headers = {

    "Content-Type": "application/json",

    "Authorization": "API-Key your_api_key"

}

data = {

    "text": "我来到北京清华大学",

    "mode": "accurate",

    "use_hmm": True

}

response = requests.post(url, headers=headers, data=json.dumps(data))

print(json.dumps(response.json(), indent=2, ensure_ascii=False))

(2)JavaScript示例

Javascript程序调用接口的实例如下:

fetch("http://47.107.172.52:5001/api/segment", {

  method: "POST",

  headers: {

    "Content-Type": "application/json",

    "Authorization": "API-Key your_api_key"

  },

  body: JSON.stringify({

    "text": "我来到北京清华大学",

    "mode": "search"

  })

})

.then(response => response.json())

.then(data => console.log(JSON.stringify(data, null, 2)))

.catch(error => console.error("Error:", error));

(3)curl示例

通过curl命令调用接口的实例如下:

curl -X POST http://47.107.172.52:5001/api/segment \

  -H "Content-Type: application/json" \

  -H "Authorization: API-Key your_api_key" \

  -d '{"text": "我来到北京清华大学", "mode": "full", "filter_punctuation": true}'

(三)词性标注接口(/api/pos_tag)

1. 功能描述

在分词基础上,为每个词语添加词性标签(如名词、动词),支持与基础分词接口相同的参数配置。

2. 请求参数

同基础分词接口(text、mode、use_hmm 等)。

3. 返回示例

接口返回的内容是json格式:

{

  "code": 0,

  "message": "success",

  "data": {

    "text": "我爱自然语言处理",

    "tags": [

      {"word": "我", "tag": "r"},    // r:代词

      {"word": "爱", "tag": "v"},    // v:动词

      {"word": "自然", "tag": "a"},  // a:形容词

      {"word": "语言", "tag": "n"},  // n:名词

      {"word": "处理", "tag": "v"}   // v:动词

    ],

    "mode": "accurate",

    "use_hmm": true,

    "timestamp": 1718000100

  }

}

4. 词性标签说明

标签

说明

示例

n

名词

北京、语言

v

动词

来到、处理

a

形容词

自然、热门

r

代词

我、他

p

介词

于、在

c

连词

和、但

x

标点符号

,、。

(四)自定义词典接口(/api/custom_dict)

1. 功能描述

支持动态添加/删除自定义词语,或加载外部词典文件,优化特定领域的分词效果。

2. 请求参数

参数名

类型

是否必填

说明

action

string

操作类型:

- "add":添加词语

- "delete":删除词语

- "load":加载词典文件

words

array

action 为 "add"/"delete" 时必填,元素为字符串或对象(如 {"word": "云计算", "freq": 5})

file_url

string

action 为 "load" 时必填,词典文件的 URL(格式:词语 词频 词性)

3. 返回示例

接口返回的内容是json格式:

{

  "code": 0,

  "message": "success",

  "data": {

    "action": "add",

    "success_count": 2,

    "failed_words": [],

    "timestamp": 1718000200

  }

}

4. 自定义词典格式

添加自定义词典的格式如下:

云计算 5  # 词语 词频(可选)

人工智能 3 n  # 词语 词频 词性(可选)

机器学习  # 仅词语

(五)批量分词接口(/api/batch_segment)

1. 功能描述

同时处理多条文本,返回批量分词结果,适合批量处理场景,提高效率。

2. 请求参数

参数名

类型

是否必填

说明

texts

array

文本列表,每个元素为字符串,最多支持100条

mode

string

同基础分词接口

use_hmm

bool

同基础分词接口

3. 返回示例

接口返回的内容是json格式:

{

  "code": 0,

  "message": "success",

  "data": {

    "total": 2,

    "results": [

      {

        "text": "我来到北京清华大学",

        "segments": ["我", "来到", "北京", "清华大学"]

      },

      {

        "text": "我爱自然语言处理",

        "segments": ["我", "爱", "自然", "语言", "处理"]

      }

    ],

    "mode": "accurate",

    "timestamp": 1718000300

  }

}

(六)服务状态接口(/api/status)

1. 功能描述

返回服务运行状态、版本信息、资源占用等监控数据,无需认证。

2. 请求方式

通过GET的方式请求。

3. 返回示例

接口返回的内容是json格式:

{

  "code": 0,

  "message": "success",

  "data": {

    "version": "1.0.0",

    "status": "running",

    "start_time": 1718000000,

    "current_time": 1718000400,

    "request_count": 500,

    "average_response_time": 45.2,

    "cpu_usage": 15.3,

    "memory_usage": 25.8

  }

}

六、常见问题与解决方案

(一)接口调用失败

1.权限错误(1002)

检查API-Key是否正确,是否包含空格或特殊字符。

确认请求头格式:Authorization: API-Key your_key(注意“API-Key”后有空格)。

2.参数错误(1001)

确保必填参数(如text)已提供,且格式正确(如text为字符串)。

批量接口中texts必须为非空数组,元素需为字符串。

3.连接超时

检查服务器地址和端口是否可达(使用ping 47.107.172.52测试网络)。

确认服务器防火墙已开放5001端口。

(二)分词结果不符合预期

1.专业词汇未正确分词

使用自定义词典接口添加词汇(如“人工智能”“云计算”)。

示例:action: "add", words: ["人工智能", {"word": "云计算", "freq": 10}]

2.未登录词识别错误

开启HMM模型(use_hmm: true),增强未登录词识别能力。

对于领域特定词汇,优先通过自定义词典添加。

3.标点符号未过滤

检查filter_punctuation参数是否设为true,或手动过滤结果中的标点(如x词性的词语)。

(三)网站使用问题

1.在线测试无响应

检查网络连接,确保网站可访问接口服务器(http://47.107.172.52:5001)。

打开浏览器控制台(F12)查看错误信息,可能是跨域或 API-Key 错误。

2.示例代码无法运行

替换代码中的your_api_key为实际密钥。

确保已安装必要依赖(如 Python 的 requests 库:pip install requests)。

3.反馈提交失败

检查表单字段是否完整(用户名、邮箱、内容均为必填)。

邮箱格式需符合规范(如user@example.com)。

七、总结

本教程详细介绍了基于Python3.10.6、Flask和SQLite的接口说明网站开发过程,涵盖环境搭建、功能实现、部署优化及文档编写。该网站不仅提供了全面的接口文档(含参数说明、返回格式、示例代码),还支持在线测试和用户反馈,帮助开发者快速集成中文分词接口服务。


网站公告

今日签到

点亮在社区的每一天
去签到