一、网站项目概述与技术栈
(一)项目背景与意义
已部署的中文分词接口系统(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的接口说明网站开发过程,涵盖环境搭建、功能实现、部署优化及文档编写。该网站不仅提供了全面的接口文档(含参数说明、返回格式、示例代码),还支持在线测试和用户反馈,帮助开发者快速集成中文分词接口服务。