기본 콘텐츠로 건너뛰기

Django-Channels와 HTTP 통합해보기

Django-Channels와 HTTP 통합해보기 프로젝트로 IoT 애플리케이션을 제작하고 있는데, 처음 시도 해보는 부분이라서 어떻게 구축을 시작해야할지 막막한 부분이 많았습니다. 개인적으로 Python을 주로 사용하고 있고, 중앙 서버를 Django로 구축하기로 했기 때문에, Django에 관한 여러 정보들을 찾아보다가 Channels라는 Django 애드온을 알게 되었습니다. Channels를는 주로 채팅 관련 서비스에 사용 되는것 같은데, Django를 웹소켓 서버로 사용할 수 있도록 도와주는 점에서 잘 활용하면 계속 연결이 유지되어야하고, 양방향 통신이 필요한 IoT 서버로 사용할 수 있다고 판단하여 Channels를 사용 해보게 되었습니다. 하지만 어플리케이션과 IoT 서버가 항상 WebSocket으로 연결되어 있진 않을것 같았고... IoT기기와 서버가 웹소켓을 통해 항상 연결되어 있고, 어플리케이션은 해당 웹소켓 연결에 HTTP로 데이터를 던져주는 방향으로 생각을 해보게 되었습니다. Django-Channels 외부 Consumer에서 접근 Django-Channels 공식 문서에 힌트가 될 부분을 찾았습니다. Channels-Layer를 외부 Consumer에서 접근할 수 있는 방법에 대한 설명이었는데, 이 부분을 잘 활용하면 Django api로 웹소켓에 접근이 가능해보였습니다. ⚠️ 여기서 데이터를 받는 Consumer는 WebsocketConsumer를 통해 생성되었습니다. from channels.layers import get_channel_layer channel_layer = get_channel_layer() 먼저 이렇게 get_channel_layer() 함수로 channels를 조작할 수 있는 객체를 받을 수 있었습니다. await channel_layer.group_send( chat_name, {"type": "chat.system_message", "

Python FastAPI 알아보고 설치하고 초기 설정 해보기

 

Python FastAPI, 설치하고 초기 설정 해보기Permalink

fastapi_logo

파이썬 웹 서버를 만들어야 하는 일이 생겼늗데, 최대한 빠르고 안정적인 서버를 선택 해야했다.
그래서 기존에 사용하던 Flask보다 훨씬 빠르다고 하는 FastAP를 사용해보기로 했다.



❓ FastAPI란?Permalink

👉 FastAPI 공식 한국어 페이지 https://fastapi.tiangolo.com/ko/

FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다.

FastAPI는 파이썬에서 사용 가능한 웹 프레임워크 중 하나인데, Flask나 Django보가 훨씬 빠른 속도를 보여준다고 하고, 확인 해봐야 하겠지만 Go언어와도 비슷한 속도를 보여준다고 한다.

또, 쉽고 간결한 코드, 200% ~ 300% 까지 증가하는 개발 속도를 기대할 수 있다고 하는데, 시작 해보자! 👏


Permalink


FastAPI 설치Permalink

먼저 공식 사이트에선 pip를 이용해 설치 하라고 나와있는데, 나는 anaconda를 이용해서 설치를 했다.

bash
$ pip install fastapi

anaconda 사용 시
$ conda install fastapi


그리고 ASGI서버도 필요해서 같이 설치하라고 하는데, Univorn을 설치 해보자.

bash $ pip install uvicorn[standard]

anaconda 사용 시 $ conda install uvicorn


FastAPI 예제Permalink

설치가 완료되면 이렇게 vscode에서 FastAPI() 클래스가 자동 완성 되는걸 확인할 수 있다.
fastapi_import

그리고 정말 간단히 API를 만들 수 있는데,
main.py 파일을 만든 후에

from typing import Optional

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello" : "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

이렇게 작성하고 터미널에 하단의 명령어를 작성하면

$ uvicorn main:app —reload

이 명령어 뒤에 붙은 —reload는 코드가 변경 되었을 때 자동으로 서버를 재 실행하라는 명령어란다.

fastapi_run

이렇게 뜨면서 FastAPI로 만든 첫 웹 서버가 실행 된다.

FastAPI의 기본 포트는 8000으로 되어 있는 것 같으므로,
http://127.0.0.1:8000
또는
http://localhost:8000

으로 접속 하면
fastapi_root
이렇게 root경로가 잘 나오는걸 확인 할 수 있다.

그리고, http://127.0.0.1:8000/items/123?q=coffee
이쪽으로 접속하게 되면 GET 메소드도 쉽게 활용할 수 있는걸 확인할 수 있다. fastapi_coffee


Permalink


예제 코드 뜯어보기Permalink

상단의 코드를 하나씩 살펴보면

from typing import Optional
from fastapi import FastAPI
# 이 부분은 함수에 None이 혀용되는 매개변수에 대한 타입을 명시할 때 사용되는 Optional을 import하고

#FastAPI를 import 하는 부분
app = FastAPI()
# 그냥 FastAPI()클래스 객체 생성
@app.get("/")
def read_root():
    return {"Hello" : "World"}

# @app.get("/") 부분에서 루트 경로인것과 GET이란걸 명시했다는 것을 쉽게 알 수 있다.
# return 하는 부분에 해당 경로의 response를 작성하면 된다.
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

# 여기선 /items/item_id 경로를 명시했다는걸 알 수 있는데, 마지막 {}에 감싸져 있는 부분은 변수라고 볼 수 있는 것 같다.

# item_id로 들어간 값은 int형이라고 명시하고, q라는 GET방식의 query 또한 있는 것을 알 수 있다.

여기서 int라고 해놓은 item_id에 str을 넣게 되면 422에러를 return하게 되므로 나중에 잘 체크 해야한다.
http://127.0.0.1/items/밥?q=coffee

fastapi_type_error


Permalink


FastAPI 설치와 기본 사용 방법에 대해 알아봤는데, 이렇게 간단한 예제에서는 Flask역시 정말 간단한 코드로 웹 서버를 구현할 수 있어서 Flask와는 큰 차이를 느낄 수 없었다.
나중에 더 많은 테스트를 해봐야지 얘가 얼마나 빠른지 알 수 있을 것 같은데, 기대된다😊

댓글

이 블로그의 인기 게시물

놀이의 4대 요소 (Agon(아곤), Mimicry(미미크리), Ilinx(일링크스), Alea(알레아))

네덜란드의 고전 학자인 '요한 하위징아'의 저서인 「호모 루덴스 」에서 인간을 '유희의 인간'이라고 칭했습니다. 프랑스의 '로제 카유아'라는 학자는 「호모 루덴스 」의 이론을 발전시켜 그의 저서인 「놀이와 인간」 (원제 「 Man, plays and games 」) 에서 ‘놀이의 4대 요소’를 말했습니다. 저자는 그것을 아곤, 미미크리, 알레아, 일링크스로 소개했습니다. 이 네 가지 놀이의 요소는 인간의 모든 유희, 놀이에서 발전되어 현대의 비디오 게임에서도 매우 중요한 이론으로 알려져있습니다. 먼저, 아곤(Agon), 경쟁 아곤은 놀이의 주체와 객체간의 경쟁을 의미합니다. 사람들은 경쟁에서 승리함으로써 성취감을 얻고, 우월감을 느끼게 합니다. 이 아곤을 현대의 게임에 대입 시켜보면 경쟁은 최근 가장 많이 플레이 하는 게임 중 하나인 ‘배틀 그라운드’나 ‘리그 오브 레전드’같은 게임들도 경쟁에 기반이 되어있고, 혼자 플레이 하는 게임에서도 자기 자신과의 경쟁, AI와의 경쟁 등이 포함되어있습니다. 예를 들어, 슈퍼 마리오 같은 게임에서도 플레이어들은 어떻게 이 게임을 더 빨리 클리어하기 위해 경쟁하고, 더 많은 점수를 받기 위해 노력합니다. 또한 비교적 MMR시스템이 잘 짜여져있는 '리그 오브 레전드'같은 AOS게임에서도 플레이어의 등급을 결정하는 랭크 게임 시스템이 중점적으로 돌아가고 있고, '오버워치'의 경쟁전 등 많은 게임에서 이런 경쟁을 유도하는 시스템을 만들어 놓았습니다. 게임을 계속 플레이하게 만드는 가장 큰 요소가 아곤입니다. 많은 게임에서 플레이어의 경쟁을 어떻게 잘 이끌어 나갔느냐에 따라서 그 게임의 성공이 나뉠 수도 있습니다. 미미크리(Mimicry), 역할 미미크리는 역할을 의미합니다. 사람들은 실제 세계에서 하지 못하는 일들을 놀이에서 느끼면서 큰 기쁨을 느낄 수 있습니다. 이 역할은 롤플레

FastAPI 실시간 영상 스트리밍 OpenCV

  FastAPI와 OpenCV를 활용한 실시간 영상 스트리밍 Permalink 실시간 영상을 스트리밍 하는 방법을 찾던 중 파이썬 FastAPI를 활용한 방법을 시도 해보았다. 필수 라이브러리 Permalink 필요한 것은 Python3.9버전 (애플 M1칩셋 맥북에어에서 3.8 버전으로 시도 해보니 OpenCV라이브러리 설치에서 문제가 발생했었다) FastAPI uvicorn OpenCV 정도면 될 것 같다. 라이브러리들은 모두 설치 되었다고 가정 하고, 예제 코드 Permalink # main.py # 라이브러리 import # StreamingResponse를 가져와야함 from fastapi import FastAPI from fastapi.responses import StreamingResponse # cv2 모듈 import from cv2 import get_stream_video # FastAPI객체 생성 app = FastAPI () # openCV에서 이미지 불러오는 함수 def video_streaming (): return get_stream_video () # 스트리밍 경로를 /video 경로로 설정. @ app . get ( "/video" ) def main (): # StringResponse함수를 return하고, # 인자로 OpenCV에서 가져온 "바이트"이미지와 type을 명시 return StreamingResponse ( video_streaming (), media_type = "multipart/x-mixed-replace; boundary=frame" ) # cv2.py import cv2 def get_stream_video (): # camera 정의 cam = cv2 . VideoCapture ( 0 ) while True :