본문 바로가기
IT/django

장고 개념잡기

by 골든크랩 2021. 11. 4.
728x90
반응형

장고개발 가상환경 활성화

source djangotest/bin/activate

출처: https://joycecoder.tistory.com/84 [SongLee, 개발, IT, 맛집, 여행, Etc..]

 

[EC2] Ubuntu 서버 Django 설치

우선 개발환경 구축을 완료하였으니 이후 주식 정보 수집 및 보여줄 수 있는 웹 서버 설치를 시작한다. 웹 서버뿐만 아니라 ML을 도입하기 위해 Python 기반으로 한 Framework 를 사용하기로 했다. Pyth

joycecoder.tistory.com

 

 

파이썬 라이브러리 : pypi.org

 

python --version

 

- pip install 라이브러리명

예) pip install django

 

- pip unistall 라이브러리명

 

- pip show 라이브러리명

예) pip show pandas

pip show django

 

- pip list

 

-장고 버전 확인법

django -admin --version

pip show django

pip show django

 

Django MTV 퍠턴

MTV(Model Template View) 패턴

1) Model : 테이블을 정의한다

2) Template : 사용자가 보게 될 화면의 모습을 정의한다.

3) View : 애플리케이션의 제어 흐름 및 처리 로직을 정의한다.

 

모델은 model.py 파일에, 템플릿은 tempaltes 디렉토리의 하위의 *.html 파일에,

뷰는 views.py 파일에 작성하도록 처음부터 뼈대를 만들어 준다.

 

startproject 및 startapp 명령을 실행하면 자동으로 뼈대를 만들어준다.

- 프로젝트 안에 앱을 여러개 만들수 있다.

 

예) django-admin startproject mysite ===> 이런식으로 하면 mysite 아래 다시 mysite 가 생긴다.  그래서 마지막에 '.' 을 추가하는 방식을권장한다. 단, 프로젝트 디렉토리를 이미 만들어서 그안에서 프로젝트를 만들때만.....

예) django-admin startproject mydjango .



 

생성된 파일

manage.py : 웹사이트 관리를 도와주는 역할을 하는 파일

settings.py :웹사이트 설정이 있는 파일

urls.py : urlresolver가 사용하는 요청 패턴(URL 규칙) 목록을 포함하고 있는 파일

wsgi.py : Web Server Gateway Interface 이며 Python의 표준 Gateway Interface 입니다.

asgi.py :  Asynchronous Server Gateway Interface. WSGI 와 비슷한 구조를 가지며, 비동기 통신을 지원한다.

 

 

 

# settings.py 수정

import os

 

LANGUAGE_CODE = 'ko'  ==> 한글로 출력되도록 변경

TIME_ZONE = 'Asia/Seoul'

 

STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL)

 

# 데이터베이스 생성 (파일 db 생성됨)

python manage.py migrate  (admin, auth, contenttypes, sessions 테이블 생성)

db.sqlite3 파일이 생성됨

settings.py 의 DATABASE 항목을 보면...아럐와 같은것을 확인할 수 있다.

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': BASE_DIR / 'db.sqlite3',   => 전체경로

   }

}

 

# 웹서버 실행

1. python3 manage.py runserver 0.0.0.0:8000
2. python manage.py runserver

 

 

# Superuser 계정 생성

python manage.py createsuperuser (계정 생성, user 테이블에 계정이 생성됨)

python manage.py runserver (웹서버 구동)

localhost:8080/admin (접속)

 

# 앱 만들기 순서

1. 모델을 제일 먼저 만든다.(모델 클래스를 먼저 만들고, DB에 테이블은 명령어를 통해서 진행)

2. View 만든다.

3.  URL 라우팅 만든다.

4. 화면 만든다.

 

#Django Model

1. ORM(Object Relational Mapping) 을 이용한다.

2. 파이썬 클래스와 데이터베이스 테이블을 맵핑한다.

- Model : DB 테이블과 매핑

- Model Instance : DB 테이블의 1 Row

 

#DJango Model FieldType 아래 URL에서 지원하는 모델타입들을 확인할 수 있다.

https://brunch.co.kr/@ddangdol/4

 

# Relation타입은 아래 글을 참고 해라. (검색해봐라)

웹프로그래밍/Django

[Django] 관계를 표현하는 모델 필드, ForeignKey,OneToOneField,ManyToManyField

