본문 바로가기

파이썬

파이썬 보아뱀 나홀로 사냥 3 - Django 앱 개발 (메모 게시판)

반응형

Django와 Sqlite 를  이용한 메모장을 만들어 본다

 

I. 게시판 프로젝트 생성

1.  cmd 창을 열고 장고 가상환경을  activate한다

  \myDdjangoVirtu>mydjango\Scripts\activate

  - (mydjango) D:\...\DjangoVirtu>  콘솔로 변경되면 정상 

 

(장고 가상환경 구축 참조)

파이썬 보아뱀 나홀로 잡기 - Django 설치 - 윈도우즈10 가상 환경 (tistory.com)

 

파이썬 보아뱀 나홀로 잡기 - Django 설치 - 윈도우즈10 가상 환경

장고를 가상환경(Virtual environment)으로 설치 I. 가상환경 virtualenv를 구성 1) 장고 가상환경을 만들 디렉토리 생성, >C:\Users\사용자명\ 아래에 DjangoVirtu 디렉토리 생성 2) 콘솔 창을 열고,  C:\Python..

imaking.tistory.com

 

2. 프로젝트 생성

memo_proj 라는 이름의 프로젝트를 생성한다

 

 - (mydjango) D:\..\DjangoVirtu>django-admin startproject memo_proj

동일한 이름의 프로젝트 디렉토리가 생성된 것을 확인

  (mydjango) D:\..\DjangoVirtu>dir
D:\..\DjangoVirtu 디렉터리
2021-05-15  오후 04:42    <DIR>          .
2021-05-15  오후 04:42    <DIR>          ..
2021-05-15  오전 09:09           131,072 db.sqlite3
2021-05-11  오후 09:25               683 manage.py
2021-05-15  오후 04:42    <DIR>          memo_proj
2021-05-15  오전 10:59    <DIR>          myapp
2021-05-11  오후 08:45    <DIR>          mydjango
               2개 파일             131,755 바이트

 

3. 데이터 베이스 테이블 생성

  프로젝트 디렉토리에서 python manage.py migrate  입력. 

 - (mydjango) D:\보노파베르\DataAnal\Django\DjangoVirtu\memo_proj>python manage.py migrate

 

   정상수행시 메시지

  Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
  Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  ...
  ....
  Applying sessions.0001_initial... OK

 

 sqlite 화일 생성 확인

 - (mydjango) D:\..\DjangoVirtu\memo_proj>dir

 D:\..\DjangoVirtu\memo_proj 디렉터리
2021-05-15  오후 04:49    <DIR>          .
2021-05-15  오후 04:49    <DIR>          ..
2021-05-15  오후 04:49           131,072 db.sqlite3
2021-05-15  오후 04:42               687 manage.py
2021-05-15  오04:49    <DIR>          memo_proj

 

4. Database 가 생성되었으면 관리자 생성

  python manage.py createsuperuser 라고 입력한 후 사용자명, 이메일주소, 비밀번호 순으로 입력

  - (mydjango) C:\Users\.. \DjangoVirtu\memo_proj>python manage.py createsuperuser
Username (leave blank to use '...'): admin
Email address: solarsoo@naver.com
Password:
Password (again):
Superuser created successfully.

 

등록 후 하루 지나니 사용자 정보 잘못으로 로그인이 안되는 현상 발생, 

사용자 새로 등록하니 가능 - 'user1'  비밀번호는 비밀  

(작업도중 해결되었으나 원인과 해결책은 나중에 파악키로 한다)

 

5. sqlite 뷰어 다운받는다

- https://sqlitebrowser.org/

 

- sqlite 뷰어로  위에서 생성한 db.sqlite3 파일을 열어 아래와 같이 테이블들과 관리 데이터 생성을 확인

 

II. 앱 생성

한개의 프로젝트안에는 여러 개의 앱이 존재할 수 있다.

프로젝트는 하나의 웹사이트이고, 웹사이트안에는 게시판 앱, 설문조사 앱, 정보제공 앱 등 여러 개가의 어플리케이션(또는 웹페이지)를 제공하는 개념이다.

 

