valar 1.3.6__tar.gz → 1.3.7__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.

Potentially problematic release.


This version of valar might be problematic. Click here for more details.

Files changed (59) hide show
  1. {valar-1.3.6/src/valar.egg-info → valar-1.3.7}/PKG-INFO +1 -1
  2. {valar-1.3.6 → valar-1.3.7}/setup.py +1 -1
  3. valar-1.3.7/src/valar/auth/Authentication.py +50 -0
  4. {valar-1.3.6 → valar-1.3.7}/src/valar/auth/Middleware.py +10 -6
  5. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/sender.py +5 -4
  6. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/valar_minio.py +6 -4
  7. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/orm_dao.py +79 -57
  8. {valar-1.3.6 → valar-1.3.7}/src/valar/models/auth.py +1 -0
  9. {valar-1.3.6 → valar-1.3.7}/src/valar/models/meta.py +5 -0
  10. {valar-1.3.6 → valar-1.3.7}/src/valar/views/auth.py +7 -7
  11. {valar-1.3.6 → valar-1.3.7}/src/valar/views/file.py +1 -0
  12. {valar-1.3.6 → valar-1.3.7}/src/valar/views/rest.py +5 -3
  13. {valar-1.3.6 → valar-1.3.7/src/valar.egg-info}/PKG-INFO +1 -1
  14. valar-1.3.6/src/valar/auth/Authentication.py +0 -32
  15. {valar-1.3.6 → valar-1.3.7}/LICENSE +0 -0
  16. {valar-1.3.6 → valar-1.3.7}/README.md +0 -0
  17. {valar-1.3.6 → valar-1.3.7}/setup.cfg +0 -0
  18. {valar-1.3.6 → valar-1.3.7}/src/valar/__init__.py +0 -0
  19. {valar-1.3.6 → valar-1.3.7}/src/valar/apps.py +0 -0
  20. {valar-1.3.6 → valar-1.3.7}/src/valar/auth/__init__.py +0 -0
  21. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/__init__.py +0 -0
  22. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/consumer.py +0 -0
  23. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/counter.py +0 -0
  24. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/executer.py +0 -0
  25. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/mapping.py +0 -0
  26. {valar-1.3.6 → valar-1.3.7}/src/valar/channels/views.py +0 -0
  27. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/__init__.py +0 -0
  28. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/app_mixins/__init__.py +0 -0
  29. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/app_mixins/auto_migration_mixin.py +0 -0
  30. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/app_mixins/auto_urlpatterns_mixin.py +0 -0
  31. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/singleton_meta.py +0 -0
  32. {valar-1.3.6 → valar-1.3.7}/src/valar/classes/valar_response.py +0 -0
  33. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/__init__.py +0 -0
  34. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/abstract.py +0 -0
  35. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/defaults/__init__.py +0 -0
  36. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/defaults/field_keys_default.py +0 -0
  37. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/defaults/field_values_default.py +0 -0
  38. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/defaults/view_defaults.py +0 -0
  39. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/engine.py +0 -0
  40. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/frame.py +0 -0
  41. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/meta.py +0 -0
  42. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/mon_dao.py +0 -0
  43. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/mon_field.py +0 -0
  44. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/orm_field.py +0 -0
  45. {valar-1.3.6 → valar-1.3.7}/src/valar/dao/query.py +0 -0
  46. {valar-1.3.6 → valar-1.3.7}/src/valar/migrations/__init__.py +0 -0
  47. {valar-1.3.6 → valar-1.3.7}/src/valar/models/__init__.py +0 -0
  48. {valar-1.3.6 → valar-1.3.7}/src/valar/models/core.py +0 -0
  49. {valar-1.3.6 → valar-1.3.7}/src/valar/models/frame.py +0 -0
  50. {valar-1.3.6 → valar-1.3.7}/src/valar/models/test.py +0 -0
  51. {valar-1.3.6 → valar-1.3.7}/src/valar/urls.py +0 -0
  52. {valar-1.3.6 → valar-1.3.7}/src/valar/views/__init__.py +0 -0
  53. {valar-1.3.6 → valar-1.3.7}/src/valar/views/handler.py +0 -0
  54. {valar-1.3.6 → valar-1.3.7}/src/valar/views/meta.py +0 -0
  55. {valar-1.3.6 → valar-1.3.7}/src/valar/views/password.py +0 -0
  56. {valar-1.3.6 → valar-1.3.7}/src/valar.egg-info/SOURCES.txt +0 -0
  57. {valar-1.3.6 → valar-1.3.7}/src/valar.egg-info/dependency_links.txt +0 -0
  58. {valar-1.3.6 → valar-1.3.7}/src/valar.egg-info/requires.txt +0 -0
  59. {valar-1.3.6 → valar-1.3.7}/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.6
