-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Expand file tree
/
Copy pathweb.py
More file actions
140 lines (121 loc) · 5.4 KB
/
web.py
File metadata and controls
140 lines (121 loc) · 5.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""
URL configuration for maxkb project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
import os
from pathlib import Path
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import path, re_path, include
from django.views import static
from rest_framework import status
from chat.urls import urlpatterns as chat_urlpatterns
from common.init.init_doc import init_doc
from common.result import Result
from maxkb import settings
from maxkb.conf import PROJECT_DIR
from maxkb.const import CONFIG
admin_api_prefix = CONFIG.get_admin_path()[1:] + '/api/'
admin_ui_prefix = CONFIG.get_admin_path()
chat_api_prefix = CONFIG.get_chat_path()[1:] + '/api/'
chat_ui_prefix = CONFIG.get_chat_path()
urlpatterns = [
path(admin_api_prefix, include("users.urls")),
path(admin_api_prefix, include("tools.urls")),
path(admin_api_prefix, include("models_provider.urls")),
path(admin_api_prefix, include("folders.urls")),
path(admin_api_prefix, include("knowledge.urls")),
path(admin_api_prefix, include("system_manage.urls")),
path(admin_api_prefix, include("application.urls")),
path(admin_api_prefix, include("trigger.urls")),
path(admin_api_prefix, include("oss.urls")),
path(chat_api_prefix, include("oss.urls")),
path(chat_api_prefix, include("chat.urls")),
path(f'{admin_ui_prefix[1:]}/', include('oss.retrieval_urls')),
path(f'{chat_ui_prefix[1:]}/', include('oss.retrieval_urls')),
]
init_doc(urlpatterns, chat_urlpatterns)
def pro():
urlpatterns.append(
re_path(rf'^{CONFIG.get_admin_path()[1:]}/api-doc/(?P<path>.*)$', static.serve,
{'document_root': os.path.join(settings.STATIC_ROOT, "drf_spectacular_sidecar")}, name='doc'),
)
urlpatterns.append(
re_path(rf'^{CONFIG.get_chat_path()[1:]}/api-doc/(?P<path>.*)$', static.serve,
{'document_root': os.path.join(settings.STATIC_ROOT, "drf_spectacular_sidecar")}, name='doc_chat'),
)
# 暴露ui静态资源
urlpatterns.append(
re_path(rf"^{CONFIG.get_admin_path()[1:]}/(?P<path>.*)$", static.serve,
{'document_root': os.path.join(settings.STATIC_ROOT, "admin")},
name='admin'),
)
# 暴露ui静态资源
urlpatterns.append(
re_path(rf'^{CONFIG.get_chat_path()[1:]}/(?P<path>.*)$', static.serve,
{'document_root': os.path.join(settings.STATIC_ROOT, "chat")},
name='chat'),
)
if not settings.DEBUG:
pro()
def get_index_html(index_path):
file = open(index_path, "r", encoding='utf-8')
content = file.read()
file.close()
return content
def get_all_files(directory):
base_path = Path(directory)
file_paths = [
'/' + str(file.relative_to(base_path)).replace('\\', '/')
for file in base_path.rglob('*')
if file.is_file()
]
return sorted(file_paths, key=len, reverse=True)
static_dict = {
chat_ui_prefix: get_all_files(os.path.join(PROJECT_DIR, 'apps', "static", 'chat')),
admin_ui_prefix: get_all_files(os.path.join(PROJECT_DIR, 'apps', "static", 'admin'))
}
def page_not_found(request, exception):
"""
页面不存在处理
"""
if request.path.startswith(admin_ui_prefix + '/api/'):
return Result(response_status=status.HTTP_404_NOT_FOUND, code=404, message="HTTP_404_NOT_FOUND")
if request.path.startswith(chat_ui_prefix + '/api/'):
return Result(response_status=status.HTTP_404_NOT_FOUND, code=404, message="HTTP_404_NOT_FOUND")
if request.path.startswith(chat_ui_prefix):
in_ = [url for url in static_dict.get(chat_ui_prefix) if request.path.endswith(url)]
if len(in_) > 0:
a = chat_ui_prefix + in_[0]
return HttpResponseRedirect(a)
index_path = os.path.join(PROJECT_DIR, 'apps', "static", 'chat', 'index.html')
content = get_index_html(index_path)
content = content.replace("prefix: '/chat'", f"prefix: '{CONFIG.get_chat_path()}'")
if not os.path.exists(index_path):
return HttpResponse("页面不存在", status=404)
return HttpResponse(content, status=200)
elif request.path.startswith(admin_ui_prefix):
in_ = [url for url in static_dict.get(admin_ui_prefix) if request.path.endswith(url)]
if len(in_) > 0:
a = admin_ui_prefix + in_[0]
return HttpResponseRedirect(a)
index_path = os.path.join(PROJECT_DIR, 'apps', "static", 'admin', 'index.html')
if not os.path.exists(index_path):
return HttpResponse("页面不存在", status=404)
content = get_index_html(index_path)
content = content.replace("prefix: '/admin'", f"prefix: '{CONFIG.get_admin_path()}'").replace(
"chatPrefix: '/chat'", f"chatPrefix: '{CONFIG.get_chat_path()}'")
return HttpResponse(content, status=200)
else:
return HttpResponseRedirect(admin_ui_prefix + '/')
handler404 = page_not_found