django 개념

16124 단어 djangodjango

Django는 파이썬으로 구성된 인기 많고 완벽한 기능을 갖춘 서버-사이드 웹 프레임워크이다. 쉽고 빠르게 웹사이트를 개발할 수 있도록 돕는 구성요소로 이루어져있다.

웹사이트를 구축할 때 항상 비슷한 유형의 요소들이 필요하게 된다.
예를들어 회원가입, 로그인, 로그아웃 과 같이 사용자 인증을 다루는 방법이나 웹사이트의 관리자 패널, 폼, 파일 업로드등과 같은 것들이 있다.

장고는 이러한 비슷한 유형의 요소들이 이미 만들어놓은 프레임워크다.

MTV Pattern

장고는 기존의 MVC 패턴이 아닌, MTV 패턴을 사용하고 있다.

1. model

  • 응용 프로그램의 데이터 구조를 정의하고 데이터베이스의 기록을 관리(추가, 수정, 삭제)

2. template

  • 파일의 구조나 레이아웃을 정의
  • 실제 내용을 보여주는 데 사용(prentation)

3. view

  • HTTP 요청을 수신하고 HTTP 응답을 반환
  • Model을 통해 요청을 충족시키는데 필요한 데이터에 접근
  • 템플릿에게 응답의 서식 설정을 맡김

.py 3대장

  • urls.py : 주소관리
  • views.py: 페이지 관리(페이지 하나 당, 하나의 함수)
  • models.py: 데이터베이스 관리

요청과 응답

urls.py

  • 장고 서버로 요청이 들어오면 그 요청이 어디로 가야하는지 인식하고 관련 함수(view)로 넘겨준다.
  • views.py에서 만든 함수를 연결시켜준다.
from firstapp. import views

	urlpatterns = [
    	path('admin/', admin.site.urls),
        path('index/' views.index),
   ]
   

views.py

  • HTTP요청을 수신하고 HTTP 응답을 반환하는 함수 작성한다.
  • Model을 통해 요청에 맞는 필요 데이터에 접근한다.
def index(request):
	return render(request, 'index.html')

templates

  • views.py에서 지정한 index.html 파일을 만들어야한다.
  • Django에서 template라고 부르는 HTML 파일은 기본적으로 app 폴더 안에 templates 폴더 안에 위치한다.

Syntax

DTL Syntax

  1. Variable
    {{ variable }}
  2. Filters
    {{ variable | filter }}
  3. Tags
    {% tag %} ~ {% endtag %}

Template inheritance

  • 코드를 재사용성을 위해서 기본적으로 템플릿을 상속할 수 있다.
  • 템플릿 사속을 사용하면 사이트의 모든 공통 요소를 포함하고, 하위 템플릿이 재정의 할 수 있는 블록 정의하는 템플릿을 만들어야한다.
# settings.py

TEMPLATES = [
    {
        ...,
        'DIRS': [BASE_DIR / 'app_name' / 'templates'],
...
]

extands tag

  • 하위 템플릿이 부모 템플릿을 확장한다는 것을 알린다.
  • 반드시 템플릿 최상단에 위치해야한다.
    - 두개 이상은 사용 못한다.

block tag

  • 하위 템플릿에서 재지정할 수 있는 블록을 정의한다.
  • 가독성을 높이기 위해 선택적으로 endblock 태그에 이름을 지정한다.
{% block content %}
{% endblock content %}

urls

Variable routing

동적 라우팅 : 주소 자체를 변수처럼 사용해서 동적으로 주소를 만드는 것

urlpatterns = [
	...,
    path('hello/<name>/', views.hello),
    path('hello/<str:name>/, views.hello), <= 여기가 포인트
]
def hello(request, name): <= 여기서 name을 받아온다.
	context = {
    	'name': name,
    }
    return render(request, 'hello.html', context)

App URL mapping

하나의 프로젝트의 여러 앱이 존재한다면, 각 앱 안에 urls.py을 만들고 프로젝트 urls.py에서 각 앱의 urls.py파일로 URL 매핑을 위탁!!

두번째 app 생성 및 등록

$ python manage.py startapp secondapp
INSTALLED_APPS = [
	'firstapp',
    'secondapp',
    ...,
# firstapp/urls.py

from django.urls import path
from . import views 


urlpatterns = [
    path('index/', views.index),
    path('greeting/', views.greeting),
    path('hello/<str:name>/', views.hello),
]

두번째 앱 urls.py에 원하는 urls를 입력하면 된다.

# secondapp/urls.py

from django.urls import path

urlpatterns = [

]

장고는 명시적인 상대경로(from .module import something)을 권장한다.

Including other URL confs

include를 사용해서 앱이 다를 경우 그 앱으로 링크를 보내주는 방법.

# firstpjt/urls.py

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('firstapp/', include('articles.urls')),
    path('secondapp/', include('secondapp.urls')),
]
  • include()
    - 다른 URLconf들을 참조할 수 있도록 돕는다.
    • 함수 include()를 만나면 그 시점까지 일치하는 url을 잘라내고 남은 문자열 부분을 include된 링크로 전달해 찾는다.

Naming URL Patterns

장고는 url에 이름을 지정할 수 있어서, 뷰함수나 템플릿에서 주소를 쉽게 참조할 수 있도록 한다.
urlpatterns = [
    path('index/', views.index, name='index'),
    path('greeting/', views.greeting, name='greeting'),
    path('hello/<str:name>/', views.hello, name='hello'),

위와 같이 path 함수 끝에 name 어트리뷰트를 붙여서 사용한다. 이는 url tag에서 사용 가능하다.
{% url '' %}

  • 주어진 url 패턴 이름으로 경로 주소를 간다.
  • 템플릿 코드에 url을 하드코딩 하지 않고 사용이 가능하다.
<!-- index.html -->

{% extends 'base.html' %}

{% block content %}
  <h1>만나서 반가워요!</h1>
  <a href="{% url 'greeting' %}">greeting</a>
{% endblock %}

Namespace

개체를 구분할 수 있는 범위를 나타낸다.

만약 앱이 두 개라면?
문제점 발생

  1. 첫번째 app index 페이지에서 두번째 앱 index로 이동하여 하이퍼 링크 클릭하면 현재 페이지로 이동
  2. 두번째 app index url로 이동해도 첫번째 app index 페이지 출력

URL namespace

app_name 작성

  • URL namespace를 사용하면 서로 다른 앱에서 동일한 URL 이름을 사용하는 경우에도 이름이 지정된 URL을 고유하게 사용할 수 있다.
  • urls.py에 app_name을 작성한다.
  • 접근할땐?
    - app_name이 firstapp이고 url name이 index이면 firstapp:index
# secondapp/urls.py

app_name = 'secondapp'
urlpatterns = [
    path('index/', views.index, name='index'),
]
# firstapp/urls.py

app_name = 'firstapp'
urlpatterns = [
    ...,
]

Template namespace

  • Django는 기본적으로 app_name/tempates/경로에 있는 templates 파일들만 찾을 수 있고, INSTALLED_APPS에 작성한 app 순서로 템플릿들을 검색하고 렌더링한다.
  • 임의로 templates의 폴더 구조를 app_name/templates/app_name형태로 변경해서 namespace 공간을 생성하고 추가로 경로를 작성하면 된다.
# firstapp/views.py

return render(request, 'firstapp/index.html')
# secondapp/views.py

return render(request, 'secondapp/index.html')

좋은 웹페이지 즐겨찾기