调试在线阅读

This commit is contained in:
liurui 2025-11-02 13:25:50 +08:00
parent 8ad03fcbf2
commit 02b2b2a2bf
14 changed files with 391 additions and 13 deletions

View File

@ -159,7 +159,7 @@ STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
MEDIA_ROOT = "media" # 项目下的目录
MEDIA_ROOT = os.path.join(BASE_DIR, "media") # 项目下的目录,使用绝对路径
MEDIA_URL = "/media/" # 跟STATIC_URL类似指定用户可以通过这个url找到文件

View File

@ -121,7 +121,7 @@ urlpatterns = (
path('sse/', sse_view, name='sse'),
]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ static(settings.STATIC_URL, document_root=settings.STATIC_URL)
+ static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0] if settings.STATICFILES_DIRS else None)
+ [re_path(ele.get('re_path'), include(ele.get('include'))) for ele in settings.PLUGINS_URL_PATTERNS]
)

Binary file not shown.

View File

@ -1,6 +1,8 @@
import os
from pathlib import Path
from application.settings import BASE_DIR
# 定义BASE_DIR避免循环导入
BASE_DIR = Path(__file__).resolve().parent.parent
# ================================================= #
# *************** mysql数据库 配置 *************** #

View File

@ -1,6 +1,8 @@
import os
from pathlib import Path
from application.settings import BASE_DIR
# 定义BASE_DIR避免循环导入
BASE_DIR = Path(__file__).resolve().parent.parent
# ================================================= #
# *************** mysql数据库 配置 *************** #

View File

@ -12,7 +12,7 @@ class CrudBookModelSerializer(CustomModelSerializer):
"""
# 添加SerializerMethodField来处理image字段
image = serializers.SerializerMethodField()
location = serializers.SerializerMethodField()
file = serializers.SerializerMethodField()
def get_image(self, obj):
"""
@ -26,16 +26,16 @@ class CrudBookModelSerializer(CustomModelSerializer):
return settings.API_URL + obj.image
return None
def get_location(self, obj):
def get_file(self, obj):
"""
获取完整的图书URL
获取完整的文件URL
"""
if obj.location:
# 检查location是否已经是完整的URL
if obj.location.startswith(('http://', 'https://')):
return obj.location
# 否则添加MEDIA_URL前缀
return settings.API_URL + obj.location
if obj.file:
# 文件字段返回完整URL
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.file.url)
return settings.API_URL + obj.file.url
return None

Binary file not shown.

View File

