valar 1.3.21__tar.gz → 1.3.24__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. {valar-1.3.21/src/valar.egg-info → valar-1.3.24}/PKG-INFO +41 -18
  2. {valar-1.3.21 → valar-1.3.24}/README.md +39 -17
  3. {valar-1.3.21 → valar-1.3.24}/setup.py +2 -1
  4. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/sender.py +3 -0
  5. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/orm_dao.py +6 -0
  6. {valar-1.3.21 → valar-1.3.24}/src/valar/models/core.py +2 -1
  7. {valar-1.3.21 → valar-1.3.24}/src/valar/views/handler.py +3 -2
  8. {valar-1.3.21 → valar-1.3.24/src/valar.egg-info}/PKG-INFO +41 -18
  9. {valar-1.3.21 → valar-1.3.24}/src/valar.egg-info/requires.txt +1 -0
  10. {valar-1.3.21 → valar-1.3.24}/LICENSE +0 -0
  11. {valar-1.3.21 → valar-1.3.24}/MANIFEST.in +0 -0
  12. {valar-1.3.21 → valar-1.3.24}/setup.cfg +0 -0
  13. {valar-1.3.21 → valar-1.3.24}/src/valar/__init__.py +0 -0
  14. {valar-1.3.21 → valar-1.3.24}/src/valar/apps.py +0 -0
  15. {valar-1.3.21 → valar-1.3.24}/src/valar/auth/Authentication.py +0 -0
  16. {valar-1.3.21 → valar-1.3.24}/src/valar/auth/Middleware.py +0 -0
  17. {valar-1.3.21 → valar-1.3.24}/src/valar/auth/__init__.py +0 -0
  18. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/__init__.py +0 -0
  19. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/consumer.py +0 -0
  20. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/counter.py +0 -0
  21. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/executer.py +0 -0
  22. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/mapping.py +0 -0
  23. {valar-1.3.21 → valar-1.3.24}/src/valar/channels/views.py +0 -0
  24. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/__init__.py +0 -0
  25. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/app_mixins/__init__.py +0 -0
  26. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/app_mixins/auto_migration_mixin.py +0 -0
  27. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/app_mixins/auto_urlpatterns_mixin.py +0 -0
  28. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/singleton_meta.py +0 -0
  29. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/valar_minio.py +0 -0
  30. {valar-1.3.21 → valar-1.3.24}/src/valar/classes/valar_response.py +0 -0
  31. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/__init__.py +0 -0
  32. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/abstract.py +0 -0
  33. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/defaults/__init__.py +0 -0
  34. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/defaults/field_keys_default.py +0 -0
  35. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/defaults/field_values_default.py +0 -0
  36. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/defaults/view_defaults.py +0 -0
  37. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/engine.py +0 -0
  38. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/frame.py +0 -0
  39. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/meta.py +0 -0
  40. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/mon_dao.py +0 -0
  41. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/mon_field.py +0 -0
  42. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/orm_field.py +0 -0
  43. {valar-1.3.21 → valar-1.3.24}/src/valar/dao/query.py +0 -0
  44. {valar-1.3.21 → valar-1.3.24}/src/valar/migrations/0001_initial.py +0 -0
  45. {valar-1.3.21 → valar-1.3.24}/src/valar/migrations/__init__.py +0 -0
  46. {valar-1.3.21 → valar-1.3.24}/src/valar/models/__init__.py +0 -0
  47. {valar-1.3.21 → valar-1.3.24}/src/valar/models/auth.py +0 -0
  48. {valar-1.3.21 → valar-1.3.24}/src/valar/models/frame.py +0 -0
  49. {valar-1.3.21 → valar-1.3.24}/src/valar/models/indicator.py +0 -0
  50. {valar-1.3.21 → valar-1.3.24}/src/valar/models/meta.py +0 -0
  51. {valar-1.3.21 → valar-1.3.24}/src/valar/models/test.py +0 -0
  52. {valar-1.3.21 → valar-1.3.24}/src/valar/urls.py +0 -0
  53. {valar-1.3.21 → valar-1.3.24}/src/valar/views/__init__.py +0 -0
  54. {valar-1.3.21 → valar-1.3.24}/src/valar/views/auth.py +0 -0
  55. {valar-1.3.21 → valar-1.3.24}/src/valar/views/file.py +0 -0
  56. {valar-1.3.21 → valar-1.3.24}/src/valar/views/meta.py +0 -0
  57. {valar-1.3.21 → valar-1.3.24}/src/valar/views/password.py +0 -0
  58. {valar-1.3.21 → valar-1.3.24}/src/valar/views/rest.py +0 -0
  59. {valar-1.3.21 → valar-1.3.24}/src/valar.egg-info/SOURCES.txt +0 -0
  60. {valar-1.3.21 → valar-1.3.24}/src/valar.egg-info/dependency_links.txt +0 -0
  61. {valar-1.3.21 → valar-1.3.24}/src/valar.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.3.21
