init_doc.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # coding=utf-8
  2. """
  3. @project: maxkb
  4. @Author:虎
  5. @file: init_doc.py
  6. @date:2024/5/24 14:11
  7. @desc:
  8. """
  9. import hashlib
  10. from django.urls import path, URLPattern
  11. from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView, SpectacularRedocView
  12. from maxkb.const import CONFIG
  13. chat_api_prefix = CONFIG.get_chat_path()[1:] + '/api/'
  14. def init_app_doc(system_urlpatterns):
  15. system_urlpatterns += [
  16. path(f'{CONFIG.get_admin_path()[1:]}/api-doc/schema/', SpectacularAPIView.as_view(), name='schema'),
  17. # schema的配置文件的路由,下面两个ui也是根据这个配置文件来生成的
  18. path(f'{CONFIG.get_admin_path()[1:]}/api-doc/', SpectacularSwaggerView.as_view(url_name='schema'),
  19. name='swagger-ui'), # swagger-ui的路由
  20. ]
  21. class ChatSpectacularSwaggerView(SpectacularSwaggerView):
  22. @staticmethod
  23. def _swagger_ui_resource(filename):
  24. return f'{CONFIG.get_chat_path()}/api-doc/swagger-ui-dist/{filename}'
  25. @staticmethod
  26. def _swagger_ui_favicon():
  27. return f'{CONFIG.get_chat_path()}/api-doc/swagger-ui-dist/favicon-32x32.png'
  28. def init_chat_doc(system_urlpatterns, chat_urlpatterns):
  29. system_urlpatterns += [
  30. path(f'{CONFIG.get_chat_path()[1:]}/api-doc/schema/',
  31. SpectacularAPIView.as_view(patterns=[
  32. URLPattern(pattern=f'{chat_api_prefix}{str(url.pattern)}', callback=url.callback,
  33. default_args=url.default_args,
  34. name=url.name) for url in chat_urlpatterns if
  35. ['chat', 'open', 'profile'].__contains__(url.name)]),
  36. name='chat_schema'), # schema的配置文件的路由,下面两个ui也是根据这个配置文件来生成的
  37. path(f'{CONFIG.get_chat_path()[1:]}/api-doc/', ChatSpectacularSwaggerView.as_view(url_name='chat_schema'),
  38. name='swagger-ui'), # swagger-ui的路由
  39. ]
  40. def encrypt(text):
  41. md5 = hashlib.md5()
  42. md5.update(text.encode())
  43. result = md5.hexdigest()
  44. return result
  45. def get_call(application_urlpatterns, patterns, params, func):
  46. def run():
  47. if params['valid']():
  48. func(*params['get_params'](application_urlpatterns, patterns))
  49. return run
  50. init_list = [(init_app_doc, {'valid': lambda: CONFIG.get('DOC_PASSWORD') is not None and encrypt(
  51. CONFIG.get('DOC_PASSWORD')) == 'd4fc097197b4b90a122b92cbd5bbe867',
  52. 'get_call': get_call,
  53. 'get_params': lambda application_urlpatterns, patterns: (application_urlpatterns,)}),
  54. (init_chat_doc, {'valid': lambda: CONFIG.get('DOC_PASSWORD') is not None and encrypt(
  55. CONFIG.get('DOC_PASSWORD')) == 'd4fc097197b4b90a122b92cbd5bbe867' or True, 'get_call': get_call,
  56. 'get_params': lambda application_urlpatterns, patterns: (
  57. application_urlpatterns, patterns)})]
  58. def init_doc(system_urlpatterns, chat_patterns):
  59. for init, params in init_list:
  60. if params['valid']():
  61. get_call(system_urlpatterns, chat_patterns, params, init)()