Back-end/Python

[Python]Django App 이란? MTV 패턴이란?

cheersHena 2018. 3. 24. 19:45
반응형

개념 정리.


Django App 이란?


장고에서 사용하는 파이썬 패키지. 

Django App패키지는 그 안에 자신의 model, view, template, URL mapping 등을 독자적으로 가지고 있음.

일반적으로 하나의 Project 안에 여러개의 App으로 구성되어 있고, 여러개의 Django App을 모듈화하여 구성하는데,

모듈화된 App들로 구성하면 재개발 및 유지보수가 용이함.


 Django View 란?

일반 MVC (model-view-controller)개념에서 Controller와 비슷한 열할.

즉, 장고 뷰는 필요한 데이터를 모델에서 가져와 적절히 가공하여 웹페이지에 결과를 출력하도록 컨트롤 하는 역할.

View들은 장고 앱 안의 view.py 파일에 존재하며 각 함수가 하나의 view를 정의.

각 view는 http request를 입력 parameter로 받아들이고, http response를 return.


# Create your views here.
from django.http import HttpResponse

def index(request):
return HttpResponse("Hello, world. You're at the index.")


하나의 view함수 index() : request를 받아들여 HttpResponse 리턴.

여기서는 간단한 html text의 response 객체이지만

실제 장고에서 복잡한 html처리 위해서는 view Template를 사용.


*MTV 패턴.

장고에서는 MVC (model-view-controller)가 아닌 MTV (model-template-view) 패턴을 따른다.

장고는 컨트롤러의 역할을 장고프레임워크에서 자체적으로 해준다고 볼수있는점이 차이점이다.

Model : 데이터 출력, 하나의 model class = 하나의 Table

View: http request를 받아 결과인 response리턴하는 컴포넌트. 모델로부터 데이터를 읽거나 저장, 

템플릿 호출하여 데이타를 UI출력.

Template: HTML 생성 목적으로 하는 컴포넌트. 



Django template.


View가  controller의역할이라면 Template은 View와 비슷한 역할. 

Template는 View로부터 전달된 데이터를 템플릿에 적용하여 동적 웹 페이지 만드는데 사용된다.

Tempalte은 html파일로서 장고 앱 폴더 내의 서브폴더로 존재하며 그 안에 템플릿파일(*.html)을 생성.


대부분의 템플릿은 view로부터 전달받은 데이터를 html템플릿 안에 데이터를 동적으로 치환하여 사용.


1) view에서 함수를 정의한다. 


def index(request)
user = request.user
if user.is_authenticated:
all_images = Image.objects.all().order_by('-created_at')
return render(request, 'feed.html', context={
'images': all_images
})
else:
return render(request, 'login.html')


*render함수: 첫번째 파라미터로 request를, 두번째 파라미터로 템플릿을( feed.html), 세번째는 뷰에서 템플릿으로 전달한 데이터를 Dictionary로 전달. dictionary의 key는 변수명(images), value는 전달데이터내용(all_images)을 담는다.


2) Template에 html문서 작성. 


{% for image in images %}
<div class="photo">
<header class="photo__header">
<img src="{% static 'images/avatar.jpg' %}" class="photo__avatar">
<div class="photo__user">
<span class="photo__username">{{image.created_by.username}}</span>
<span class="photo__location">{{image.location}}</span>
</div>
</header>
{% endfor %}


* 템플릿 변수: {{변수명}} :해당 변수의 값을 그 자리로 치환. 

  템플릿 태그:{% if , for.. %} 탬플릿 태그안에는 조건문 등 다양용도로 사용가능. 


Django Model.


Django에서 Model은 데이타 서비스를 제공하는 Layer이다. 

Django의 Model은 각 app안에 기본적으로 생성되는 models.py 모듈 안에 정의하게 된다.

models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이타베이스에서 하나의 테이블에 해당된다. 

class Image(models.Model):
file = models.FileField(max_length=50,null=True) #사진파일
location = models.CharField(max_length=50,null=True) #위치
caption = models.TextField(null=True) #캡션


클래스 Image는 models.Model의 파생 클래스. 그안의 3개의 변수(속성).

*Primary Key미지정시 자동 PK id생성.


모델변수는 필드정의 위해 클래스변수사용. 필드정의하는 각각의 클래스 변수는 각 필드 타입에 맞는 필드클래스 객체를 생성하여 할당. e.g) FileField(), CharField(), TextField()...

Field 클래스는 여러종류가있는데 생성자 호출 시 필요 옵션 지정 가능. max_length=50,null=True


*Field Type. 참조.


https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types


간단요약.


Field Type설명
CharField제한된 문자열 필드 타입. 최대 길이를 max_length 옵션에 지정해야 한다. 문자열의 특별한 용도에 따라 CharField의 파생클래스로서, 이메일 주소를 체크를 하는 EmailField, IP 주소를 체크를 하는 GenericIPAddressField, 콤마로 정수를 분리한 CommaSeparatedIntegerField, 특정 폴더의 파일 패스를 표현하는 FilePathField, URL을 표현하는 URLField 등이 있다.
TextField대용량 문자열을 갖는 필드
IntegerField32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 을 사용할 수도 있다.
BooleanFieldtrue/false 필드. Null 을 허용하기 위해서는 NullBooleanField를 사용한다.
DateTimeField날짜와 시간을 갖는 필드. 날짜만 가질 경우는 DateField, 시간만 가질 경우는 TimeField를 사용한다.
DecimalField소숫점을 갖는 decimal 필드
BinaryField바이너리 데이타를 저장하는 필드
FileField파일 업로드 필드
ImageFieldFileField의 파생클래스로서 이미지 파일인지 체크한다.


위와 같은 필드 타입 클래스 이외에, Django 프레임워크는 테이블 간 혹은 필드 간 관계(Relationship)을 표현하기 위해 ForeignKey, ManyToManyField, OneToOneField 클래스를 또한 제공하고 있다. 특히 ForeignKey는 모델 클래스간 (혹은 Underlying 테이블 간) Many-To-One (혹은 One-To-Many) 관계를 표현하기 위해 흔히 사용된다.


Field Options.

자주사용되는 옵션 요약.

Field Option

설명
null (Field.null)null=True 이면, Empty 값을 DB에 NULL로 저장한다. DB에서 Null이 허용된다. 
예: models.IntegerField(null=True)
blank (Field.blank)blank=False 이면, 필드가 Required 필드이다. blank=True 이면, Optional 필드이다. 
예: models.DateTimeField(blank=True)
primary_key (Field.primary_key)해당 필드가 Primary Key임을 표시한다. 
예: models.CharField(max_length=10, primary_key=True)
unique (Field.unique)해당 필드가 테이블에서 Unique함을 표시한다. 해당 컬럼에 대해 Unique Index를 생성한다. 예: models.IntegerField(unique=True)
default (Field.default)필드의 디폴트값을 지정한다. 
예: models.CharField(max_length=2, default="WA")
db_column (Field.db_column)컬럼명은 디폴트로 필드명을 사용하는데, 만약 다르게 쓸 경우 지정한다.


반응형