본문 바로가기
TIL - 프로그래밍/개념, 설정

[Python] Django 1

by chaemj97 2022. 3. 14.
728x90
  • Django : Python Web framework
    • 대규모 서비스에도 안정적이며 오랫동안 세계적인 기업들에 의해 사용됨
    • MTV Pattern
  • Web framework
    • 웹 페이지를 개발하는 과정에서 겪는 어려움을 줄이는 것이 주 목적으로 데이터베이스 연동, 템플릿 형태의 표준, 세션관리, 코드 재사용 등의 기능을 포함
  • MTV Pattern
    • Model : 응용프로그램의 데이터 구조를 정의하고 데이터베이스의 기록을 관리
    • Template : 파일의 구조나 레이아웃을 정의, 실제 내용을 보여주는데 사용
    • View : HTTP 요청을 수신하고 HTTP 응답을 반환, Model을 통해 요청을 충족시키는데 필요한 데이터에 접근, template에게 응답의 서식 설정을 맡김


# Django 설치
pip install django==3.2.12
# 프로젝트 생성
django-admin startproject 프로젝트명 .
# Django 서버 활성화 (메인 페이지 로켓 확인)
python manage.py runserver
  • project (앱의 집합) 구조
    • __init__.py : Python에게 이 디렉토리를 하나의 Python패키지로 다루도록 지시
    • asgi.py : Django 애플리케이션이 비동기식 웹 서버와 연결 및 소통하는 것을 도움 (Asynchronous Server Gateway Interface)
    • settings.py : 애플리케이션의 모든 설정을 포함
    • urls.py : 사이트의 url과 적절한 views의 연결을 지정
    • wsgi.py : Django 애플리케이션이 웹 서버와 연결 및 소통하는 것을 도움 (Web Server Gateway Interface)
    • manage.py : Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인 유틸리티

 

# Application 생성
python manage.py startapp 앱이름
  • Application (실제 요청을 처리하고 페이지를 보여주고 하는 등의 역할을 담당) 구조
    • admin.py : 관리자용 페이지를 설정 하는 곳
    • apps.py : 앱의 정보가 작성된 곳
    • models.py : 앱에서 사용하는 Model을 정의하는 곳
    • tests.py : 프로젝트의 테스트 코드를 작성하는 곳
    • views.py : view 함수들이 정의 되는 곳

 

# 앱 등록 (반드시 생성 후 등록!!!!!)
# settings.py
INSTALLED_APPS = [
	# Local apps
	...
    '앱이름',
    ...
    # Third party apps
    ...
    # Django apps
    ...
]

  • 요청과 응답 ( 코드 작성 순서!!)
# urls.py
# HTTP 요청(request)을 알맞은 view로 전달

from django.contrib import admin
from django.urls import path
from 앱이름 import views

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

 

# views.py
# HTTP 요청을 수신하고 HTTP 응답을 반환하는 함수 작성
# Model을 통해 요청에 맞는 필요 데이터에 접근
# Template에게 HTTP 응답 서식을 맡김

from django.shortcuts import render

def index(request):
	return render(request,'index.html')

 

# 앱이름/templates/index.html
# 실제 내용을 보여주는데 사용되는 파일

<h1>이것을 보여주세요.</h1>

  • DTL : Django Template Language
    • Django template에서 사용하는 built-in template system
    • 프레젠테이션을 포현하기 위한 것
# render()를 사용하여 views.py에서 정의한 변수를 templates 파일로 넘겨 사용하는 것
{{ variable }}

# 표시할 변수를 수정할 때 사용(60개)
{{ variable|filter }} 
# 모두 소문자로 출력 
{{ name|lower }}

# 출력 테스트를 만들거나, 반복 또는 논리를 수행하여 제어 흐름을 만드는 등 변수보다 복잡한 일들을 수행(24개)
{% tag %}
# if(일부는 시작, 종료 태그 필요)
{% if %}{% endif %}

# 주석을 표현하기 위해 사용
{# #}
{% comment %} 여기에 주석 적기 {% endcomment %}

  • Template inheritance (템플릿 상속)
    • 기본적으로 코드의 재사용성에 초점
# settings.py
# 템플릿 추가 경로 설정
TEMPLATE = [
		...
    	'DIRS' : [BASE_DIR / 'templates'],
        ...
]

 

# 부모 템플릿에 body에 작성
{% block 이름 %}
{% endblock %}

 

# 자식템플릿이 부모템플릿을 확장한다는 것을 알림 (반드시 최상단에 작성)
{% extends '부모.html' %}

# 하위 템플릿에서 재지정(overridden)할 수 있는 블록 정의
{% block 이름 %}
여기에 내용 작성하세요!!!!
{% endblock %}

 

# 텤플릿 내에 다른 템플릿을 포함하는 방법
{% include '포함하고싶은 템플릿.html' %}

  • HTML 'form' element
    • 웹에서 사용자 정보를 입렵하는 여러 방식을 제공하고, 사용자로부터 할당된 데이터를 서버로 전송하는 역할을 담당
    • 핵심 속성
      • action : 입력 데이터가 전송될 URL 지정
      • method : 입력 데이터 전달 방식 지정
    • label을 input 요소와 연결 (input에 id = label의 for 속성)
    • id 속성 : 전체 문서에서 고유해야 하는 식별자를 정의 (중복 X)
  • HTTP : HyperText Transfer Protocol
    • 웹에서 이루어지는 모든 데이터 교환의 기초
  • HTTP request method - "GET"
    • 서버로부터 정보를 조회하는 데 사용
    • 데이터를 가져올 때만 사용
# urls.py
urlpatterns = [
	...
    paht('throw/', views.throw),
    path('catch/', views.catch),
]

# views.py
def throw(request):
	return render(request, 'throw.html')
    
def catch(request):
	message = request.GET.get('message')
	context = {
    	'message' : message,
    }
    return render(requese, 'catch.html', context)
    
# 앱/templates/throw.html
{% extends 'base.html' %}
{% block content %}
	<form action="#" method="#">
    	<label for="message">Throw</label>
        <input type="text" id="message" name="message">
    </form>
{% endblock %}    

# 앱/templates/catch.html
{% extends 'base.html' %}
{% block content %}
	{{ message }}를 받았습니다.
{% endblock %}

  • Variable Routing
    • URL 주소를 변수로 사용하는 것
# 예시
paht('hello/<str:name>/', views.hello)
  • App URL mapping
    • app의 view함수가 많아지면서 사용하는 path() 또한 많아지고, app 또한 더 많이 작성되기 때문에 프로젝트의 urls.py에서 모두 관리하는 것은 프로젝트 유지보수에 좋지 않음
    • 각 app에 urls.py를 작성
# 프로젝트/urls.py

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

urlpatterns = [
	path('admin/', admin.site.urls),
    paht('앱이름/', include('앱이름.urls')),
]

  • Naming URL patterns
    • 링크에 url을 직접 작성하는 것이 아니라 path() 함수의 name 인자를 정의해서 사용
    • url 설정에 정의된 특정한 경로들의 의존성을 제거할 수 있음
# 예시
path('index/', views.index, name='index'),

 

<a href="{% url 'index' %}">메인</a>
# 주어진 URL 패턴 이름 및 선택적 매개 변수와 일치하는 절대 경로 주소를 반환

 

728x90
반응형

댓글