[DB API] POST /employee/add 请求失败: 404 Client Error: NOT FOUND for url: http://10.160.64.218:5606/v1/employee/add | 响应内容: <!doctype html> <html lang=en> <title>404 Not Found</title> <h1>Not Found</h1> <p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try agai 添加员工失败: 404 Client Error: NOT FOUND for url: http://10.160.64.218:5606/v1/employee/add Traceback (most recent call last): File "D:\UserData\Desktop\pyproject\main.py", line 98, in <module> add_employee_example() File "D:\UserData\Desktop\pyproject\main.py", line 10, in add_employee_example result = db_service.add_employee({ File "D:\UserData\Desktop\pyproject\db_module.py", line 23, in add_employee return self._request('/employee/add', 'POST', payload) File "D:\UserData\Desktop\pyproject\db_module.py", line 137, in _request response.raise_for_status() File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\models.py", line 1026, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: NOT FOUND for url: http://10.160.64.218:5606/v1/employee/add——这是怎么回事,是你前端写的代码有问题吗
时间: 2025-08-21 07:02:56 AIGC 浏览: 29
<think>我们遇到了404错误,这意味着客户端能够连接到服务器,但服务器没有找到请求的资源(URL路径不正确)。
根据错误信息,请求的URL是:http://10.160.64.218:5606/v1/employee/add
而Flask服务器返回了404 Not Found。
可能的原因:
1. 后端Flask应用的路由定义与客户端请求的URL不匹配。
2. 客户端使用的base URL不正确(例如,版本号不一致,或者路径前缀不一致)。
3. 后端服务没有正确注册路由。
在之前的代码中,我们定义了后端路由为:
@employee_blueprint.route('/add', methods=['POST'])
并且将蓝图注册到应用时指定了url_prefix='/v1/employee',因此完整的路由应该是:/v1/employee/add
但是,请注意,我们注册蓝图时使用了两个蓝图:employee_blueprint和clock_blueprint,并且分别指定了url_prefix。
因此,问题可能在于客户端请求的URL与服务器实际路由不一致?实际上,我们构建的URL是:
base_url + endpoint = "http://10.160.64.218:5606/v1" + "/employee/add" -> 得到的是:http://10.160.64.218:5606/v1/employee/add
而服务器端期望的路由是:/v1/employee/add,所以看起来应该匹配。
然而,请注意Flask蓝图的url_prefix是'/v1/employee',那么蓝图中的路由'/add'组合后就是'/v1/employee/add',所以应该匹配。
那么为什么会出现404?我们需要检查服务器端是否确实运行了该路由。
建议进行以下检查:
1. 在Flask服务器启动时,打印出所有已注册的路由,以确认路由确实存在。
2. 使用curl或Postman直接测试服务器上的路由,看是否能够访问。
在Flask应用中,可以在创建应用后添加以下代码来打印路由:
```python
# 在app.run()之前添加
@app.before_first_request
def list_routes():
print('可用路由:')
for rule in app.url_map.iter_rules():
print(f"{rule.endpoint}: {rule.methods} -> {rule}")
```
或者,更简单的方式是在启动后立即打印:
```python
if __name__ == '__main__':
with app.app_context():
for rule in app.url_map.iter_rules():
print(rule)
app.run(host='0.0.0.0', port=5606, debug=True)
```
2. 检查客户端请求的URL是否确实与服务器路由匹配。注意,URL是区分大小写的,并且斜杠也很重要。
3. 检查Flask应用是否真的运行在5606端口,并且没有其他进程占用该端口。
4. 检查客户端请求的URL是否写错了,比如多了一个斜杠或者少了一个斜杠?
在客户端代码中,我们定义的端点是:/employee/add(注意,以斜杠开头)
而base_url是:http://10.160.64.218:5606/v1
拼接后:http://10.160.64.218:5606/v1/employee/add
但是,在Flask中,蓝图注册的url_prefix是'/v1/employee',所以实际路由是:/v1/employee/add
所以,从路径上看,两者是一致的。
那么另一个可能性是:Flask应用在注册蓝图时,是否将蓝图注册到了正确的URL前缀?
回顾之前的代码:
```python
# 注册蓝图
app.register_blueprint(employee_blueprint, url_prefix='/v1/employee')
app.register_blueprint(clock_blueprint, url_prefix='/v1/clock')
```
这样,employee_blueprint中的路由'/add'就会变成'/v1/employee/add'。
因此,问题可能出在服务器端路由定义的其他方面。
我注意到在之前的代码中,我们定义employee_blueprint的路由时使用了:
@employee_blueprint.route('/add', methods=['POST'])
但是,请注意,在Flask中,如果路由定义时没有以斜杠结尾,那么请求的URL也不能有斜杠结尾(除非设置了strict_slashes=False)。但我们的请求URL没有尾部斜杠,所以应该没问题。
另外,检查请求方法:我们指定了POST,而客户端也是用POST,所以方法正确。
因此,我们需要在服务器端添加路由打印,以确认路由确实被注册为/v1/employee/add。
如果路由打印出来确实存在,那么可能是请求在到达路由之前被拦截(比如,没有处理请求的视图函数,或者有中间件影响)。
另一个常见错误:蓝图定义和注册是否在同一个应用实例上?
由于没有看到完整的服务器代码,我建议在服务器端添加一个简单的测试路由:
```python
@app.route('/v1/employee/add', methods=['POST'])
def test_add():
return "Test route", 200
```
然后尝试请求这个路由,看是否能够访问。如果能够访问,说明蓝图注册可能有问题;如果不能,则可能是整个应用的路由配置问题。
但是,根据错误信息,服务器返回的是Flask的默认404页面,说明Flask应用是运行着的,只是没有匹配的路由。
因此,最可能的原因是:蓝图没有正确注册到应用上。
请检查:
- 蓝图的创建是否在注册之前?
- 注册蓝图的代码是否被执行?
另外,请确保在运行app.run()之前已经注册了所有蓝图。
如果以上都确认无误,那么可能是端口占用问题:虽然服务器运行在5606端口,但可能被其他服务占用,导致实际访问的是另一个应用?不太可能,因为404页面是Flask的默认页面。
因此,我建议:
1. 在服务器端打印出所有路由,确认/v1/employee/add是否存在。
2. 如果不存在,检查蓝图注册代码。
3. 如果存在,尝试用curl在服务器本地测试:
curl -X POST http://localhost:5606/v1/employee/add -H "Content-Type: application/json" -d "{}"
看是否返回404。
另外,注意客户端请求的URL是http://10.160.64.218:5606/v1/employee/add,这个IP地址是服务器的局域网IP吗?确保客户端和服务器在同一个局域网,或者服务器监听0.0.0.0且防火墙允许。
由于之前已经解决了连接问题,现在出现404,说明连接已经建立,只是资源不存在。
因此,重点检查服务器端路由注册。
如果经过检查,发现是客户端代码的base URL设置错误,比如多写了路径,那么需要调整。
例如,如果服务器端实际路由是/v1/employee/add,而客户端将base_url设置为http://10.160.64.218:5606,端点设置为/v1/employee/add,那么拼接后就是http://10.160.64.218:5606/v1/employee/add,这是正确的。
但是,如果客户端base_url设置为http://10.160.64.218:5606/v1,端点设置为/employee/add,那么拼接后也是正确的。
所以,问题很可能在服务器端。
请检查服务器端代码,确保蓝图注册正确,并且应用运行正常。
另外,注意Flask应用的运行模式:如果使用了多线程或异步,确保在调试时代码被正确加载。
最后,如果问题仍然存在,请提供服务器端完整的路由定义和蓝图注册代码,以便进一步排查。</think>### 404错误分析与解决方案
您遇到的错误是HTTP 404 Not Found,表示客户端成功连接到了服务器,但服务器无法找到请求的资源(URL路径)。以下是详细分析如下:
### 错误原因分析
1. **URL路径不匹配**:
- 客户端请求的URL:`http://10.160.64.218:5606/v1/employee/add`
- 服务器端实际路由未匹配此路径
2. **后端路由配置问题**:
- Flask应用可能未正确定义`/v1/employee/add`路由
- 蓝图(blueprint)注册时URL前缀配置错误
3. **版本控制问题**:
- 客户端使用`/v1/`前缀,但服务器端未实现版本控制
### 解决方案步骤
#### 1. 检查服务器端路由配置
在Flask应用中添加路由打印功能,确认所有注册的路由:
```python
# 在app.run()之前添加
@app.before_first_request
def list_routes():
print('==== 已注册路由 ====')
for rule in app.url_map.iter_rules():
print(f"{rule.endpoint}: {rule.methods} -> {rule}")
print('===================')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5606, debug=True)
```
#### 2. 修正路由定义(服务器端)
确保路由定义与客户端请求路径匹配:
```python
# 正确版本控制的路由配置
from flask import Blueprint
# 创建v1蓝图
v1_bp = Blueprint('v1', __name__, url_prefix='/v1')
# 在v1蓝图下创建employee蓝图
employee_bp = Blueprint('employee', __name__, url_prefix='/employee')
v1_bp.register_blueprint(employee_bp)
# 定义添加员工路由
@employee_bp.route('/add', methods=['POST'])
def add_employee():
# 处理添加员工逻辑
return jsonify({"success": True, "message": "员工添加成功"})
# 注册v1蓝图到主应用
app.register_blueprint(v1_bp)
```
#### 3. 客户端URL验证
在客户端添加URL验证逻辑:
```python
# db_module.py 修改 _request 方法
def _request(self, endpoint, method, body=None):
# 确保endpoint以斜杠开头
if not endpoint.startswith('/'):
endpoint = '/' + endpoint
url = f"{self.base_url}{endpoint}"
print(f"请求URL: {url}") # 添加日志
try:
# ...原有代码...
except requests.exceptions.HTTPError as e:
if e.response.status_code == 404:
print(f"!!! 404错误: 请检查服务器端路由配置")
print(f"请求路径: {url}")
print(f"确保服务器已实现: {endpoint}")
raise
```
#### 4. 快速测试路由(服务器端)
添加测试路由验证基本连接:
```python
@app.route('/v1/ping', methods=['GET'])
def ping():
return jsonify({"status": "active", "timestamp": datetime.now().isoformat()})
```
在客户端测试:
```python
# main.py
try:
response = requests.get("http://10.160.64.218:5606/v1/ping")
print("服务器响应:", response.json())
except Exception as e:
print("连接测试失败:", str(e))
```
### 常见问题排查
1. **蓝图注册顺序问题**:
```python
# 错误:先注册蓝图后定义路由
app.register_blueprint(employee_bp)
@employee_bp.route('/add') # 此路由不会被注册
def add_employee():
...
# 正确:先定义路由后注册蓝图
@employee_bp.route('/add')
def add_employee():
...
app.register_blueprint(employee_bp, url_prefix='/v1/employee')
```
2. **URL前缀冲突**:
```python
# 错误:双重前缀
app.register_blueprint(employee_bp, url_prefix='/api/v1/employee')
# 同时在蓝图中定义
@employee_bp.route('/v1/employee/add') # 实际路径变为/api/v1/employee/v1/employee/add
# 正确:单一前缀控制
app.register_blueprint(employee_bp, url_prefix='/v1/employee')
@employee_bp.route('/add') # 实际路径为/v1/employee/add
```
3. **方法类型不匹配**:
```python
# 服务器端只接受POST
@employee_bp.route('/add', methods=['POST'])
# 客户端误用GET
requests.get(...) # 会导致404
```
### 完整修正方案
#### 服务器端修正
```python
from flask import Flask, Blueprint, request, jsonify
from datetime import datetime
app = Flask(__name__)
# 创建API版本蓝图
api_v1 = Blueprint('api_v1', __name__, url_prefix='/v1')
# 员工管理蓝图
employee_bp = Blueprint('employee', __name__, url_prefix='/employee')
api_v1.register_blueprint(employee_bp)
@employee_bp.route('/add', methods=['POST'])
def add_employee():
data = request.json
print(f"收到添加员工请求: {data}")
# 实际处理逻辑
return jsonify({
"success": True,
"emp_id": f"EMP{datetime.now().strftime('%Y%m%d%H%M%S')}",
"message": "员工添加成功"
})
# 注册API蓝图
app.register_blueprint(api_v1)
# 添加路由打印
@app.before_first_request
def list_routes():
print("\n==== 有效路由列表 ====")
for rule in app.url_map.iter_rules():
print(f"{' | '.join(rule.methods)} {rule}")
print("=====================\n")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5606, debug=True)
```
#### 客户端验证
```python
# main.py
import requests
def test_connection():
try:
# 测试基本连接
ping_response = requests.get("http://10.160.64.218:5606/v1/ping", timeout=3)
print("服务器状态:", ping_response.json())
# 测试员工添加
employee_data = {
"name": "测试用户",
"position": "工程师"
}
add_response = requests.post(
"http://10.160.64.218:5606/v1/employee/add",
json=employee_data
)
add_response.raise_for_status()
print("员工添加结果:", add_response.json())
except requests.exceptions.HTTPError as e:
print(f"HTTP错误 ({e.response.status_code}): {e.response.text}")
except Exception as e:
print("连接失败:", str(e))
if __name__ == '__main__':
test_connection()
```
### 问题排查流程图
```mermaid
graph TD
A[404错误] --> B{服务器路由是否注册?}
B -->|是| C{URL路径是否匹配?}
B -->|否| D[检查蓝图注册代码]
C -->|是| E{HTTP方法是否正确?}
C -->|否| F[修正URL前缀]
E -->|是| G[检查请求数据格式]
E -->|否| H[修正HTTP方法]
G --> I[检查JSON数据格式]
```
阅读全文
相关推荐




