1.  메모 프로젝트에서 사용할 실제 앱을 생성

   프로젝트 폴더에서 python manage.py startapp memo 라고 입력한다

   - (mydjango) C:\Users\...\DjangoVirtu\memo_proj>python manage.py startapp memo
   

 2. 하위 디렉토리에 memo 디렉토리 생성 확인
  - (mydjango) C:\...\DjangoVirtu\memo_proj>dir

2021-05-15  오후 11:13    <DIR>          .
2021-05-15  오후 11:13    <DIR>          ..
2021-05-15  오후 10:25           131,072 db.sqlite3
2021-05-15  오후 04:42               687 manage.py
2021-05-15  오후 11:13    <DIR>          memo
2021-05-15  오후 10:02    <DIR>          memo_proj


(mydjango) C:\Users\..\DjangoVirtu\memo_proj>dir memo
2021-05-15  오후 11:13    <DIR>          .
2021-05-15  오후 11:13    <DIR>          ..
2021-05-15  오후 11:13                66 admin.py
2021-05-15  오후 11:13               146 apps.py
2021-05-15  오후 11:13    <DIR>          migrations
2021-05-15  오후 11:13                60 models.py
2021-05-15  오후 11:13                63 tests.py
2021-05-15  오후 11:13                66 views.py
2021-05-15  오후 11:13                 0 __init__.py

 

3. 앱을 프로젝트 설정파일에 등록

    코드 에디터로 \memo_proz\settings.py 파일을 열고 생성한 memo 앱을 등록

  - 상단에 있는 INSTALLED_APPS 에 앱 설정 클래스 등록.

 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'memo.apps.MemoConfig', # 설정 클래스인 MemoConfig 는 memo 디렉토리내 apps.py 파일에 정의되어있다는 의미
]

 

 

III. 앱 개발

 

1. 메모테이블 생성 및 컬럼 정의

  - \memo_proz\memo\models.py 파일을 열고 클래스 테이블 정의

  - 기본으로 메모 문자열 content 컬럼과 수정일자인 last_modified 두 개의 컬럼 정의

 

from django.db import models
# Create your models here.
# Memo 클래스는 Django 의 Model 클래스를 상속.
class Memo(models.Model): 
    content = models.CharField(max_length=1000, blank=True, null=True)

    last_modified = models.DateTimeField(  # ㅡmigratios 시 에러로 추가
        auto_now=True,
        #verbose_name=_('...'),
        #help_text=_('...')
    )

 

(참고) Django는 하나의 클래스를 테이블로 정의하고, 각 멤버변수를 테이블 컬럼으로 사용가능.

 

 

2. 테이블을 관리자 기능에 등록

  -  \memo_proz\memo\admin.py 파일에 등록해 주면 Django Admin 페이지 에서도 테이블 확인가능

 

from django.contrib import admin
# Register your models here.
from memo.models import Memo
class MemoAdmin(admin.ModelAdmin):
    list_display = ('content','last_modified')w
admin.site.register(Memo, MemoAdmin)

 

3. 마이그레이션

  변경사항을 반영하기 위해 cmd 콘솔에서 아래와 같이 두개 cmd 입력

  - (mydjango) C:\Users\..\DjangoVirtu\memo_proj>python manage.py makemigrations

 

정상수행시 메시지

Migrations for 'memo':
  memo\migrations\0001_initial.py
    - Create model Memo

 

 - (mydjango) C:\Users\..\DjangoVirtu\memo_proj>python manage.py migrate

 

정상수행시 메시지

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, memo, sessions
Running migrations:
  Applying memo.0001_initial... OK

 

 - 위 2개 cmd 수행전 비어있던 \memo_proj\memo\migrations  폴더내 init 화일들과 cache 디렉토리가 생긴것을 확인할 수 있습니다.

 

4. 변경된 사항을 확인하기 위해 서버 실행 및 관리자 화면 접속

  - (mydjango) C:\Users\...\DjangoVirtu\memo_proj>python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 16, 2021 - 08:01:01
Django version 3.2.2, using settings 'memo_proj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

 

 

5. 브라우저로 관리자화면에 접속

 앞에서 정의한 관리자 ID와 PASSWORD를 입력

  - http://127.0.0.1:8000/admin

 

  로그인하면 화면 중간에 앞에서 생성했던 Memo 앱의 이름을 확인할 수 있으면 정상