3
+ Version: 1.3.7
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
3
3
  with open("README.md", "r", encoding="utf-8") as f:
4
4
  long_description = f.read()
5
5
 
6
- version = "1.3.6"
6
+ version = "1.3.7"
7
7
 
8
8
  requires = [
9
9
  'channels==3.0.3',
@@ -0,0 +1,50 @@
1
+ import jwt
2
+ from django.conf import settings
3
+
4
+ from ..classes.valar_response import ValarResponse
5
+
6
+
7
+ class ValaAuthError(Exception):
8
+ def __init__(self, message, code):
9
+ self.code = code
10
+ self.message = message
11
+
12
+
13
+ def auth_required(view_func):
14
+ def wrapper(request, *args, **kwargs):
15
+ try:
16
+ payload = valid_request_token(request)
17
+ request.user_id = payload["user_id"]
18
+ return view_func(request, *args, **kwargs)
19
+ except ValaAuthError as e:
20
+ return ValarResponse(False, e.message, e.code, status=401)
21
+
22
+ return wrapper
23
+
24
+
25
+ def get_token_from_request(request):
26
+ auth_header = request.headers.get("Authorization")
27
+ if auth_header and auth_header.startswith("Bearer "):
28
+ return auth_header.split(" ")[1]
29
+ return None
30
+
31
+
32
+ status = {
33
+ 0: (None, None, None),
34
+ 1: ('请登录系统', 'info', 401),
35
+ 2: ('状态已过期,请重新登录', 'warning', 401),
36
+ 3: ('错误状态,请重新登录', 'error', 401),
37
+ }
38
+
39
+
40
+ def valid_request_token(request):
41
+ token = get_token_from_request(request)
42
+ if not token: raise ValaAuthError('请登录系统', 'info')
43
+ try:
44
+ payload = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
45
+ payload['token'] = token
46
+ return payload
47
+ except jwt.ExpiredSignatureError:
48
+ raise ValaAuthError('状态已过期,请重新登录', 'warning')
49
+ except jwt.InvalidTokenError:
50
+ raise ValaAuthError('错误状态,请重新登录', 'error')
@@ -4,25 +4,29 @@ import json
4
4
  from django.http import HttpRequest
5
5
  from django.utils.deprecation import MiddlewareMixin
6
6
 
7
- from ..auth.Authentication import validate
7
+ from ..auth.Authentication import valid_request_token, ValaAuthError
8
8
  from ..classes.valar_response import ValarResponse
9
9
 
10
10
 
11
11
  class ValarMiddleware(MiddlewareMixin):
12
12
  @staticmethod
13
13
  def process_response(request: HttpRequest, response: ValarResponse):
14
- auth = request.headers.get("Auth")
15
- if auth:
16
- payload, _ = validate(request)
17
- if not payload:
14
+ try:
15
+ payload = valid_request_token(request)
16
+ response["token"] = payload['token'] or '~~~'
17
+ """此处可以加入数据级别的权限验证"""
18
+ except ValaAuthError as e:
19
+ if request.headers.get("Auth"):
18
20
  return ValarResponse(False, '无效权限', 'error', status=403)
21
+
19
22
  if type(response) == ValarResponse:
20
23
  valar_message, valar_code = response.valar_message, response.valar_code
21
24
  data = {
22
25
  'payload': json.loads(response.content),
23
26
  'message': valar_message,
24
- 'code': valar_code
27
+ 'code': valar_code,
25
28
  }
26
29
  response.content = json.dumps(data, ensure_ascii=False).encode("utf-8")
27
30
  response["Content-Type"] = "application/json; charset=utf-8"
31
+
28
32
  return response
@@ -7,7 +7,7 @@ from channels.layers import get_channel_layer
7
7
  from django.http import HttpRequest
8
8
  import threading
9
9
  from .consumer import VALAR_CHANNEL_GROUP
10
- from ..auth.Authentication import validate
10
+ from ..auth.Authentication import valid_request_token
11
11
 
12
12
 
13
13
  class Channel:
@@ -19,6 +19,7 @@ class Channel:
19
19
  self.auth = body.get('auth')
20
20
  self.broadcast = body.get('broadcast')
21
21
  self.data = body.get('data')
22
+ self.resolve = body.get('resolve')
22
23
 
23
24
  def to_dict(self, status, payload):
24
25
  data = {
@@ -26,6 +27,7 @@ class Channel:
26
27
  'url': self.url,
27
28
  'auth': self.auth,
28
29
  'broadcast': self.broadcast,
30
+ 'resolve': self.resolve,
29
31
  'timestamp': datetime.now().timestamp()
30
32
  }
31
33
  if status:
@@ -55,9 +57,8 @@ class ValarChannelSender(Sender):
55
57
  self.__lock__ = threading.Lock()
56
58
  self.__interval__ = interval
57
59
  if self.__channel__.auth:
58
- payload, _ = validate(request)
59
- if payload is None:
60
- raise Exception('Unauthorized!')
60
+ payload = valid_request_token(request)
61
+ self.user_id = payload["user_id"]
61
62
 
62
63
  def _run(self):
63
64
  while self.__loading__:
@@ -6,20 +6,22 @@ from urllib3 import BaseHTTPResponse
6
6
  from ..classes.singleton_meta import SingletonMeta
7
7
 
8
8
 
9
- class ValarMinio(metaclass=SingletonMeta):
9
+ class ValarMinio:
10
10
 
11
11
  def __init__(self, client, entity):
12
12
  self.client = client
13
13
  self.bucket_name = f'{settings.BASE_DIR.name}.{entity}'.replace('_', '-').lower()
14
- if client and not self.client.bucket_exists(self.bucket_name):
15
- self.client.make_bucket(self.bucket_name)
16
- self.client.set_bucket_policy(self.bucket_name, self.__generate_policy__())
17
14
 
18
15
  @staticmethod
19
16
  def get_object_name(_id, prop, file_name):
20
17
  return f"{_id}-{prop}-{file_name}"
21
18
 
22
19
  def upload(self, object_name, _bytes):
20
+ if not self.client:
21
+ raise Exception('未配置Minio')
22
+ if not self.client.bucket_exists(self.bucket_name):
23
+ self.client.make_bucket(self.bucket_name)
24
+ self.client.set_bucket_policy(self.bucket_name, self.__generate_policy__())
23
25
  file_data = BytesIO(_bytes)
24
26
  file_size = len(_bytes) # file.siz
25
27
  self.client.put_object(
@@ -2,16 +2,19 @@ import datetime
2
2
  import json
3
3
 
4
4
  from django.core.paginator import Paginator
5
+ from django.db.models.options import Options
5
6
 
6
7
  from .abstract import AbstractDao
7
8
  from .query import Query
8
- from django.db.models import ManyToOneRel, ForeignKey, ManyToManyRel, ManyToManyField, OneToOneField, OneToOneRel
9
+ from django.db.models import ManyToOneRel, ForeignKey, ManyToManyRel, ManyToManyField, OneToOneField, OneToOneRel, \
10
+ CharField, BooleanField, FloatField, IntegerField, BigAutoField
9
11
  from django.db.models import QuerySet
10
12
  from django.db.models import Manager
11
13
  from django.db.models.fields.files import FieldFile
12
14
  from django.forms import FileField
13
15
 
14
16
  from ..dao.orm_field import OrmField
17
+ from ..models.auth import Account
15
18
  from ..models.core import VTree, VModel
16
19
  from ..models.meta import MetaField
17
20
 
@@ -150,12 +153,13 @@ class OrmDao(AbstractDao):
150
153
  m2m.clear()
151
154
  m2m.add(*value)
152
155
  elif clazz == ManyToOneRel:
153
- getattr(bean, model_field.get_accessor_name()).clear()
154
- remote_model: VModel = model_field.related_model
155
- new_set: QuerySet = remote_model.objects.filter(id__in=value)
156
- remote_field: ForeignKey = model_field.remote_field
157
- k = remote_field.get_attname()
158
- new_set.update(**{k: bean.id})
156
+ pass
157
+ # getattr(bean, model_field.get_accessor_name()).clear()
158
+ # remote_model: VModel = model_field.related_model
159
+ # new_set: QuerySet = remote_model.objects.filter(id__in=value)
160
+ # remote_field: ForeignKey = model_field.remote_field
161
+ # k = remote_field.get_attname()
162
+ # new_set.update(**{k: bean.id})
159
163
  elif clazz == ManyToManyRel:
160
164
  getattr(bean, model_field.get_accessor_name()).clear()
161
165
  remote_model: VModel = model_field.related_model
@@ -207,6 +211,7 @@ class OrmDao(AbstractDao):
207
211
  # 简单字段取值
208
212
  simple_props = [field.prop for field in meta_fields if field.domain not in __referred_domains__]
209
213
  custom_props = __get_custom_props__(self.entity, code)
214
+
210
215
  results = list(query_set.filter().values(*[*simple_props, *custom_props]))
211
216
  __set_simple_values__(meta_fields, results)
212
217
  # 关系型字段取值
@@ -216,9 +221,72 @@ class OrmDao(AbstractDao):
216
221
  for meta_field in referred_fields:
217
222
  manager: Manager = query_set.model.objects
218
223
  qs = manager.filter(id__in=pks)
219
- __linkage__(meta_field, qs, mapping)
224
+ self.__linkage__(meta_field, qs, mapping)
220
225
  return results
221
226
 
227
+ def __linkage__(self, meta_field: OrmField, query_set: QuerySet, mapping):
228
+ model_field = meta_field.model_field
229
+ prop = model_field.name
230
+ multiple = meta_field.domain in __multiple_domains__
231
+
232
+ # 获取级联关系的键索引
233
+ ref_prop = f'{prop}__id'
234
+ edges = query_set.exclude(**{f'{ref_prop}__isnull': True}).values('id', ref_prop)
235
+ if multiple:
236
+ related_primary_keys = set()
237
+ results_mapping = {}
238
+ for edge in edges:
239
+ _id, rid = edge['id'], edge[ref_prop]
240
+ related_primary_keys.add(rid)
241
+ array = results_mapping.get(_id, [])
242
+ array.append(rid)
243
+ results_mapping[_id] = array
244
+ else:
245
+ results_mapping = {row['id']: row[ref_prop] for row in edges if row[ref_prop]}
246
+ related_primary_keys = set(results_mapping.values())
247
+
248
+ # 获取级联关系从属方的数据
249
+ related_model = model_field.related_model
250
+ related_fields = related_model._meta.get_fields()
251
+ related_props = self.__get_related_props__(related_fields)
252
+ related_values = list(related_model.objects.filter(id__in=related_primary_keys).values(*related_props))
253
+ __set_simple_values__(related_fields, related_values)
254
+ related_mapping = {item['id']: item for item in related_values}
255
+
256
+ # 将从属方的数据绑定在主数据上
257
+ for _id in mapping:
258
+ row = mapping[_id]
259
+ if multiple:
260
+ keys = results_mapping.get(_id, [])
261
+ items = [related_mapping[pid] for pid in keys]
262
+ row[prop] = keys
263
+ row[f'{prop}_set'] = items
264
+ else:
265
+ key = results_mapping.get(_id)
266
+ item = related_mapping.get(key) if key else None
267
+ row[prop] = item
268
+ row[f'{prop}_id'] = key
269
+
270
+ def __get_related_props__(self, fields):
271
+ array = []
272
+ for field in fields:
273
+ domain = type(field).__name__
274
+ prop = field.name
275
+ if field.name in __omit_field_props__ or domain in __multiple_domains__:
276
+ continue
277
+ if domain in __referred_domains__:
278
+ field: ForeignKey = field
279
+ model = field.related_model
280
+ meta: Options = model._meta
281
+ if meta.label != self.entity and meta.label != 'valar.Account':
282
+ _fields = meta.get_fields()
283
+ for _field in _fields:
284
+ if type(_field) in [CharField, BooleanField, FloatField, IntegerField, BigAutoField]:
285
+ array.append(f'{prop}__{_field.name}')
286
+ else:
287
+ array.append(prop)
288
+ return array
289
+
222
290
 
223
291
  """ 以下为静态方法和变量 """
224
292
 
@@ -254,52 +322,6 @@ def __set_simple_values__(fields, values):
254
322
  for prop in json_props:
255
323
  row[prop] = json.loads(row[prop]) if type(row[prop]) is str else row[prop]
256
324
 
257
-
258
- def __get_related_props__(fields):
259
- def fun(field): return type(field).__name__ not in __referred_domains__ and field.name not in __omit_field_props__
260
-
261
- return [field.name for field in fields if fun(field)]
262
-
263
-
264
- def __linkage__(meta_field: OrmField, query_set: QuerySet, mapping):
265
- model_field = meta_field.model_field
266
- prop = model_field.name
267
- multiple = meta_field.domain in __multiple_domains__
268
-
269
- # 获取级联关系的键索引
270
- ref_prop = f'{prop}__id'
271
- edges = query_set.exclude(**{f'{ref_prop}__isnull': True}).values('id', ref_prop)
272
- if multiple:
273
- related_primary_keys = set()
274
- results_mapping = {}
275
- for edge in edges:
276
- _id, rid = edge['id'], edge[ref_prop]
277
- related_primary_keys.add(rid)
278
- array = results_mapping.get(_id, [])
279
- array.append(rid)
280
- results_mapping[_id] = array
281
- else:
282
- results_mapping = {row['id']: row[ref_prop] for row in edges if row[ref_prop]}
283
- related_primary_keys = set(results_mapping.values())
284
-
285
- # 获取级联关系从属方的数据
286
- related_model = model_field.related_model
287
- related_fields = related_model._meta.get_fields()
288
- related_props = __get_related_props__(related_fields)
289
- related_values = list(related_model.objects.filter(id__in=related_primary_keys).values(*related_props))
290
- __set_simple_values__(related_fields, related_values)
291
- related_mapping = {item['id']: item for item in related_values}
292
-
293
- # 将从属方的数据绑定在主数据上
294
- for _id in mapping:
295
- row = mapping[_id]
296
- if multiple:
297
- keys = results_mapping.get(_id, [])
298
- items = [related_mapping[pid] for pid in keys]
299
- row[prop] = keys
300
- row[f'{prop}_set'] = items
301
- else:
302
- key = results_mapping.get(_id)
303
- item = related_mapping.get(key) if key else None
304
- row[prop] = item
305
- row[f'{prop}_id'] = key
325
+ # def fun(field): return type(field).__name__ not in __referred_domains__ and field.name not in __omit_field_props__
326
+ #
327
+ # return [field.name for field in fields if fun(field)]
@@ -34,6 +34,7 @@ class Menu(VTree):
34
34
  path = models.CharField(max_length=255, null=True, verbose_name='地址')
35
35
  roles = models.ManyToManyField(Role)
36
36
  is_admin = models.BooleanField(null=True, default=False, verbose_name='超管权限')
37
+ is_auth = models.BooleanField(null=True, default=False, verbose_name='需要登录')
37
38
 
38
39
  class Meta:
39
40
  verbose_name = '菜单'
@@ -88,3 +88,8 @@ class MetaField(VModel):
88
88
 
89
89
  class Meta:
90
90
  verbose_name = '视图字段'
91
+
92
+
93
+ class MetaViewDefault(VModel):
94
+ class Meta:
95
+ verbose_name = '元数据字段类型'
@@ -41,18 +41,17 @@ def sign_in(request):
41
41
  })
