[python] Django란?

Language/python 2017. 12. 29. 23:21

<Web Application Framework for python>

Django는 이전 글에서 언급했듯, python으로 작성된 web application framework이다

(이전 글 (Web 개발의 특징 / Django F/W를 사용해보며 느낀 점): http://ssaemo.tistory.com/124)


<Django의 Abstraction>

다른 프레임워크들도 그렇듯, 웹앱 개발을 엄청나게 추상화되어있어 웹앱 아키텍처의 사전지식이 없어도 쉽게 개발할수 있는 것이 장점이다

하지만 양날의 검인 것이, 웹앱 아키텍처에 대해서 잘 알고있어도 프레임워크 사용에 큰 도움은 되지않는다


<MTV Pattern>

Django는 MTV pattern을 사용한다

MTV는 Model, Template, View인데, 


Model은 db table 생성 및 데이터 처리(CRUD)에 사용된다

Model class가 db table이고 instance가 데이터(db row)이다

table 생성은 migrate를 통해서 이뤄지고, CRUD는 queryset이었나?


Template은 presentation logic을 담당하여 HTML 뼈대(skeleton)를 만드는데에 사용된다

rendering(=data binding)은 view에 의해 이뤄진다

(여담으로 Flask는 jinja2 Template engine을 사용하는데 Django는 자체 템플릿 엔진이 있다)


View는 request를 receive하고 적절히 처리하여 response를 send한다

적절한 처리라는 것은, 특정 template에 model로부터 읽어온 data를 binding(rendering)하는 것이다

VIew의 역할은 request를 처리하는 것이다. template, model과 상호작용하여 HTML은 generate하고 response하는 것,


<routing>

Django는 routing 기능도 포함하고 있다

urls.py에 path를 설정하여 적절한 view에 routing한다


<register>

사용해보진 않았는데, Model class를 admin에 register하면

admin page에서 그 Model을 확인하고 관리할 수 있다


<ORM: Object Relational Mapper>

Django의 QuerySet을 의미하는 듯 하다.

Post라는 Model이 있다고 하자. Post.objects.all() 또는 filter() 등의 메서드들을 호출하면 QuerySet이 리턴된다

그럼 QuerySet은 왜 쓰는걸까? 현재까지의 생각으로는, SQL을 몰라도 DB에 Access할수있다는 것이 QuerySet의 기능이다

SQL을 몰라도 DB에 데이터를 저장하고, 읽을 수 있다

그에 따라, DB 변경이 쉬울 것으로 생각된다 (그럴 일이 있을까?)

SQL도 사용할 수 있다. Model.objects.raw(sql)을 사용해서.

QuerySet을 모를때는 이게 어떻게 동작하는지 파악하기가 어려웠다 (프레임워크의 너무 큰 의존성)

가장 큰 문제는, django database engine에 있는 database만 사용할 수 있다는 것이다

Elasticsearch를 DB처럼 사용하고싶어도, django QuerySet을 통해서는 사용할 수 없다

자유도가 낮다고 말할수도 있겠다

어쨌든 Django의 ORM은 QuerySet(Model에 있는)이고, 장점보다는 단점이 더 크게 느껴졌다 개인적으로.


(또 여담. Flask에서 사용하는 SQLAlchemy ORM도 정의된 engine들 한정이다.

db로 elasticsearch를 사용하고싶어서 찾아봤던건데, elasticsearch-py 자체에 ORM 기능이 있어서 필요없을듯

근데 django는 db 세팅이 강제라서 맘에 안듬. 여윽시 flask가 최고시다)


<tutorial>

# install django

pip install django # 현재 최신버전은 2.0


# create a django project

# django를 설치하면 django-admin 커맨드가 생긴다

django-admin startproject mysite .


# 프로젝트 안에 app을 하나 더 생성하려면 이렇게?

django-admin startapp myapp .


프로젝트를 생성하면 manage.py가 생기는데, 이 파일로 project에 command를 실행할 수 있다

migrate, runserver, test 등.


---


<django INSTALLED_APPS>

# 일부 INSTALLED_APPS는 DB를 사용한다. 그러므로 manage.py migrate를 실행해야한다.

# migrate는 DB table 생성 커맨드이다. # makemigrations는 Model 선언 후, migrate 전 실행

https://docs.djangoproject.com/ko/2.0/intro/tutorial02/

# DocType

https://github.com/sabricot/django-elasticsearch-dsl

# sqlite3 in volatile memory

https://stackoverflow.com/questions/39098008/django-rest-framework-without-database


<django Celery task>

== async task queue(background process)

# CELERY_BEAT_SCHEDULE, crontab

 - crontab(minute=0, hour='*/3') # 3시간마다

 - crontab(minute='*/15') # 15분마다

 - crontab(minute=0, hour=0) # 매일 0시0분



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/