@ -168997,3 +168997,59 @@ Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:05:00,475][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:05:00,476][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:05:35,177][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:10:06,217][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:10:06,374][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:12:22,081][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:12:22,140][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

View File

@ -176236,3 +176236,250 @@ ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有
[2025-11-02 12:54:06,284][uvicorn.error._wait_tasks_to_complete():296] [INFO] Waiting for connections to close. (CTRL+C to force quit)
[2025-11-02 12:55:55,929][uvicorn.error._wait_tasks_to_complete():303] [INFO] Waiting for background tasks to complete. (CTRL+C to force quit)
[2025-11-02 12:55:55,929][uvicorn.error._wait_tasks_to_complete():303] [INFO] Waiting for background tasks to complete. (CTRL+C to force quit)
[2025-11-02 13:03:18,997][uvicorn.error._serve():92] [INFO] Finished server process [36132]
[2025-11-02 13:03:18,997][uvicorn.error._serve():92] [INFO] Finished server process [36132]
[2025-11-02 13:04:31,720][uvicorn.error._serve():82] [INFO] Started server process [32668]
[2025-11-02 13:04:31,720][uvicorn.error._serve():82] [INFO] Started server process [32668]
[2025-11-02 13:04:31,721][uvicorn.error.startup():48] [INFO] Waiting for application startup.
[2025-11-02 13:04:31,721][uvicorn.error.startup():48] [INFO] Waiting for application startup.
[2025-11-02 13:04:31,722][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2025-11-02 13:04:31,722][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2025-11-02 13:04:31,722][uvicorn.error.startup():62] [INFO] Application startup complete.
[2025-11-02 13:04:31,722][uvicorn.error.startup():62] [INFO] Application startup complete.
[2025-11-02 13:04:31,723][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
[2025-11-02 13:04:31,723][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
[2025-11-02 13:04:59,691][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:04:59,691][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:05:00,152][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:05:00,152][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:05:00,160][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:05:00,160][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:05:00,162][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "OPTIONS /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:05:00,162][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "OPTIONS /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:05:00,163][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:05:00,163][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:05:00,164][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:05:00,164][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:05:00,165][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:05:00,165][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:05:00,178][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:05:00,178][uvicorn.access.send():466] [INFO] 127.0.0.1:53710 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:05:00,185][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "GET /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:05:00,185][uvicorn.access.send():466] [INFO] 127.0.0.1:54909 - "GET /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:05:00,188][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:05:00,188][uvicorn.access.send():466] [INFO] 127.0.0.1:56740 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:05:00,189][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:05:00,189][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:05:00,190][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:05:00,190][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:05:00,409][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:05:00,409][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:05:00,430][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:05:00,430][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:05:00,472][django.request.log_response():241] [WARNING] Not Found: /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg
[2025-11-02 13:05:00,472][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg
[2025-11-02 13:05:00,473][uvicorn.access.send():466] [INFO] 127.0.0.1:61711 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404
[2025-11-02 13:05:00,473][uvicorn.access.send():466] [INFO] 127.0.0.1:61711 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404
[2025-11-02 13:05:00,474][uvicorn.access.send():466] [INFO] 127.0.0.1:59289 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:05:00,474][uvicorn.access.send():466] [INFO] 127.0.0.1:59289 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:05:00,475][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:05:00,476][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:05:00,607][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:05:00,607][uvicorn.access.send():466] [INFO] 127.0.0.1:55831 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:05:03,959][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:05:03,959][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:05:03,976][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/
[2025-11-02 13:05:03,977][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:05:03,977][uvicorn.access.send():466] [INFO] 127.0.0.1:63972 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:05:19,896][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:05:19,896][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:05:19,911][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/
[2025-11-02 13:05:19,912][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:05:19,912][uvicorn.access.send():466] [INFO] 127.0.0.1:49248 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:05:35,175][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg
[2025-11-02 13:05:35,175][uvicorn.access.send():466] [INFO] 127.0.0.1:49946 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:05:35,175][uvicorn.access.send():466] [INFO] 127.0.0.1:49946 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:05:35,177][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:05:42,871][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "OPTIONS /api/CrudBookModelViewSet/2/ HTTP/1.1" 200
[2025-11-02 13:05:42,871][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "OPTIONS /api/CrudBookModelViewSet/2/ HTTP/1.1" 200
[2025-11-02 13:05:42,947][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "PUT /api/CrudBookModelViewSet/2/ HTTP/1.1" 200
[2025-11-02 13:05:42,947][uvicorn.access.send():466] [INFO] 127.0.0.1:50235 - "PUT /api/CrudBookModelViewSet/2/ HTTP/1.1" 200
[2025-11-02 13:06:51,564][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:06:51,564][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:06:51,579][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/
[2025-11-02 13:06:51,580][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:06:51,580][uvicorn.access.send():466] [INFO] 127.0.0.1:55524 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:10:05,123][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:10:05,123][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:10:05,133][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:10:05,133][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:10:05,386][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:10:05,386][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:10:05,393][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "OPTIONS /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:10:05,393][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "OPTIONS /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:10:05,395][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:10:05,395][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:10:05,398][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:10:05,398][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:10:05,401][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:10:05,401][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:10:05,404][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:10:05,404][uvicorn.access.send():466] [INFO] 127.0.0.1:52734 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:10:05,419][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:10:05,419][uvicorn.access.send():466] [INFO] 127.0.0.1:63754 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:10:05,423][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "GET /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:10:05,423][uvicorn.access.send():466] [INFO] 127.0.0.1:50549 - "GET /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:10:05,425][uvicorn.access.send():466] [INFO] 127.0.0.1:55561 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:10:05,425][uvicorn.access.send():466] [INFO] 127.0.0.1:55561 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:10:05,427][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:10:05,427][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:10:06,072][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:10:06,072][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:10:06,088][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:10:06,088][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:10:06,214][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg
[2025-11-02 13:10:06,215][uvicorn.access.send():466] [INFO] 127.0.0.1:49738 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:10:06,215][uvicorn.access.send():466] [INFO] 127.0.0.1:49738 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:10:06,217][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:10:06,371][django.request.log_response():241] [WARNING] Not Found: /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg
[2025-11-02 13:10:06,371][uvicorn.access.send():466] [INFO] 127.0.0.1:55255 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404
[2025-11-02 13:10:06,371][uvicorn.access.send():466] [INFO] 127.0.0.1:55255 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404
[2025-11-02 13:10:06,374][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:10:06,760][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:10:06,760][uvicorn.access.send():466] [INFO] 127.0.0.1:50653 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:12:20,894][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:12:20,894][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:12:20,906][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:12:20,906][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/user/user_info/ HTTP/1.1" 200
[2025-11-02 13:12:21,034][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:12:21,034][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:12:21,037][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:12:21,037][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:12:21,040][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:12:21,040][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:12:21,044][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:12:21,044][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "OPTIONS /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:12:21,048][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:12:21,048][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "OPTIONS /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:12:21,066][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:12:21,066][uvicorn.access.send():466] [INFO] 127.0.0.1:56771 - "GET /api/init/dictionary/?dictionary_key=all HTTP/1.1" 200
[2025-11-02 13:12:21,078][uvicorn.access.send():466] [INFO] 127.0.0.1:60714 - "GET /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:12:21,078][uvicorn.access.send():466] [INFO] 127.0.0.1:60714 - "GET /api/init/settings/ HTTP/1.1" 200
[2025-11-02 13:12:21,081][uvicorn.access.send():466] [INFO] 127.0.0.1:62829 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:12:21,081][uvicorn.access.send():466] [INFO] 127.0.0.1:62829 - "GET /api/system/menu_button/menu_button_all_permission/ HTTP/1.1" 200
[2025-11-02 13:12:21,084][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "GET /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:12:21,084][uvicorn.access.send():466] [INFO] 127.0.0.1:53736 - "GET /api/system/menu/web_router/ HTTP/1.1" 200
[2025-11-02 13:12:21,087][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:12:21,087][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/system/dept/all_dept/ HTTP/1.1" 200
[2025-11-02 13:12:21,927][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:12:21,927][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "OPTIONS /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:12:21,939][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:12:21,939][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /api/CrudBookModelViewSet/?page=1&limit=20 HTTP/1.1" 200
[2025-11-02 13:12:22,079][django.request.log_response():241] [WARNING] Not Found: /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg
[2025-11-02 13:12:22,080][uvicorn.access.send():466] [INFO] 127.0.0.1:65263 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:12:22,080][uvicorn.access.send():466] [INFO] 127.0.0.1:65263 - "GET /media/files/f/6/f6998313b51c8ad90447a7b89130894f.jpg HTTP/1.1" 404
[2025-11-02 13:12:22,081][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:12:22,138][django.request.log_response():241] [WARNING] Not Found: /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg
[2025-11-02 13:12:22,139][uvicorn.access.send():466] [INFO] 127.0.0.1:56037 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404
[2025-11-02 13:12:22,139][uvicorn.access.send():466] [INFO] 127.0.0.1:56037 - "GET /media/files/2/a/2ae854214abcfcc08511cfdeb24a7f7a.jpg HTTP/1.1" 404
[2025-11-02 13:12:22,140][asyncio.default_exception_handler():1785] [ERROR] Exception in callback _ProactorBasePipeTransport._call_connection_lost(None)
handle: <Handle _ProactorBasePipeTransport._call_connection_lost(None)>
Traceback (most recent call last):
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\events.py", line 84, in _run
self._context.run(self._callback, *self._args)
File "C:\Users\EDY\.conda\envs\tushuguan\Lib\asyncio\proactor_events.py", line 165, in _call_connection_lost
self._sock.shutdown(socket.SHUT_RDWR)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
[2025-11-02 13:12:22,521][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:12:22,521][uvicorn.access.send():466] [INFO] 127.0.0.1:59445 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:13:00,550][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:13:00,550][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:13:00,561][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/
[2025-11-02 13:13:00,562][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:13:00,562][uvicorn.access.send():466] [INFO] 127.0.0.1:49919 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:13:34,239][django.request.log_response():241] [WARNING] Not Found: /media/files/e/8/e8cc692135fd445f18dc128c36e49bff.epub
[2025-11-02 13:13:34,240][uvicorn.access.send():466] [INFO] 127.0.0.1:64807 - "GET /media/files/e/8/e8cc692135fd445f18dc128c36e49bff.epub HTTP/1.1" 404
[2025-11-02 13:13:34,240][uvicorn.access.send():466] [INFO] 127.0.0.1:64807 - "GET /media/files/e/8/e8cc692135fd445f18dc128c36e49bff.epub HTTP/1.1" 404
[2025-11-02 13:14:46,913][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:14:46,913][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:14:46,922][django.request.log_response():241] [WARNING] Not Found: /api/CrudBookModelViewSet/2/file/
[2025-11-02 13:14:46,923][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:14:46,923][uvicorn.access.send():466] [INFO] 127.0.0.1:58311 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 404
[2025-11-02 13:23:40,289][uvicorn.error.shutdown():258] [INFO] Shutting down
[2025-11-02 13:23:40,289][uvicorn.error.shutdown():258] [INFO] Shutting down
[2025-11-02 13:23:40,400][uvicorn.error._wait_tasks_to_complete():296] [INFO] Waiting for connections to close. (CTRL+C to force quit)
[2025-11-02 13:23:40,400][uvicorn.error._wait_tasks_to_complete():296] [INFO] Waiting for connections to close. (CTRL+C to force quit)
[2025-11-02 13:23:41,584][uvicorn.error._serve():92] [INFO] Finished server process [32668]
[2025-11-02 13:23:41,584][uvicorn.error._serve():92] [INFO] Finished server process [32668]
[2025-11-02 13:24:00,590][uvicorn.error._serve():82] [INFO] Started server process [19728]
[2025-11-02 13:24:00,590][uvicorn.error._serve():82] [INFO] Started server process [19728]
[2025-11-02 13:24:00,590][uvicorn.error.startup():48] [INFO] Waiting for application startup.
[2025-11-02 13:24:00,590][uvicorn.error.startup():48] [INFO] Waiting for application startup.
[2025-11-02 13:24:00,591][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2025-11-02 13:24:00,591][uvicorn.error.main():94] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2025-11-02 13:24:00,591][uvicorn.error.startup():62] [INFO] Application startup complete.
[2025-11-02 13:24:00,591][uvicorn.error.startup():62] [INFO] Application startup complete.
[2025-11-02 13:24:00,592][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
[2025-11-02 13:24:00,592][uvicorn.error._log_started_message():214] [INFO] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
[2025-11-02 13:24:01,022][uvicorn.access.send():466] [INFO] 127.0.0.1:58202 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:24:01,022][uvicorn.access.send():466] [INFO] 127.0.0.1:58202 - "GET /sse/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzYyMDk4NjcyLCJpYXQiOjE3NjIwMTIyNzIsImp0aSI6IjQ3MDkyMDNhMzA1ZDQwNTJhZjc4NjU1NzhkNDdkNGI4IiwidXNlcl9pZCI6MX0.pTsbQPoafCmt4F-WRdKK_UiQNtAUAo2JnzBuhyiXk5A HTTP/1.1" 200
[2025-11-02 13:24:27,464][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:24:27,464][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:24:27,495][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:24:27,495][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/CrudBookModelViewSet/2/file/ HTTP/1.1" 200
[2025-11-02 13:24:27,508][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /media/books/hamlet_NkSTa6g.epub HTTP/1.1" 200
[2025-11-02 13:24:27,508][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /media/books/hamlet_NkSTa6g.epub HTTP/1.1" 200
[2025-11-02 13:24:27,582][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200
[2025-11-02 13:24:27,582][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200
[2025-11-02 13:24:27,600][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200
[2025-11-02 13:24:27,600][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "GET /api/reading-progress/by_book/?book_id=2 HTTP/1.1" 200
[2025-11-02 13:24:30,686][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:30,686][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:30,803][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "POST /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:30,803][uvicorn.access.send():466] [INFO] 127.0.0.1:49186 - "POST /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:39,748][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:39,748][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "OPTIONS /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:39,836][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "POST /api/reading-progress/ HTTP/1.1" 200
[2025-11-02 13:24:39,836][uvicorn.access.send():466] [INFO] 127.0.0.1:59255 - "POST /api/reading-progress/ HTTP/1.1" 200

71
test_book_api.py Normal file
View File

@ -0,0 +1,71 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
测试图书文件API
"""
import os
import sys
import django
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 设置Django环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
# 初始化Django
django.setup()
from crud_book.models import CrudBookModel
from django.conf import settings
print("=" * 60)
print("图书文件API测试")
print("=" * 60)
# 检查配置
print("\n1. 配置检查:")
print(f"MEDIA_ROOT: {settings.MEDIA_ROOT}")
print(f"MEDIA_URL: {settings.MEDIA_URL}")
print(f"BASE_DIR: {settings.BASE_DIR}")
# 检查媒体目录
print("\n2. 媒体目录检查:")
media_dir = os.path.join(settings.BASE_DIR, "media")
print(f"媒体目录: {media_dir}")
print(f"目录存在: {os.path.exists(media_dir)}")
books_dir = os.path.join(media_dir, "books")
print(f"图书目录: {books_dir}")
print(f"目录存在: {os.path.exists(books_dir)}")
if os.path.exists(books_dir):
files = os.listdir(books_dir)
print(f"图书文件: {files}")
# 检查图书数据
print("\n3. 图书数据检查:")
books = CrudBookModel.objects.all()
print(f"总图书数: {books.count()}")
for book in books[:5]: # 只显示前5本
print(f"\n图书 ID={book.id}:")
print(f" 书名: {book.title}")
print(f" 文件字段存在: {bool(book.file)}")
if book.file:
try:
file_path = book.file.path
print(f" 文件路径: {file_path}")
print(f" 文件存在: {os.path.exists(file_path)}")
print(f" 文件URL: {book.file.url}")
# 构建完整URL
base_url = "http://127.0.0.1:8000"
full_url = f"{base_url}{book.file.url}"
print(f" 完整URL: {full_url}")
except Exception as e:
print(f" 错误: {e}")
print("\n" + "=" * 60)
print("测试完成")
print("=" * 60)