42
42
  return ValarResponse(jwt.encode({
43
43
  "user_id": account.id,
44
- "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=2)
44
+ "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=5)
45
45
  }, settings.SECRET_KEY, algorithm="HS256"))
46
46
 
47
47
 
48
48
  def free_menus(request):
49
49
  body = json.loads(request.body)
50
50
  scope = body.get("scope", 'admin')
51
- menus = Menu.objects.filter(isLeaf=True, scope=scope, is_admin=False, path__isnull=False,
52
- roles__isnull=True).values('path')
53
- payload = {
54
- "permissions": [m['path'] for m in menus]
55
- }
51
+ menus = Menu.objects.filter(
52
+ isLeaf=True, scope=scope, is_admin=False, path__isnull=False, is_auth=False,
53
+ roles__isnull=True).values('path')
54
+ payload = {"permissions": [m['path'] for m in menus]}
56
55
  token = jwt.encode(payload, settings.SECRET_KEY, algorithm="HS256")
57
56
  return ValarResponse(token)
58
57
 
@@ -104,6 +103,7 @@ def user_profile(request):
104
103
  if hasattr(account, accessor):
105
104
  user = getattr(account, accessor)
106
105
  name = getattr(user, 'name')
107
- payload.update({'name': name})
106
+ key = getattr(user, 'id')
107
+ payload.update({'name': name, 'user_key': key})
108
108
  token = jwt.encode(payload, settings.SECRET_KEY, algorithm="HS256")
