취미삼아 배우는 프로그래밍

django-channels-database-tableout 본문

파이썬(장고)

django-channels-database-tableout

Nadure 2019. 10. 31. 19:58

django-channels-database-tableout

:: 장고와 채널스를 써서 데이터베이스를 테이블로 뽑아낼 것이다

 

우선 이에 앞서,

https://ssungkang.tistory.com/entry/Django-Channels-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%A0%81-%EC%B1%84%ED%8C%85-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-WebSocket-1

 

[Django] Channels, 비동기적 채팅 구현하기 - WebSocket (1)

비동기적, 즉 실시간 채팅을 구현하기 위해서 WebSocket 을 사용하고자 하였고, django 에서 이를 가능하게 해주는 Channels 라이브러리를 알아보았습니다. 전체적인 내용은 공식 문서 를 참고하였습니다. WebSock..

ssungkang.tistory.com

 

이곳의 예제를 한 번은 해보았다.

 

그치만, 이건 의미를 모르고 그냥 복붙만 했을 뿐이어서

크게 이해를 하지 못했다.

 

그렇기에 이번엔 맨 땅에 혼자서 저 위의 글만 보고

만들어보고자 했다.

 

만들기 전 체크리스트

  • 나는 채널스를 이해하는가? ㄴ
  • 나는 웹소켓을 이해하는가? ㄴ
  • 나는 채팅기능 만든것을 이해하는가? ㄴ
  • 라우터는 무엇인가? ㄴ
  • 웹소켓은 무엇인가? ㄴ
  • 아는게 뭔가? ㄴ

 

 

그래 나란놈

 

생판 혼자서는 안되는걸..

 

 

그래서 동영상을 참고했다.

 

https://youtu.be/RVH05S1qab8

장고 채널스..웹소켓 사용법

이 아저씨 쉬운 단어만 쓰고, 설명을 참 잘한다.

 

https://buildmedia.readthedocs.org/media/pdf/channels/latest/channels.pdf

불러오는 중입니다...

여기서는 채널스 독을 다운받을 수 있다.

회사가서 인쇄해서 들고 도망쳐야겠다.

 

88페이지지만 문제없지.

 

 

그나마 다행인건,

라우터를 제외한 기본적인 세팅은

이해한다는 것이다.

 

#main/settings.py

INSTALLED_APPS = [
    'channels', # 추가

]

#추가
ASGI_APPLICATION = 'todo.routing.application'
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

그래 이거 넣는게 이해한 전부였다.

 

* 라우터란 뭘까

:: 돌려주는것

정도의 느낌인 것 같다.

 

 

ASGI_APPLICATION -> [settings.py가 위치한 앱폴더]의 routing.application이란 곳의 것을 쓴다

라고 돼있다.

 

그러면 결국

settings 과 같히 나란히 있는 routing.py 내의 application 이란 것을 쓴다는 것이 된다.

 

나의 메인 앱폴더

 

#todo/routing.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddleware
import databasechat.routing
from django.urls import path
from databasechat.consumer import databaseConsumer
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator
 
application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket':AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter([
                path('databasechat/',databaseConsumer),
            ])
        )
    )
 
})
 
cs

 

import
description
AuthMiddlewareStack 인증자체를 쌓아두고 확인하는 것
ProtocolTypeRouter 프로토콜 타입을 돌려주는 것(라우터)
URLRouter URL로 돌려주는 것
databasechat.consumer 내가 작성한 컨슈머
AllowedHostsOriginValidator 맞게 들어온건지 중간검사 하는 것
OriginValidator 실화인지 여부를 체크하는 것
  *상기 설명은 틀릴 확률이 매우 높음(개인적인 느낌)

 

 

그리고 컨슈머를

작성했다.

#databasechat/consumer.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import asyncio
import json
from django.contrib.auth import get_user_model
from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async
 
from .models import normaldata
 
class databaseConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print("connected", event)
        await self.send({
            "type""websocket.accept"
        })
 
        await self.send({
            "type":"websocket.send",
            "text":"Hellow!"
        })

 
    async def websocket_receive(self, event):
        # When Receives
        print("receive", event)
 
    async def websocket_disconnect(self, event):
        # When Disconnects
        print("disconnected", event)
cs

 

 

 

 

잘 된다!

Web socket을 이용해서 Hellow라는 데이터를 전송하는데에 성공했다.

 

 

이제 이것을 통해서 데이터베이스를 주고 받고

수정하고

하면 될 듯 하다!

 

 

덧.

https://pusher.com/tutorials/live-table-flask

 

Build a live table using Flask

Use Flask and JavaScript to create a live table with a basic admin backend.

pusher.com

내가 추구하고자 하는 페이지!

출저는 위의 홈페이지다.

 

이런 식의 데이터테이블을 만들고 싶은건데,

문제는 위의 사이트는

플라스크로 만들어졋다는 것..

 

최대한 비슷하게 짜긴 짜야겠지만

어떻게 하면 좋을까

 

* 내가 해결해야할 문제는 이렇다.

  • 많은 양의 데이터를 가지각색의 사람들이 다양한 방식으로 쿼리된 화면을 보고 있다고 가정한다.
  • 이 다양한 테이블이 쿼리된 화면에서, 각각의 사용자들은 데이터가 변한 값을 즉각즉각 볼 수 있어야 한다.
  • 쿼리한 테이블의 로우만큼 채널 수를 늘려서 이에 가입시키고 반영시킬 것인가.
  • 아니면 이 리얼타임 데이터베이스를 포기할 것인가..

 

 

그래 일단은 REST API로

백엔드 / 프론트엔드를 구분해서

 

데이터 테이블부터 보여주는걸 해보자.

 

 

결국 웹소켓만 연결하고 끝났다.

ANUA..

 

 

 

Comments