websocket.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import re, datetime, os, urllib, json, django
  2. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings')
  3. os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
  4. django.setup()
  5. from rest_framework.exceptions import APIException
  6. from staff.models import ListModel as staff
  7. CONECTINGS = {}
  8. async def websocket_application(scope, receive, send):
  9. while True:
  10. event = await receive()
  11. if event['type'] == 'websocket.connect':
  12. await send({'type': 'websocket.accept'})
  13. query_string = scope.get('query_string', b'').decode()
  14. qs = urllib.parse.parse_qs(query_string)
  15. openid = qs.get('openid', [''])[0]
  16. sender = qs.get('sender', [''])[0] + '-' + openid
  17. CONECTINGS[sender] = send
  18. elif event['type'] == 'websocket.receive':
  19. query_string = scope.get('query_string', b'').decode()
  20. qs = urllib.parse.parse_qs(query_string)
  21. openid = qs.get('openid', [''])[0]
  22. sender = qs.get('sender', [''])[0]
  23. receiver = qs.get('receiver', [''])[0]
  24. if staff.objects.filter(openid=openid, staff_name=receiver).exists():
  25. sender_guy = sender + '-' + openid
  26. receiver_guy = receiver + '-' + openid
  27. text = {
  28. "sender": sender,
  29. "receiver": receiver,
  30. "detail": str(event['text']),
  31. "create_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  32. "update_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
  33. }
  34. send = CONECTINGS[sender_guy]
  35. if receiver_guy in CONECTINGS:
  36. send = CONECTINGS[receiver_guy]
  37. await send({
  38. 'type': 'websocket.send',
  39. 'text': str(text).replace('\'', '\"')
  40. })
  41. else:
  42. raise APIException({"detail": "Can Not Send Message To Who Not Yours"})
  43. elif event['type'] == 'websocket.disconnect':
  44. try:
  45. query_string = scope.get('query_string', b'').decode()
  46. qs = urllib.parse.parse_qs(query_string)
  47. openid = qs.get('openid', [''])[0]
  48. sender = qs.get('sender', [''])[0] + '-' + openid
  49. CONECTINGS.pop(sender)
  50. break
  51. except:
  52. break
  53. else:
  54. pass