사용자 ssung.k 2019. 7. 20. 16:16

model 을 설계하는데 있어서 관계는 뺴놓을 수 없는 중요한 개념입니다. 각 모델 간에 여러 관계를 정의함으로서 많은 걸을 구현 할 수 있게 됩니다. 관계는 총 3가지가 있으며 이번에는 바로 그 관계에 대해서 알아보도록 하겠습니다.

 

 

# 앱디렉토리 만들기

python manage.py startapp blog

 

# 앱이름추가

settings.py 에 추가

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'blog',

]

 

#blog앱 (Post) Model  만들기..아래 속성들을 models.py 에 작성하면 됨.

title

text

author

created_date

published_date

 

=====================================models.py ====================================

from django.db import models

from django.utils import timezone

 

# Create your models here.

class Post(models.Model):

    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)

    title = models.CharField(max_length=200)

    text = models.TextField()

    created_date = models.DateTimeField(default=timezone.now)

 

    #비어있는것도 허용, null 도 허용하겠다.

    published_date = models.DateTimeField(blank=True, null=True)

 

    def published(self):

        self.published_date = timezone.now()

 

        #table에 저장

        self.save()

 

    def __str__(self):

        return self.title

==========================================================================

 

# DB에 테이블 만들기

1) 마이그레이션 파일 생성하기(파이썬 파일로, 일종의 테이블 생성 스크립트 비슷한 파일이다)

python manage.py makemigrations blog

 

실행결과

Migrations for 'blog':

    blog/mirations/0001_initial.py  ==> 이 파일이 생성됨

    - Create model Post 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

class Migration(migrations.Migration):

 

    initial = True

 

    dependencies = [

        migrations.swappable_dependency(settings.AUTH_USER_MODEL),

    ]

 

    operations = [

        migrations.CreateModel(

             name='Post',

             fields=[

                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

                 ('title', models.CharField(max_length=200)),

                 ('text', models.TextField()),

                 ('created_date', models.DateTimeField(default=django.utils.timezone.now)),

                 ('published_date', models.DateTimeField(blank=True, null=True)),

                 ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,    to=settings.AUTH_USER_MODEL)),

         ],

    ),

]

---------------------------------------------------------------------------------------------------------------------------------------------------------

 

2) 실제 데이터베이스에 Model 추가를 반영하기

python manage.py migrate blog

python manage.py runserver

 

****중요....관리자 페이지에서 만든 모델을 보기 위해서는 Post 모델을 등록하는 절차가 필요하다.

아래 내용을 입력하고, admin 페이지를 refresh 하라

-------------------------------------------------------admin.py-----------------------------------------------------------------------------------

from django.contrib import admin

 

# Register your models here.

from django.contrib import admin

from .models import Post

 

admin.site.register(Post)

---------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 마이그레이션 적용현황

python manage.py showmigrations blog

 

# 지정 마이그레이션의 SQL 내역

python manage.py sqlmigrate <app-name> <migration-name>

 

# 마이그레이션 파일은 일종의 작업 지시서...db생성 스크립트 같은것이다.

python manage.py migrate <app-name> 

---> 미적용 <마이그레이션 파일> 부터 <최근 마이그레이션 파일> 까지 "Forward 마이그레이션"이 순차적으로 수행된다.

 

python manage.py migrate <app-name> <마이그레이션 파일명>

---> <지정된 마이그레이션 파일> 이 <현재 적용된 마이그레이션> 보다 이후이면, "Forward 마이그레이션" 이 순차적으로 수행

---> 이전이면 "Backward 마이그레이션" 이 순찾적으로 수행 (롤백)

 

# 적용된 실제 sql 구문을 확인하려면...

python manage.py sqlmigrate <app-name> <숫자(마이그레이션파일>

 

# 필수 입력 필드를 추가

- 기존 모델 클래스에 필수 필드를 추가하여 makemigrations 수행

- 필수 입력 필드를 추가하므로, 기존 Row들에 필드를 추가할 때, 어떤 값으로 채워 넣을 지 묻는다.

  선택1) 지금 값을 입력

  선택2) 모델 클래스를 수정하여 디폴트 값을 제공

 

#Django URLConf(configuration)란?

1) 프로젝트/settings.py 에 최상위 URLConf 모듈을 지정

- URLConf는 장고에서 URL과 일치하는 view 를 찾기 위한 패턴들의 집합이다.

