Django란?
파이썬 기반으로 만들어진 웹 프레임워크입니다
프레임워크가 뭐지? --> 프레임워크는 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조며, 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다. (출처 나무위키)
웹 프레임워크을 왜 사용할까?
웹서버을 하기 위해서는 A(apache),P(php),M(mysql) 첫글자을 따서 AMP가 있어서 웹 서비스을 할 수 있습니다
이제는 웹 프레임워크가 A(apache)+P(php) --> 지원해주겠다 왜? 좀 더 편하게 쓰기위해서
apache(HTTP 웹 서버 정적 데이터) + PHP(웹서버 데이터를 처리해주는 동적 데이터)
--> django에서 http 웹서버와 데이터까지 처리하기 좋은 웹프레임워크
자바 node.js , sping 로 있습니다.
웹 프레임워크가 MVC 모델에 대해서 들어본적이 있을 것이다.
M(model) --> 데이터을 가공하는 느낌(mysql) 꼭 db 내용이 정보을 가공할 수 있다 느낌임
V(view) --> 가공한 데이터을 다른 사람한테 보여주는 곳
C(Controller) --> 데이터 흐름을 어떻게 처리할 것인가
django에서는
M(model) --> models.py
V(view) --> views.py
C(Controller) --> urls.py
해당하는 파이썬에 코딩해서 웹프레임 워크을 사용합니다.
웹 서비스는 뭘까? 서비스 Service 해석하면 "제공하다" 서버에서 제공하는 것이다
서버에서 DB도 사용하고, 서버에서 모든 것을 관리해야한다.
1. django 설치하기
python -m pip install Django
// python -m pip install Django==3.1.5 버전 지정하는 방법
2021/01/26기준 Django 최신 버전은 3.1.5 입니다
django는 url --> view --> html 데이터 이런 흐름으로 전달합니다
1.1 django 사용하기
// django-admin startproject [프로젝트명] // 프로젝트명이 test하면 안됌 장고안에 test폴더을 사용중임
django-admin startproject djangotest
cd djangotest
// python manage.py startapp [app이름] //app생성하기
python manage.py startapp mysite
1.2 django 세팅하기
djangotest--> settings.py (djangotest(project)에 mysite(app)을 추가하는 방법)
cf. 나중에 글을 적을 예정이지만 만약에 장고가 진짜로 웹서버을 하기위해서는 외부에서 접근하기 위해서
(settings.py)에 있어야 합니다.
ALLOWED_HOSTS = [] --> ALLOWED_HOSTS = ["*"]
이렇게 바꿔주면 외부에서 모든 사용자을 접근할 수 있게 할 수 있습니다.
CSRF는 API에서 사용하지 않는 기능입니다.
POST로 값을 보내려면 DJANGO에서 제공하는 CSRF을 꺼야 합니다.
다른 방법도 있지만 개발할때 끄는게 편해서 이렇게 설정해주세요
djangotest--> urls.py (djangotest(urls)에 mysite(urls)을 추가하는 방법)
2. mysite(app)을 커스텀마이징해야합니다.
목적은 스마트팜을 하는 웹서버을 웹프레임워크(django)을 사용해서 클라이언트에게 서비스을 제공해야 합니다.
앞에서 이야기 했지만 데이터 흐름이 urls --> views --> templates(html) 이런 순서로 갑니다.
2.1 mysite(app) urls.py
처음에 urls.py가 파일이 없습니다. 직접 파일을 만들어야 합니다.
1 : djangotest(project) --> mysite(app)로 urls 경로을 불러옵니다
2 : views을 불러옵니다.
3 : " ' '로 들어오면 views에 있는 index함수을 호출하겠다" 라는 의미입니다
2.2 mysite(app) views.py
이런식으로 장고가 작동합니다. 기초적인 사용법입니다.
cf. Django 서버 가동 시키는 방법:
python manage.py runserver [GCP 내부 IP]:[port 번호]
// putty창 꺼도 장고서버가 계속 작동하게 하는 법
nohup python manage.py runserver [GCP 내부 IP]:[port 번호] &
port 번호는 장고서버에서 안쓰고 있는 포트번호로 사용하시면 됩니다
리눅스 네트워크 확인
netstat -anlp | grep :[찾고자하는 포트번호]
3. 아두이노와 장고와 통신을 하기위해서는 MQTT로 통해서 연결해야 합니다.
MQTT ?
MQ(message queue): 메시지기반으로 애플리케이션, 서버, 시스템과 연결하는 비동기적 방식입니다.
MQTT : MQ기반으로 topic의 값을 통해 publish와 subscribe 통신하는 방법입니다.
MQTT 사용하기 위해서 새로운 서버에 설치할려고 합니다. 다시 GCP 리눅스을 만듭니다.
sudo apt install mosquitto // mosquitto 설치
mosquitto 설치시 자동으로 작동하게 됩니다. mosquitto 접속 로그을 보기 위해서 mosquitto을 끄고 다시 키면 접속 로그을 볼 수 있습니다.
mqttfx.jensd.de/ 이 사이트는 mqtt을 통해서 값을 쉽게 볼 수 있게 하는 프로그램입니다.
톱니바퀴 --> broker address에서 GCP 외부 ip을 적어주시면 접속 할 수 있습니다.
만약에 접속이 안되다면 GCP 방화벽을 port가 열려 있는지 확인해야합니다.
4. DJango에서 mqtt publish을 하기위해서 Django 역시 mosquitto을 설치해야합니다.
view에서 mqtt라이브러리을 사용해 view에서 publish 할수 있습니다.
#subscribe.py
import paho.mqtt.client as mqtt
def on_message(client,userdata,message):
print("Message received" , str(message.payload.decode("utf-8")))
print("Message topic" , message.topic)
print("Message qos=", message.qos)
print("Message retain flag=", message.retain)
broker_address="[mqtt ip]"
client1 = mqtt.Client("client1")
client1.connect(broker_address)
client1.subscribe("topic")
client1.on_message = on_message
client1.loop_forever()
#publish.py
import paho.mqtt.client as mqtt
mqttc = mqtt.Client("client2")
mqttc.connect("mqtt 서버 ip",1883)
mqttc.publish("topic","보내고 싶은 데이터")
cf 아두이노 HTTP 통신 하지 않고 MQTT통신을 쓰는 이유
1. 아두이노가 ip을 지정할 수가 없어서 장고에서 mqtt을 이용해서 값을 전달하는 방식입니다.
아두이노가 ip을 지정할 수 있다고 하는 것은 내부 ip안에 에서 활당할 수있다고 생각합니다.
해당 소스 깃허브 : github.com/wjswls456/smartfarm/tree/main/rest
'스마트팜' 카테고리의 다른 글
아두이노 형변환 (0) | 2021.01.29 |
---|---|
아두이노 인증 (0) | 2021.01.29 |
축소형 스마트팜 (백엔드) - 1 (0) | 2021.01.19 |
웹 서버 구축 하기 - 1 (0) | 2021.01.07 |
스마트팜 아쿠아포닉스 (0) | 2020.12.21 |