diff --git a/application/__pycache__/dispatch.cpython-311.pyc b/application/__pycache__/dispatch.cpython-311.pyc index d5c892b..d8efe11 100644 Binary files a/application/__pycache__/dispatch.cpython-311.pyc and b/application/__pycache__/dispatch.cpython-311.pyc differ diff --git a/application/__pycache__/settings.cpython-311.pyc b/application/__pycache__/settings.cpython-311.pyc index db37856..2ff59c4 100644 Binary files a/application/__pycache__/settings.cpython-311.pyc and b/application/__pycache__/settings.cpython-311.pyc differ diff --git a/application/__pycache__/urls.cpython-311.pyc b/application/__pycache__/urls.cpython-311.pyc index 9f51b14..14218f0 100644 Binary files a/application/__pycache__/urls.cpython-311.pyc and b/application/__pycache__/urls.cpython-311.pyc differ diff --git a/application/settings.py b/application/settings.py index 0c6bb84..a86fb7e 100644 --- a/application/settings.py +++ b/application/settings.py @@ -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找到文件 diff --git a/application/urls.py b/application/urls.py index cae26a6..4ea7abb 100644 --- a/application/urls.py +++ b/application/urls.py @@ -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] ) diff --git a/conf/__pycache__/env.cpython-311.pyc b/conf/__pycache__/env.cpython-311.pyc index a0696ba..1c7b1e5 100644 Binary files a/conf/__pycache__/env.cpython-311.pyc and b/conf/__pycache__/env.cpython-311.pyc differ diff --git a/conf/env.example.py b/conf/env.example.py index 2670cec..c60516f 100644 --- a/conf/env.example.py +++ b/conf/env.example.py @@ -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数据库 配置 *************** # diff --git a/conf/env.py b/conf/env.py index 02e1164..57ebd2f 100644 --- a/conf/env.py +++ b/conf/env.py @@ -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数据库 配置 *************** # diff --git a/crud_book/__pycache__/serializers.cpython-311.pyc b/crud_book/__pycache__/serializers.cpython-311.pyc index 5d127a3..533ea5c 100644 Binary files a/crud_book/__pycache__/serializers.cpython-311.pyc and b/crud_book/__pycache__/serializers.cpython-311.pyc differ diff --git a/crud_book/serializers.py b/crud_book/serializers.py index 2d9dbd8..1edb553 100644 --- a/crud_book/serializers.py +++ b/crud_book/serializers.py @@ -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 diff --git a/db.sqlite3 b/db.sqlite3 index 1b8d6f5..7da3353 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/logs/error.log b/logs/error.log index d042b76..3843260 100644 --- a/logs/error.log +++ b/logs/error.log @@ -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: +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: +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: +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: +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: +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: +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: +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] 远程主机强迫关闭了一个现有的连接。 diff --git a/logs/server.log b/logs/server.log index 0f3e444..029d9b3 100644 --- a/logs/server.log +++ b/logs/server.log @@ -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: +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: +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: +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: +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: +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: +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: +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 diff --git a/test_book_api.py b/test_book_api.py new file mode 100644 index 0000000..98e4795 --- /dev/null +++ b/test_book_api.py @@ -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)