6.  메모 앱 기능 테스트

    Memo 앱으로 들어가서 앞 부분에서 정의한 'content' 칼럼을 추가, 삭제, 변경 가능.

    'last modified' 컬럼은 입력된 시간으로 자동 저장됨

 

7. URL 정의

프로젝트 폴더 /memo_proz/urls.py 파일에는 admin url 에 대해 정의가 되어 있어 브라우저에서  /admin url 을 통해 접속 가능하였다

 

url( ) 함수는 기본적으로 5개의 파라미터로 구성 - url( regex, view, kwargs=None, name=None, prefix='')

 - 앞 두개는 필수, 뒤 세개는 옵션

 

 7-1. 프로젝트 디렉토리에 있는 urls.py 파일에 memo url  추가

  - \memo_pro\memo_proj\urls.py 수정 (프로젝트 urls)

from django.contrib import admin
from django.urls import include, path
from django.conf.urls import url, include  # 추가
urlpatterns = [
    path('admin/', admin.site.urls),
    path('memo/', include('memo.urls', namespace="memo")),
]

 

 7-2. 앱 폴더 url.py 파일 추가

 - \memo_proj\memo\urls.py 추가

from django.contrib import admin
from django.urls import path
from django.conf.urls import url # 추가
from memo.views import MemoList,MemoDetail # 추가

 

app_name = 'memo'  #추가
urlpatterns = [
    url(r'^$',MemoList.as_view(), name='index'),
    url(r'^(?P<pk>\d+)/$', MemoDetail.as_view(), name='detail'),
]

 

(설명) url 패턴의 이름을 index 와 detail로 각각 지정, memo 라는 url 로 들어온것은 MemoList 뷰로, memo/아이디 url 로 들어오면 MemoDetail 뷰로 매핑

(에러 발생)
 url(r'^memo/', include('memo.urls', namespace='memo')),
  File "C:\Users\..l\Programs\Python\Python39\lib\site-packages\django\urls\conf.py", line 38, in include
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing 

(원인)include함수의 인자 문제로 사이트의 urls.py에 

1) url(~~, include(r'^sample/', include('sample.urls', namespace='sample')) 과 같이 include 함수에 namepspace가 지정되는 경우, Django 2.0 이후에서는 컴파일 에러가 발생한다.
따라서 namespace 파라미터를 삭제한 후 include(r'^sample/', include('sample.urls')) 로만 함수를 작성한다면 컴파일 에러가 사라진다.
 
2)  url(r'^admin/' ,include(admin.site.urls)) 를 사용하는 경우에도 컴파일 에러를 발생시킬 수 있다. Django v2.0이후 버젼에선 url보다 path함수의 사용을 권장하고 있으며, 이 경우엔 path('admin/', admin.site.urls) 로 변경해주면 컴파일 에러가 사라진다.

3) url의 include에 namepspace를 넣어줄 수 있는 방법은 Django 공식 문서에 쓰여있지만, 다른 방법을 이용하자면, Project 말고 Application의 urls.py에 app_name = 'memo'같이 namespace 의 이름을 직접 지정해 주는 방법도 있다.

 

8.  뷰 클래스 생성

각각의 뷰는  두 가지 동작 중 하나 수행 

  1)  요청된 페이지의 내용을 담고 있는 HttpResponse 객체를 반환하거나,

  2)  Http404 같은 예외를 발생시킨다.  나머지는 앱 개발자 마음대로 추가 할 수 달려있다.

 

뷰는 파라미터들에 따라 데이터를 가져오며 템플릿을 로드하고 템플릿을 가져온 데이타로 렌더링한다.

 

뷰는 데이터베이스의 레코드를 읽을 수도 있다.

뷰는 Django나 Python에서 서드파티로 제공되는 템플릿 시스템을 사용할 수도 있다.

뷰는 PDF를 생성하거나, XML을 출력하거나, 실시간으로 ZIP 파일을 만들 수 있다.

뷰는 당신이 원하는 무엇이든 Python의 라이브러리를 사용할 수 있다면 보여 줄 수 있다.

 프로젝트 앱폴더/memo/views.py 수정

from django.shortcuts import render
# Create your views here.
from django.views.generic import ListView, DetailView
from memo.models import Memo