- 특정 URL 과 View 맵핑 List

- Django 서버로 Http 요청이 들어올 때마다, URLConf 매핑 List를 처음부터 끝까지 순차적으로 찾으며 검색

 

사용법)

1. 각 app 마다 urls.py 파일을 만든다.

예) blog.urls.py 파일에

from django.urls import path

from . import views

 

urlpatterns = [

path('', views.post_list, name='post_list'),

]

 

2. 프로젝트의 urls.py 파일에서 각 app 의 urls.py 파일을 보도록 한다.

예) 프로젝트안의 urls.py 파일에 아래 추가

urlpatterns = [

path('admin/', admin.site.urls),

path('', include('blog.urls')),

]

 

# View

- View 는 애플리케이션의 "로직"을 포함하며 모델에서 필요한 정보를 받아 와서 템플릿에 전달하는 역할을 한다.

- View 는 Model과 Template을 연결하는 역할을 한다.

- URLConf 에 매핑된 Callable Object

  ==> 첫번째 인자로 HttpRequest 인스턴스를 받는다.

  ==> 반드시 HttpResponse 인스턴스를 리턴 해야 한다.

 

예제)

-----------------------------------------------------blog.views.py--------------------------------------------------------------------------------

from django.shortcuts import render

from django.http import HttpResponse

 

# Create your views here.

def post_list(request):

    myname = '장고'

    return HttpResponse('''<h1>Hello {name}</h1>

        <p>Http Method {method}</p>'''.format(name=myname, method=request.method))

 

참고)  문자열 앞에 'f' 를 붙이면 변수를 직접 써도 된다.

    return HttpResponse(f'''<h1>Hello {myname}</h1>

        <p>Http Method : {request.method}</p>'''))

 

# Template 의 역할

- Template 은 정보를 일정한 형태로 표시하기 위해 재사용 가능한 파일을 말함

- Django 의 template 양식은 HTML 을 사용한다.

- 템플릿은 blog/templates/blog 디렉토리에 저장한다. 여기서 보면 blog 가 두번 나온다.  이유는????

   프로젝트 안에 여러앱이 있을때, django는 template을 한번에 다 읽어 들이는데....이때 각 template 들을 구분할 방법이 필요하다.  그래서, templates 하위 디렉토리에 app 이름에 해당하는 디렉토리를 하나 더 만든다.

 

 

-----------------------------------------------------blog.views.py--------------------------------------------------------------------------------

from django.shortcuts import render

from django.http import HttpResponse

 

# Create your views here. 기본형태로, 실제로는 이렇게 사용하지 않음

# def post_list(request):

# myname = '장고'

# return HttpResponse('''<h1>Hello {name}</h1>

# <p>Http Method {method}</p>'''.format(name=myname, method=request.method))

 

def post_list(request):

    return render(request, 'blog/post_list.html') # 여기서 경로는 templates 디렉토리 아래부터시작하는 경로다.

 

 

# QuerySet 이란?

- 쿼리셋은 DB로부터 데이터를 읽고, 필터링을 하거나, 정렬을 할 수 있다.

- 쿼리셋을 사용하기 위해 먼저 python sheel 을 실행한다.

 

python manage.py shell

 

# Template에서 동적 데이터 사용하기

- 변수의 값을 사용하려면 중괄호를 사용

- {% for %} 와 {% endfor } 사이에서 목록의 모든 객체를 반복하여 출력

 

# Template Engine

- Django 기본 지원 템플릿 엔진

- Syntax

   가) 상속 (공통으로 사용하는것을 상속받음 됨)

      {% extends "base.html" %}

 

1) Variables

- {{ 변수명 }}

- {{ mydict.key }} : dict의 key 에 attr처럼 접근

- {{ myobj.attr }}

- {{ myobj.func }} : 함수 호출도 attr 처럼 접근.  인자 있는 함수 호출 불가

- {{ mylist.0 }} : 인덱스 접근도 attr 처럼 접근

 

2) Template Tag

- {% %} 1개 쓰이기도 하며, 2개 이상이 조합되기도 함

- 빌트인 Tag 가 지원되며, 장고앱 별로 커스텀 Tag 추가 기능

 

3) block tag

- 템플릿 상속에서 사용

- 자식 템플릿이 오버라이딩 할 block 영역을 정의

