728x90

 

 

**Django

  • 파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션 프레임워크
  • 설치
    • $pip install django
  •  Urlresolver
    • ->일치하는 패턴의 경우 요청을 연관된 함수(view)에 넘긴다.
    • 웹 서버에 요청이 오면 장고로 전달되고, 장고가 웹 페이지의 주소를 가져와 무엇을 할지 확인
    • 각 URL에 대해 일일이 확인하기는 비효율적이므로, 패턴으로 일치여부를 판단

 

- MVC vs MTV

-MVC

Model View Controller

 

  • 애플리케이션을 세가지의 역할로 구분한 개발 방법론

  1. 사용자가 웹사이트에 접속한다. (Uses)

  2. Controller는 사용자가 요청한 웹페이지를 서비스하기 위해 모델을 호출한다. (Manipulates)

  3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.

  4. Controller는 Model이 리턴한 결과를 View에 반영한다. (Updates)

  5. 데이터가 반영된 View는 사용자에게 보여진다. (Sees)

 

 

-MTV

  • Model Template VIew
  • Model : 안전하게 데이터를 저장
  • View : 데이터를 유저에게 보여줌(MVC와는 다름), URL을 Parsing
  • Template: 사용자 입력과 같은 이벤트 처리를 하고, Model, View 업데이트

 

-Django cycle

-MTV 코딩 순서

  1. 프로젝트 생성
    • 프로젝트 및 앱 개발에 필요한 디렉토리와 파일 생성
  2. 모델 생성
    • 테이블 관련 내용 개발 (models.py, admin.py)
  3. URI conf생성
    • URL 및 뷰 매핑 관계를 정의 (urls.py)
  4.  View 생성
    • 애플리케이션 로직 개발 (views.py)
  5. Template 생성
    • 화면 UI 개발 (templates/ 디렉토리 하위의 *.html 파일)

 

 

 

# setting.py

  • 데이터베이스 설정

    • Default로 Sqlite3 사용

  • 템플릿 항목 설정

    • TEMPALTES 항목 지정

  • 정적 파일 항목 설정

    • STATIC_URL 등 관련 항목 지정

  • 애플리케이션 등록

    • 프로젝트에 포함되는 모든 애플리케이션 등록

  • 타임존 지정

    • UTC 변경 (한국)

 

 

# models.py

  •  테이블을 정의하는 파일

  • ORM(Object Relation Mapping) 사용

    • 테이블을 클래스로 매핑하여 CRUD 기능을 클래스 객체에 대해 수행 -> DB 반영

  • 테이블을 클래스, 테이블의 컬럼은 클래스 변수로 매핑

    • django.db.models.Model 클래스 상속

  • models.py에서 DB 변경 사항 발생시, 실제 DB에서도 반영

    • ex)makemigrations, migrate 사용

    • django 1.7부터 마이그레이션 기능 사용

 

 

# URLconf 주요사항

  • URL과 VIew(함수 또는 메소드)를 매핑하는 urls.py 파일

  • 프로젝트 URL과 앱 URL로 구성하는 것 추천

  • {% url %} 템플릿 태그 사용

 

#views.py

  • 뷰 로직을 생성하는 파일

  • 함수(Function-based view) 또는 클래스(Class-based view)로 생성 가능

 

 

#templates

  • 웹 화면(페이지) 별로 템플릿 파일(*.html)이 필요

  • TEMPLATES 설정의 DIR 항목에 지정된 디렉토리에 앱 템플릿 파일 저장

    • ex) templates/ 디렉토리

 

#Admin

  • 테이블 내용을 열람하고 수정하는 기능을 제공하는 사이트

  • User 및 Group 테이블 관리

    • setting.py에 django.contrib.auth 애플리케이션이 등록

  • 사용자가 비즈니스 로직 개발에 필요한 테이블 관리(CRUD)

 

#개발용 웹 서버

  • 테스트용 runserver 제공

  • 상용화를 위해서는 Apache or Nginx 등의 상용 서버로 변경

 

 

 

$conda create --name myweb

$conda activate myweb

$conda list

$conda install django

 

 

 

--애플리케이션 설계

 

**로직 설계

**URL 설계

**작업/코딩 순서

$django-admin

$django-admin startproject mybookmark