class MemoList(ListView) :
    model = Memo
class MemoDetail(DetailView) :
    model = Memo

 

9. 실제 html 화면에 해당하는 템플릿 작성

 - 템플릿 디렉토리는 앱폴더 아래에 templates/'앱이름' 형태로  경로상의 디렉토리를 생성

 - 위의 views.py 에서 정의한 MemoList와 MemoDetail 은  Django에서 제공하는 generic 인 ListView와 DetailView 를 상속한 것으로 각각 '모델이름소문자_list.html', '모델이름소문자_detail.html'의 이름으로 뷰가 매핑된다.

 

따라서 템플릿 폴더에는 모델이름인 Memo 의 소문자 memo 에 list와 detail를 suffix로 갖는 html을 생성해주면 자동으로 인식됩니다.

  9-1. 템플릿 폴더에 memo_list.html, memo_detail.html 파일을 생성하고 아래 내용을 입력합니다.

-  C:\Users\..\DjangoVirtu\memo_proj\memo\templates\memo 디렉터리

2021-05-16  오전 09:55    <DIR>          .
2021-05-16  오전 09:55    <DIR>          ..
2021-05-16  오전 09:55               194 memo_detail.html
2021-05-16  오전 09:54               340 memo_list.html

 

  9-2. 프로젝트 앱폴더/memo/templates/memo/memo_list.html  내용

<!DOCTYPE html>
<html>
<head>
    <title> Memo </title>
</head>
<body>
    <div id="content">
        <h1>Memo List</h1>
        <ul>
            {% for memo in object_list %}
                <li><a href="{% url 'memo:detail' memo.id %}"> {{ memo }} </a></li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>

 

  9-3 프로젝트 앱폴더 /memo/templates/memo/memo_detail.html 내용

<!DOCTYPE html>
<html>
<head>
    <title> Memo </title>
</head>
<body>
    <div id="content">
        <h1>Memo Detail</h1>
            {{ object.content }} 
    </div>
</body>
</html>

 

10. Django 서버를 실행

 - \memo_proj>python manage.py runserver

 

11. 브라우저를 통해 메모장 접속

 - http://127.0.0.1:8000/memo

- 정상 접속위 되면 위에서 만든 테스트용 메모장 2개가 나타남

 

 - 각 메모를 클릭하면 위에서 입력한 메모장 문자열이 보임 (1번 메모 클릭)

 

 

 

Tip !!  관리자 페이지 Django administration  Page 를 내 앱에 맞게 수정한다

12. 관리자 페이지 수정

 

127.0.0.1:8000/admin/  URL로 접속하면 Django 에서 제공하는 디폴트 관리자 페이지가 보인다.

 이것을 내 앱에 맞게 수정해보자

기본으로 제공하는 Django admin 페이지는 아래와 같다.

이것을 내 앱 이름에 맞게 수정하는 방법은 간단하다

 

루트 urls.py 에 아래 연노랑 배경의  파라미터 내용을 추가하면된다

 

 - \memo_proj\urls.py 

 

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

 

# Customizing Admin Page
admin.site.site_header = 'Memo app admin'
admin.site.site_title = 'Memoranda'
admin.site.site_url = 'http://memo.com/'
admin.site.index_title = 'Memo administration'
admin.empty_value_display = '**Empty**'

urlpatterns = [
    path('admin/', admin.site.urls),
    path('memo/', include('memo.urls', namespace="memo")),
]

 

앱을 실행시키고 admin/ URL로 접속하면 다음과 같이 보인다  L@@K    성공 !! ~

 


여기까지 성공 !!  스스로에게 푸짐한 '뷔페'를 대접하세요 ~

 

 

충전 후 다음 파이썬  보아뱀 사냥은 웹서버와 통신에서 가장 많이 사용하는 REST API 이 타겟이다

 

파이썬 보아뱀 나홀로 사냥 4 - REST API 구현

REST API란? REST(Representational State Transfer) 라는 용어는 Roy Fielding이라는 사람의 2000년 박사학위 논문에 소개되었다. 웹에서 어플리케이션간 정보를 주고받기 위한 클라이언트 - 서버간 통신 방식으.

imaking.tistory.com

 

반응형