- 자식 템플릿이 부모가 정의한 block 에 한해서 재 정의만 가능. 그 외는 모두 무시됨

    {% block block-name %}

        block 내에 내용을 쓸 수 있다.

    {% endblock %}

 

4) Comment tag : 템플릿 주석

    {% comment "Optional note" %}

       이 부분은 렌더링 되지 않음

    {% endcomment %}

---예제)

<!-- HTML 주석..페이지 소스보기 하면 나옴 -->

 

{% comment "django 주석..페이지 소스보기해도 안나옴 " %}

{% endcomment %}

 

 

 

# Django Templates Tag Documentation

https://docs.djangoproject.com/en/3.0/ref/templates/builtins/ 

 

Built-in template tags and filters | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

# CSS 적용하기

- static 디렉토리안에 css 디렉토리를 만들고 blog.css 라는 파일을 작성.

- 반드시 장고를 재기동해야함.

예제)

css파일

---------

h1 a {

color: #FCA205;

font-family: 'Lobster';

}

body {padding-left: 15px;}

 

html파일

--------------

{% load static %}   <==============  이 문장이 반드시 들어가야 함

<html>

<head>

<title> Hello Myblog </title>

<link rel="stylesheet" href="{% static 'css/blog.css' %}">

</head>

 

#bootstrap

https://getbootstrap.com 

 

Bootstrap

The most popular HTML, CSS, and JS library in the world.

getbootstrap.com

 

적용법:

{% load static %}
<html>
<head>
<title> Hello Myblog </title>
---> 아래 3줄이 적용한거임....tistory 글자 색상이 안변해서...그냥 글로 씀 <-------------------------------------------
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" type="text/css">
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<link rel="stylesheet" href="{% static 'css/blog.css' %}">
</head>
<body>
 

ㅇㄹㅇㄴ

 

#템플릿 상속하기

1) 기본 템플릿 html 생성하기

- 기본 템플릿은 웹사이트 내 모든 페이지에 확장되어 사용된느 가장 기본적인 템플릿이다.

- blog/templates/blog/에 base.html 파일을 생성한다.

- post_list.html에 있는 모든 내용을 base.html에 아래 내용을 복사해 붙여 넣는다.

 

예제)

 

 

 

 

 

 

 

 

#Django Form

1) Form이란?

- JAVA 의 경우 DB 연결 Form과 화면 Form 을 공유해서 쓰는 경우도 있는데, Django 는 명확히 구분됨.

- Model 클래스와 유사하게 Form 클래스를 정의

- 주요 역할 : 커스텀 Form 클래스를 통해

*입력 폼 HTML 생성: 다음 방식을 기본 제공

    .as_table() : Table 형태로 Form 을 만듬

    .as_p() : --추가 주석 달것 

    .as_ul() : --추가 주석 달것

*입력 폼 값 검증(validation) 및 값 변환이 가능함

 

2) Form 처리: HTTP Method에 따라

-폼 처리 시에 같은 URL(즉 같은 뷰)에서 GET/POST 로 나눠 처리

-GET방식으로 요청: 입력 폼만을 보여준다.

-POST방식으로 요청: 데이터를 입력 받아 유효성 검증 과정을 거칩니다.

   => 검증 성공 시: 해당 데이터를 저장하고 SUCCESS URL로 이동

  => 검증 실패 시: 오류 메시지와 함께 입력 폼을 다시 보여준다.

 

#Middleware

1) settings.py 파일의

MIDDLEWARE 부분에 등록되어 있음.

아래 아키텍쳐 이미지를 이해하고, 잘 기억하는게 좋을 것 같다.

 

 

 

위 그림은 블로그.lostcatbox.com/2019/11/15/django03/ 에서 캡쳐함

 

 

#Django ModelForm

- Model Form이란....지정된 Model로부터 필드 정보를 읽어 들여, form fields 를 세팅한다.

- 클래스 생성시...ModelForm 을 상속받는다.

- Inner Class 형태로 Meta 클래스 생성

- model 이란 변수에 Model 클래스를 복사해주고, fields 라는 변수에 전체 필드나 읽어올 특정 필드들만 지정한다.

- 내부적으로 model instance 를 유지

- 유효성 검증에 통과한 값들로, 지정 model instance 로의 저장(save)을 지원(Create or Update)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d

 

 

 

 

 

 

 

728x90
반응형

댓글