$cd mybookmark

$python manage.py migrate

 

 

#setting.py

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

TEMPLATES = [
     {
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
         'DIRS': [os.path.join(BASE_DIR, 'templates')],
         'APP_DIRS': True,
         'OPTIONS': {
             'context_processors': [
                 'django.template.context_processors.debug',
                 'django.template.context_processors.request',
                 'django.contrib.auth.context_processors.auth',
                 'django.contrib.messages.context_processors.messages',
             ],
         },
     },
 ]
 
 LANGUAGE_CODE = 'ko-kr'
 
 TIME_ZONE = 'Asia/Seoul'
 
 USE_I18N = True
 
 USE_L10N = True
 
 USE_TZ = True

 

$python manage.py createsuperuser

admin/admin

$python manage.py startapp bookmarkapp

 

#setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bookmarkapp.apps.BookmarkappConfig',
]

 

#bookmarkapp/models.py

from django.db import models

# Create your models here.
class Bookmark(models.Model):
    title = models.CharField(max_length=100, blank=True, null=True)
    url = models.URLField('url', unique=True)
    
    def __str__(self):
        return self.title + "(" + self.url + ")"

#bookmarkapp/admin.py

from django.contrib import admin
from .models import Bookmark

# Register your models here.
class BookmarkAdmin(admin.ModelAdmin):
    list_display = ('title', 'url')
    
admin.site.register(Bookmark, BookmarkAdmin)

$python manage.py makemigrations(변경된 파일 update)

$python manage.py migrate(변경된 파일 실제 db에 반영)

$python manage.py showmigrations

$python manage.py runserver 0.0.0.0:8000(모든 ip address 허용 : 어느곳에서도 8000번 접속할 수 있도록 설정)

 

$python manage.py dbshell

sqlite>.tables

sqlite>select * from bookmarkapp_bookmark;

sqlite>select * from bookmarkapp_bookmark where id=1;

sqlite>PRAGMA table_info(bookmarkapp_bookmark)

 

 

#urls.py

from django.contrib import admin
from django.urls import path
from bookmarkapp.views import BookmarkLV, BookmarkDV

urlpatterns = [
    # http://127.0,0,1:8000/admin
    path('admin/', admin.site.urls),
    
    # http://127.0,0,1:8000/bookmark
    path('bookmark/', BookmarkLV.as_view(), name='index'),
    
    # http://127.0,0,1:8000/3
    path('bookmark/<int:pk>', BookmarkDV.as_view(), name='detail'),
]

--listView, detailView 참고

https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-display

 

Generic display views | Django documentation | Django

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

docs.djangoproject.com

 

#mybookmark/views.py

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from bookmarkapp.models import Bookmark

class BookmarkLV(ListView):
    # url + "_list.html"
    model = Bookmark
    
class BookmarkDV(DetailView):
    # url + "_detail.html"
    model = Bookmark

 

#bookmarkapp/templates/bookmarkapp/bookmark_list.html

<!DOCTYPE html>
<html>
    <head>
        <title>Django Bookmark List</title>
    </head>
    <body>
        <div id="content">
            <h1>Bookmark List</h1>
            <ul>
                {% for bookmark in object_list %}
                    <li><a href="{% url 'detail' bookmark.id %}" target='_blank'>{{ bookmark }}</a></li>
                {% endfor %}
            </ul>
        </div>
    </body>
</html>

target='_blank' -> 새창에서 열기

"{% url 'detail' bookmark.id %}" => "bookmark/{}".format(bookmark.id)

 

#bookmarkapp/templates/bookmarkapp/bookmark_detail.html

<!DOCTYPE html>
<html>
    <head>
        <title>Django Bookmark List</title>
    </head>
    <body>
        <div id="content">
            <h1>{{ object.title }}</h1>
            <ul>
                <li>URL: <a href="{{ object.url }}">{{ object.url }}</a></li>
            </ul>
        </div>
    </body>
</html>

**장고는 내부에 ORM이 있어서 쿼리문을 쓰지 않아도 자동으로 매핑해줌

 

ListView.py

    -> object_list = cursor.execute(select * from bookmark)

DetailView.py

    -> object = select * from bookmark where id=?;

    -> object o, None

728x90

+ Recent posts