3
+ Version: 1.3.24
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -8,6 +8,7 @@ Author-email: liuyinpeng@buaa.edu.cn
8
8
  Requires-Python: >=3.9
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
+ Requires-Dist: autobahn==24.4.2
11
12
  Requires-Dist: channels==3.0.3
12
13
  Requires-Dist: pymongo~=4.11.2
13
14
  Requires-Dist: asgiref~=3.8.1
@@ -45,7 +46,7 @@ pip install valar
45
46
  - asgi.py
46
47
  - urls.py
47
48
 
48
- ## 2.1 settings.py
49
+ ## 2.1 settings.py and ___init__.py
49
50
 
50
51
  ```python
51
52
  from pathlib import Path
@@ -61,8 +62,16 @@ SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^
61
62
 
62
63
  DATABASES = {
63
64
  'default': {
64
- 'ENGINE': 'django.db.backends.sqlite3',
65
- 'NAME': BASE_DIR / 'db.sqlite3',
65
+ 'ENGINE': 'django.db.backends.mysql', # 使用 MySQL
66
+ 'NAME': 'vm_ets', # 数据库名
67
+ 'USER': 'root', # 用户名
68
+ 'PASSWORD': password, # 密码
69
+ 'HOST': 'localhost', # 数据库地址,本机用127.0.0.1
70
+ 'PORT': '3306', # MySQL端口,默认3306
71
+ 'OPTIONS': {
72
+ 'connect_timeout': 5, # 默认10秒,可以缩短
73
+ 'charset': 'utf8mb4',
74
+ }
66
75
  }
67
76
  }
68
77
 
@@ -105,44 +114,58 @@ DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
105
114
  """ Valar Options """
106
115
 
107
116
  HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
108
- MONGO_URI = 'mongodb://username:password@host:27017'
109
- MINIO_URL = "s3://username:password@host:9000"
110
- MINIO_ROOT = "https://host:9001"
117
+ MONGO_URI = f'mongodb://root:{password}@{host}:27017/'
118
+ MINIO_URL = f"s3://admin:{password}@{host}:9001"
119
+ MINIO_ROOT = f"http://{host}:9001"
111
120
 
112
121
  """ Email Options """
122
+
113
123
  EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
114
- EMAIL_HOST = 'xxx.xx.xx.xx'
115
- EMAIL_PORT = 465
116
- EMAIL_DOMAIN = 'http://xx.xx.xx'
117
- EMAIL_HOST_USER = "xxx@xx.xx.xx"
118
- EMAIL_HOST_PASSWORD = '*******'
119
- EMAIL_USE_TLS = False
120
- EMAIL_USE_SSL = True
124
+ EMAIL_HOST = 'smtp.126.com'
125
+ EMAIL_PORT = 25
126
+ EMAIL_HOST_USER = "xxxx@126.com"
127
+ EMAIL_HOST_PASSWORD = 'CGiKQh5FyQyupQYA'
128
+ ```
129
+
130
+ ```python
131
+ import pymysql
132
+
133
+ pymysql.install_as_MySQLdb()
134
+
121
135
  ```
122
136
 
123
137
  ## 2.2 asgi.py
124
138
 
125
139
  ```python
140
+ import os
141
+ from pathlib import Path
142
+
126
143
  from django.core.asgi import get_asgi_application
127
144
  from channels.routing import ProtocolTypeRouter, URLRouter
128
145
  from django.urls import re_path
129
146
 
130
147
  from valar.channels.consumer import ValarConsumer
131
148
 
149
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % Path(__file__).resolve().parent.parent.name)
132
150
  application = ProtocolTypeRouter({
133
151
  'http': get_asgi_application(),
134
152
  'websocket': URLRouter([
135
153
  re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
136
154
  ])
137
155
  })
138
-
139
-
140
156
  ```