109
109
  return ValarResponse(token)
@@ -17,6 +17,7 @@ def save_file(request, db, entity):
17
17
  dao = Dao(entity, db)
18
18
  engine = ValarEngine().get_minio_bucket(entity)
19
19
  item = dao.find_one(_id)
20
+
20
21
  if engine is None or item is None:
21
22
  return ValarResponse(False)
22
23
  old_value = getattr(item, prop)
@@ -1,5 +1,7 @@
1
1
  import json
2
2
 
3
+ from django.db.models import QuerySet
4
+
3
5
  from .handler import batch_handler
4
6
  from ..channels.executer import execute_channel
5
7
  from ..channels.sender import ValarChannelSender
@@ -71,13 +73,13 @@ def search(request, db, entity):
71
73
  size = body.get('size')
72
74
  page = body.get('page')
73
75
  root = body.get('root')
74
-
75
- print(root, 'root', entity)
76
-
77
76
  code = body.get('code', 'default')
78
77
  conditions = body.get('conditions')
79
78
  dao = Dao(entity, db)
80
79
 
80
+ qs, _ = dao.find(conditions)
81
+ qs.filter(saved=False).delete()
82
+
81
83
  if _type == 'tree':
82
84
  query_set = dao.tree(root, conditions)
83
85
  total = query_set.count()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.3.6
3
+ Version: 1.3.7
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -1,32 +0,0 @@
1
- import jwt
2
- from django.conf import settings
3
-
4
- from ..classes.valar_response import ValarResponse
5
-
6
-
7
- def auth_required(view_func):
8
- def wrapper(request, *args, **kwargs):
9
- payload, response = validate(request)
10
- if payload:
11
- request.user_id = payload["user_id"]
12
- return view_func(request, *args, **kwargs)
13
- else:
14
- return response
15
-
16
- return wrapper
17
-
18
-
19
- def validate(request):
20
- auth_header = request.headers.get("Authorization")
21
- if not auth_header or not auth_header.startswith("Bearer "):
22
- return None, ValarResponse(False, '请登录系统', 'info', status=401)
23
- token = auth_header.split(" ")[1]
24
- if not token:
25
- return None, ValarResponse(False, status=401)
26
- try:
27
- payload = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
28
- return payload, ValarResponse(False)
29
- except jwt.ExpiredSignatureError:
30
- return None, ValarResponse(False, '状态已过期,请重新登录', 'warning', status=401)
31
- except jwt.InvalidTokenError:
32
- return None, ValarResponse(False, '错误状态,请重新登录', 'error', status=401)
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
File without changes
File without changes
File without changes