add websock functionality
This commit is contained in:
0
one_trip_api/ws/__init__.py
Normal file
0
one_trip_api/ws/__init__.py
Normal file
3
one_trip_api/ws/admin.py
Normal file
3
one_trip_api/ws/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
one_trip_api/ws/apps.py
Normal file
6
one_trip_api/ws/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class WsConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'ws'
|
||||
51
one_trip_api/ws/consumers.py
Normal file
51
one_trip_api/ws/consumers.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from channels.db import database_sync_to_async
|
||||
from channels.generic.websocket import AsyncJsonWebsocketConsumer
|
||||
from rest_framework.authtoken.models import Token
|
||||
from api.models import Homegroup
|
||||
from users.models import User
|
||||
|
||||
class ChatConsumer(AsyncJsonWebsocketConsumer):
|
||||
async def connect(self):
|
||||
token_homegroup = await self.get_homegroup_by_token(self.scope["headers"])
|
||||
if token_homegroup is None:
|
||||
await self.disconnect(1)
|
||||
else:
|
||||
self.room_name = token_homegroup.id
|
||||
self.room_group_name = f"group_{self.room_name}"
|
||||
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
|
||||
await self.accept()
|
||||
|
||||
|
||||
async def receive_json(self, content, **kwargs):
|
||||
await self.channel_layer.group_send(
|
||||
self.room_group_name,
|
||||
content
|
||||
)
|
||||
|
||||
async def disconnect(self, close_code):
|
||||
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
|
||||
|
||||
async def broadcast_update(self, event):
|
||||
print(event)
|
||||
await self.send_json(content={"type": "recommend_update", "hash": event["hash"]})
|
||||
|
||||
@database_sync_to_async
|
||||
def get_homegroup_by_token(self, headers):
|
||||
headers = self.scope["headers"]
|
||||
for pair in headers:
|
||||
if pair[0].decode("UTF-8") == "authorization":
|
||||
tokenType, tokenString = pair[1].decode("UTF-8").split()
|
||||
|
||||
queryset = Token.objects.filter(key=tokenString)
|
||||
if queryset.exists():
|
||||
return Token.objects.get(key=tokenString).user.homegroup
|
||||
else:
|
||||
return None
|
||||
|
||||
@database_sync_to_async
|
||||
def get_homegroup_by_id(self, group_id):
|
||||
queryset = Homegroup.objects.filter(id=group_id)
|
||||
if queryset.exists():
|
||||
return queryset.get()
|
||||
else:
|
||||
return None
|
||||
0
one_trip_api/ws/migrations/__init__.py
Normal file
0
one_trip_api/ws/migrations/__init__.py
Normal file
3
one_trip_api/ws/models.py
Normal file
3
one_trip_api/ws/models.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
7
one_trip_api/ws/routing.py
Normal file
7
one_trip_api/ws/routing.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.urls import re_path, path
|
||||
|
||||
from ws import consumers
|
||||
|
||||
websocket_urlpatterns = [
|
||||
path('ws/', consumers.ChatConsumer.as_asgi(), name='room')
|
||||
]
|
||||
3
one_trip_api/ws/tests.py
Normal file
3
one_trip_api/ws/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
4
one_trip_api/ws/views.py
Normal file
4
one_trip_api/ws/views.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from django.shortcuts import render
|
||||
from rest_framework.views import APIView
|
||||
|
||||
# Create your views here.
|
||||
Reference in New Issue
Block a user