1. ASGI 소개

ASGI 는 django-channels 를 사용할 때 알아야 하는 개념입니다. ASGI는 Asynchronous Server Gateway Interface 의 줄임말입니다. django-channels가 사용하고 있는 Daphne와 django-channels가 작동하는 기반입니다. ASGI는 WSGI와 비슷한 구조를 갖고 있으며 반드시 비동기 통신만을 지원하지는 않습니다. 


ASGI : https://github.com/django/asgiref/blob/master/specs/asgi.rst


ASGI 어플리케이션은 스코프를 다루는 데에 사용됩니다. 스코프를 인자로 받게 됩니다. 스코프는 django-channels에서 하나의 연결 인스턴스이라고 설명할 수 있습니다. django-channels에서 하나의 연결이 이뤄지면 그 연결을 스코프 인스턴스라고 생각하고 진행하셔도 될 것 같습니다. 먼저 ASGI에서 사용하는 Application 클래스를 살펴보겠습니다.


1
2
3
4
class Application:
 
    def __init__(self, scope):
    async def __call__(self, receive, send):
cs


이 것이 Application 클래스입니다. 보시다시피 시작시에 scope 인자를 받습니다. scope를 전적으로 관리하는 것을 의미합니다. 그렇다면 이번엔 scope를 살펴보겠습니다. scope는 django의 Websocket 관련 문서에 설명이 나와있습니다. 


2. webSocket Connection Scope

django에서 scope설명 : https://github.com/django/asgiref/blob/master/specs/www.rst


여길 보시면 WebSocket 설명에서 Connection Scope에 대한 설명이 있습니다. 웹소켓 연결 스코프는 소켓이 살아있는 한 지속된다고 나와있습니다. 결국 스코프는 웹소켓 연결 인스턴스라는 뜻입니다. 스코프는 여러 메타데이터를 갖습니다. type, scheme, path, query_string, root_path, headers, client, server, subprotocols 등의 메타 데이터를 갖습니다. 자세한 설명은 위의 링크를 참조하시기 바랍니다.


3. 예제

1
2
async def send(self, message):
    await self.base_send(message)

cs


이제 이 method의 의미를 알 수 있습니다. scope에서 message 인자를 send 한다는 것입니다. 그 이유는 send를 받는 클래스가 인스턴스로 스코프를 갖고 있기 때문입니다. 그래서 이 method가 가능한 것입니다.

+ Recent posts