141
157
 
142
158
  ## 2.3 urls.py
143
159
 
144
- - no need to provide urls for Valar, Valar will auto set urlpatterns for Morghulis (
145
- see https://www.npmjs.com/package/morghulis)
160
+ ```python
161
+ from django.urls import path, include
162
+
163
+ urlpatterns = [
164
+ path('valar/', include('valar.urls')),
165
+ ]
166
+
167
+ ```
168
+
146
169
  - go to section 4 to see how to register channel handlers (a Vue - Django async communication tool) in urls.
147
170
 
148
171
  # 3. migrate
@@ -15,7 +15,7 @@ pip install valar
15
15
  - asgi.py
16
16
  - urls.py
17
17
 
18
- ## 2.1 settings.py
18
+ ## 2.1 settings.py and ___init__.py
19
19
 
20
20
  ```python
21
21
  from pathlib import Path
@@ -31,8 +31,16 @@ SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^
31
31
 
32
32
  DATABASES = {
33
33
  'default': {
34
- 'ENGINE': 'django.db.backends.sqlite3',
35
- 'NAME': BASE_DIR / 'db.sqlite3',
34
+ 'ENGINE': 'django.db.backends.mysql', # 使用 MySQL
35
+ 'NAME': 'vm_ets', # 数据库名
36
+ 'USER': 'root', # 用户名
37
+ 'PASSWORD': password, # 密码
38
+ 'HOST': 'localhost', # 数据库地址,本机用127.0.0.1
39
+ 'PORT': '3306', # MySQL端口,默认3306
40
+ 'OPTIONS': {
41
+ 'connect_timeout': 5, # 默认10秒,可以缩短
42
+ 'charset': 'utf8mb4',
43
+ }
36
44
  }
37
45
  }
38
46
 
@@ -75,44 +83,58 @@ DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
75
83
  """ Valar Options """
76
84
 
77
85
  HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
78
- MONGO_URI = 'mongodb://username:password@host:27017'
79
- MINIO_URL = "s3://username:password@host:9000"
80
- MINIO_ROOT = "https://host:9001"
86
+ MONGO_URI = f'mongodb://root:{password}@{host}:27017/'
87
+ MINIO_URL = f"s3://admin:{password}@{host}:9001"
88
+ MINIO_ROOT = f"http://{host}:9001"
81
89
 
82
90
  """ Email Options """
91
+
83
92
  EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
84
- EMAIL_HOST = 'xxx.xx.xx.xx'
85
- EMAIL_PORT = 465
86
- EMAIL_DOMAIN = 'http://xx.xx.xx'
87
- EMAIL_HOST_USER = "xxx@xx.xx.xx"
88
- EMAIL_HOST_PASSWORD = '*******'
89
- EMAIL_USE_TLS = False
90
- EMAIL_USE_SSL = True
93
+ EMAIL_HOST = 'smtp.126.com'
94
+ EMAIL_PORT = 25
95
+ EMAIL_HOST_USER = "xxxx@126.com"
96
+ EMAIL_HOST_PASSWORD = 'CGiKQh5FyQyupQYA'
97
+ ```
98
+
99
+ ```python
100
+ import pymysql
101
+
102
+ pymysql.install_as_MySQLdb()
103
+
91
104
  ```
92
105
 
93
106
  ## 2.2 asgi.py
94
107
 
95
108
  ```python
109
+ import os
110
+ from pathlib import Path
111
+
96
112
  from django.core.asgi import get_asgi_application
97
113
  from channels.routing import ProtocolTypeRouter, URLRouter
98
114
  from django.urls import re_path
99
115
 
100
116
  from valar.channels.consumer import ValarConsumer
101
117
 
118
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % Path(__file__).resolve().parent.parent.name)
102
119
  application = ProtocolTypeRouter({
103
120
  'http': get_asgi_application(),
104
121
  'websocket': URLRouter([
105
122
  re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
106
123
  ])
107
124
  })
108
-
109
-
110
125
  ```
111
126
 
112
127
  ## 2.3 urls.py
113
128
 
114
- - no need to provide urls for Valar, Valar will auto set urlpatterns for Morghulis (
115
- see https://www.npmjs.com/package/morghulis)
129
+ ```python
130
+ from django.urls import path, include
131
+
132
+ urlpatterns = [
133
+ path('valar/', include('valar.urls')),
134
+ ]
135
+
136
+ ```
137
+
116
138
  - go to section 4 to see how to register channel handlers (a Vue - Django async communication tool) in urls.
117
139
 
118
140
  # 3. migrate
@@ -7,9 +7,10 @@ from typing import Dict, Type
7
7
  with open("README.md", "r", encoding="utf-8") as f:
8
8
  long_description = f.read()
9
9
 
10
- version = "1.3.21"
10
+ version = "1.3.24"
11
11
 
12
12
  requires = [
13
+ 'autobahn==24.4.2',
13
14
  'channels==3.0.3',
14
15
  'pymongo~=4.11.2',
15
16
  'asgiref~=3.8.1',
@@ -92,6 +92,9 @@ class ValarChannelSender(Sender):
92
92
 
93
93
  def error(self, payload):
94
94
  self.__emit__('error', payload)
95
+ if self.__thread__:
96
+ self.__thread__.join()
97
+ self.__thread__ = None
95
98
 
96
99
  def __emit__(self, status='proceed', data=None):
97
100
  scope = 'broadcast' if self.__channel__.broadcast else 'client'
@@ -1,5 +1,6 @@
1
1
  import datetime
2
2
  import json
3
+ from urllib.parse import quote
3
4
 
4
5
  from django.core.paginator import Paginator
5
6
  from django.db.models.options import Options
@@ -317,6 +318,7 @@ def __get_custom_props__(entity, code='default'):
317
318
  def __set_simple_values__(fields, values):
318
319
  date_props_mapping = {}
319
320
  json_props = []
321
+ file_props = []
320
322
  for field in fields:
321
323
  if isinstance(field, OrmField):
322
324
  prop = field.prop
@@ -328,12 +330,16 @@ def __set_simple_values__(fields, values):
328
330
  date_props_mapping[prop] = __data_props_formatting__[domain]
329
331
  elif domain == 'JSONField':
330
332
  json_props.append(prop)
333
+ elif domain == 'FileField':
334
+ file_props.append(prop)
331
335
  for row in values:
332
336
  for prop, formating in date_props_mapping.items():
333
337
  if row.get(prop):
334
338
  row[prop] = row[prop].strftime(formating)
335
339
  for prop in json_props:
336
340
  row[prop] = json.loads(row[prop]) if type(row[prop]) is str else row[prop]
341
+ for prop in file_props:
342
+ row[prop] = quote(row[prop], safe=":/")
337
343
 
338
344
  # def fun(field): return type(field).__name__ not in __referred_domains__ and field.name not in __omit_field_props__
339
345
  #
@@ -1,4 +1,5 @@
1
1
  import json
2
+ from urllib.parse import quote
2
3
 
3
4
  from django.apps import AppConfig
4
5
  from django.db import models
@@ -48,7 +49,7 @@ class VModel(models.Model):
48
49
  elif domain in [TimeField]:
49
50
  value = value.strftime('%H:%M:%S')
50
51
  elif domain in [FileField]:
51
- value = value.name
52
+ value = quote(value.name, safe=":/")
52
53
  elif domain in [BigAutoField]:
53
54
  value = value
54
55
  data[prop] = value
@@ -23,6 +23,7 @@ def valar_test_handler(sender: ValarChannelSender):
23
23
  def batch_handler(sender: ValarChannelSender):
24
24
  data = sender.data
25
25
  entity, db, method = data.get("entity"), data.get("db"), data.get("method")
26
+ print(entity, db, method)
26
27
  dao = Dao(entity, db)
27
28
  if method == 'save_many':
28
29
  array = data.get("data", [])
@@ -42,6 +43,6 @@ def batch_handler(sender: ValarChannelSender):
42
43
  minio = ValarEngine().get_minio_bucket(entity)
43
44
  for path in paths:
44
45
  minio.remove(path)
45
- payload = counter.tick()
46
- sender.load(payload)
46
+ # payload = counter.tick()
47
+ # sender.load(payload)
47
48
  return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.3.21
3
+ Version: 1.3.24
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -8,6 +8,7 @@ Author-email: liuyinpeng@buaa.edu.cn
8
8
  Requires-Python: >=3.9
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
+ Requires-Dist: autobahn==24.4.2
11
12
  Requires-Dist: channels==3.0.3
12
13
  Requires-Dist: pymongo~=4.11.2
13
14
  Requires-Dist: asgiref~=3.8.1
@@ -45,7 +46,7 @@ pip install valar
45
46
  - asgi.py
46
47
  - urls.py
47
48
 
48
- ## 2.1 settings.py
49
+ ## 2.1 settings.py and ___init__.py
49
50
 
50
51
  ```python
51
52
  from pathlib import Path
@@ -61,8 +62,16 @@ SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^
61
62
 
62
63
  DATABASES = {
63
64
  'default': {
64
- 'ENGINE': 'django.db.backends.sqlite3',
65
- 'NAME': BASE_DIR / 'db.sqlite3',
65
+ 'ENGINE': 'django.db.backends.mysql', # 使用 MySQL
66
+ 'NAME': 'vm_ets', # 数据库名
67
+ 'USER': 'root', # 用户名
68
+ 'PASSWORD': password, # 密码
69
+ 'HOST': 'localhost', # 数据库地址,本机用127.0.0.1
70
+ 'PORT': '3306', # MySQL端口,默认3306
71
+ 'OPTIONS': {
72
+ 'connect_timeout': 5, # 默认10秒,可以缩短
73
+ 'charset': 'utf8mb4',
74
+ }
66
75
  }
67
76
  }
68
77
 
@@ -105,44 +114,58 @@ DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
105
114
  """ Valar Options """
106
115
 
107
116
  HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
108
- MONGO_URI = 'mongodb://username:password@host:27017'
109
- MINIO_URL = "s3://username:password@host:9000"
110
- MINIO_ROOT = "https://host:9001"
117
+ MONGO_URI = f'mongodb://root:{password}@{host}:27017/'
118
+ MINIO_URL = f"s3://admin:{password}@{host}:9001"
119
+ MINIO_ROOT = f"http://{host}:9001"
111
120
 
112
121
  """ Email Options """
122
+
113
123
  EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
114
- EMAIL_HOST = 'xxx.xx.xx.xx'
115
- EMAIL_PORT = 465
116
- EMAIL_DOMAIN = 'http://xx.xx.xx'
117
- EMAIL_HOST_USER = "xxx@xx.xx.xx"
118
- EMAIL_HOST_PASSWORD = '*******'
119
- EMAIL_USE_TLS = False
120
- EMAIL_USE_SSL = True
124
+ EMAIL_HOST = 'smtp.126.com'
125
+ EMAIL_PORT = 25
126
+ EMAIL_HOST_USER = "xxxx@126.com"
127
+ EMAIL_HOST_PASSWORD = 'CGiKQh5FyQyupQYA'
128
+ ```
129
+
130
+ ```python
131
+ import pymysql
132
+
133
+ pymysql.install_as_MySQLdb()
134
+
121
135
  ```
122
136
 
123
137
  ## 2.2 asgi.py
124
138
 
125
139
  ```python
140
+ import os
141
+ from pathlib import Path
142
+
126
143
  from django.core.asgi import get_asgi_application
127
144
  from channels.routing import ProtocolTypeRouter, URLRouter
128
145
  from django.urls import re_path
129
146
 
130
147
  from valar.channels.consumer import ValarConsumer
131
148
 
149
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % Path(__file__).resolve().parent.parent.name)
132
150
  application = ProtocolTypeRouter({
133
151
  'http': get_asgi_application(),
134
152
  'websocket': URLRouter([
135
153
  re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
136
154
  ])
137
155
  })
138
-
139
-
140
156
  ```
141
157
 
142
158
  ## 2.3 urls.py
143
159
 
144
- - no need to provide urls for Valar, Valar will auto set urlpatterns for Morghulis (
145
- see https://www.npmjs.com/package/morghulis)
160
+ ```python
161
+ from django.urls import path, include
162
+
163
+ urlpatterns = [
164
+ path('valar/', include('valar.urls')),
165
+ ]
166
+
167
+ ```
168
+
146
169
  - go to section 4 to see how to register channel handlers (a Vue - Django async communication tool) in urls.
147
170
 
148
171
  # 3. migrate
@@ -1,3 +1,4 @@
1
+ autobahn==24.4.2
1
2
  channels==3.0.3
2
3
  pymongo~=4.11.2
3
4
  asgiref~=3.8.1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes