지난 글에서 models.py를 이용하여 db를 생성한 적이 있다.

http://leopit.tistory.com/174?category=684110

 

DJANGO는 디폴트로 sqlite db를 사용하게 되어 있는데 django 자습을 하다 문득 궁금해졌다. MODEL에 정의한 필드들은 실제 DB에 어떻게 저장되는지..

 

그래서 sqlite보다는 더 익숙한 MYSQL을 연동해 보았다.

 

1. mysql 설치

- mysql 은 유료다. 무료인 mariadb를 설치하였다.

[root@leopit.com ~]# yum install mariadb-server
[root@leopit.com ~]# systemctl start mariad


이제 실제 사용할 mysql 유저 계정과 DB를 만들겠다.

자세한 메뉴얼은 MYSQL 관련 사이트에서 확인하기 바란다.

# 계정 생성

create user 'cert'@'%' identified by 'password';
create user 'cert'@'localhost' identified by 'password';

 

# DB 생성

create database pat;

 

# 권한주기

grant all privileges on *.* to 'cert'@'localhost';
grant all privileges on *.* to 'cert'@'%';

 

cert라는 계정과 pat이란 db를 만들었다.

장고랑 연결해주자

 

2. settings.py 설정

- 상단에 pymysql을 추가해주고 sqlite 부분을 주석처리 해주고 mysql 정보를 입력하였다.

import pymysql
pymysql.install_as_MySQLdb()

 

.

.

.

 

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

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'pat',
        'USER': 'cert',
        'PASSWORD': 'xxxx',
        'HOST': 'x.x.x.x',
        'PORT': '3306',
        'OPTIONS': {
            'read_default_file': './db.cnf',
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}


 

3. DB 생성 및 확인

지난글에서 만들었던 models.py 내용이다. (클래스명만 변경)

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.

 

class testmodel(models.Model):
    name = models.CharField(max_length=50)
    title = models.CharField(max_length=50)
    content = models.TextField()
    cdate = models.DateTimeField(auto_now_add=True)

 

makemigration과 migrate 커맨드를 통해 DB 등록 진행

[root@leopit.com ~]# python manage.py makemigrations

[root@leopit.com ~]# python manage.py migrate

 

이제 실제 DB에 어떻게 테이블이 생성되었는지 보자

[root@leopit.com ~]# mysql -u cert -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 5.5.60-MariaDB MariaDB Server

 

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]> use pat


Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

 

Database changed
MariaDB [pat]> show tables;
+----------------------------+
| Tables_in_pat              |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| pat_testmodel              |
+----------------------------+
11 rows in set (0.00 sec)

MariaDB [pat]> Ctrl-C -- exit!
Aborted
[root@cert-pat pat]#


 

 

장고에 필요한 기본적인 테이블과 models.py에 등록한 testmodel이란 테이블이 앱이름_testmodel 이란 테이블명으로 생성되어 있다. 테이블 안에 필드들도 살펴보자

MariaDB [pat]> desc pat_testmodel;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(50) | NO   |     | NULL    |                |
| title   | varchar(50) | NO   |     | NULL    |                |
| content | longtext    | NO   |     | NULL    |                |
| cdate   | datetime    | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [pat]> Ctrl-C -- exit!
Aborted

 

models.py에서 필드를 4개 선언했는데 5개가 생성되었다.

django에서는 Primary Key값이 자동으로 생성된다. id라는 필드명으로 PK가 생성되어져 있었다.

 

4. ADMIN 페이지에 DB 등록

앱 디렉토리 하단에 admin.py 를 아래와 같이 수정한다.

앱이름.models를 import 하고 models.py 에 입력한 testmodel 클래스명을 등록해준다.

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

 

from django.contrib import admin

 

# Register your models here.
from pat.models import *

 

admin.site.register(testmodel)

 

이렇게 하면 웹페이지에서 DB 확인이 가능하다.

http://자신의 URL/admin 으로 이동하면 로그인 계정정보를 입력하고 아래와 같이 테이블을 확인할 수 있다. 로그인 계정을 만들지 않았다면 python manage.py createsuperuser 커맨드를 통해 생성할 수 있다.

 

 

'Coding' 카테고리의 다른 글

로우코드와 노코드, 코딩 해방 가능한가?  (0) 2024.07.06
5. Django 글쓰는 폼 만들기  (0) 2018.12.30
4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16

간단히 글쓰는 폼을 만들어보겠다.


1. 글쓰는 폼 만들기

간단히 글쓰기 위한 폼을 만들어본다.

편리한 작업을 위해 bootstrap에서 제공하는 css를 활용하겠다.

bootstrap css는 아래 URL 참조 바란다.

https://getbootstrap.com/docs/3.3/css/


상기 URL에서 제공하는 기본 폼 태그를 Copy하여 html 파일을 하나 만들어준다.

앱 디렉토리의 template디렉토리 안에 생성해준다.

이 폼은 공지사항 등록용으로 사용할것이기에 Notice 라는 디렉토리를 추가로 만들어서 그 안에 생성하였다.


[root@leopit.com notice]# pwd

/home/root/pat/templates/pat/notice


html 페이지 상단에 staticfiles 로드를 해주고 css, js 경로를 수정해준다. 우선 웹페이지만 잘 열리는지 확인할것이므로 이상태로 두고 이 템플릿을 연결할 view페이지를 설정한다.

[root@leopit.com notice]# vim form.html
{% load staticfiles %}

<!DOCTYPE html>
<html>
  <head>
    <title>Notice - register</title>
    <link href='{% static "pat/vendor/bootstrap/css/bootstrap.min.css" %}' rel="stylesheet">
    <!-- Custom fonts for this template-->
    <link href='{% static "pat/vendor/fontawesome-free/css/all.min.css" %}' rel="stylesheet" type="text/css">
  </head>
  <body>
    <form>
      <div class="form-group">
        <label for="exampleInputEmail1">Email address</label>
        <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
      </div>
      <div class="form-group">
        <label for="exampleInputPassword1">Password</label>
        <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
      </div>
      <div class="form-group">
        <label for="exampleInputFile">File input</label>
        <input type="file" id="exampleInputFile">
        <p class="help-block">Example block-level help text here.</p>
      </div>
      <div class="checkbox">
        <label>
          <input type="checkbox"> Check me out
        </label>
      </div>
      <button type="submit" class="btn btn-default">Submit</button>
    </form>
  </body>
</html>


앱디텍토리 하위에 있는 뷰파일을 수정하여 방금 생성한 form.html과 연결해준다.

뷰에 대한 상세한 내용은 아래 URL을 참고하기 바란다.


https://docs.djangoproject.com/ko/2.1/intro/tutorial03/


뷰페이지에서는 인자를 받을수도 있고 줄수도 있다.

우선 메뉴얼 예제에 있는 내용을 그대로 사용하겠다.


# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render from django.http import HttpResponse from django.template import loader # Create your views here. def DisplayMyPage(request): return render(request, 'pat/main.html', { 'welcome_text': 'Hello World!' }) def main(request): template = loader.get_template('pat/main.html') context = { 'latest_question_list': "test", } return HttpResponse(template.render(context, request)) def ntform(request): template = loader.get_template('pat/notice/form.html') context = { 'latest_question_list': "test", } return HttpResponse(template.render(context, request))

이 코드는 pat/notice/form.html 템플릿을 불러온후 context를 전달한다. context는 템플릿에서 사용하는 변수명과 python 객체를 연결하는 역할을 한다. 우선 외부에서 페이지가 정상적으로 열리는지만 테스트 할것이므로 더이상 수정하지 않고 이제 URL을 설정하자



외부에서 접근 가능한 URL이 있어야 할것이다.

템플릿, URL, 뷰, 모델 작업 순서에 대해 이해가 잘 안간다면 이전글(http://leopit.tistory.com/164?category=684110)을 참조하기 바란다.

프로젝트 디렉토리 하단에 있는 URL 파일을 연다.


아래와 같이 아까 생성한 뷰페이지를 MyAppView 클래스로 생성한후 notice/form.html 에 연결해준다. 외부에서 notice/form.html URL로 들어올 경우 MyAppView의 ntform 클래스를 실행해주겠다는 이야기이다.

from django.conf.urls import url from django.contrib import admin from pat import views as MyAppView urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^main/', MyAppView.main), url(r'^main.html/', MyAppView.main), url(r'^$', MyAppView.main), url(r'^notice/form.html$', MyAppView.ntform), ]


여기까지 한 후 웹 데몬을 실행해주고 외부에서 정상접근 되는지 확인해보자

[root@leopit.com leopit]# python manage.py runserver 0.0.0.0:8000 Performing system checks... System check identified no issues (0 silenced). December 30, 2018 - 17:22:52 Django version 1.11.17, using settings 'cert.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.


외부에서 정상적으로 URL을 불러들인 모습이다.

다음장에서는 실제 Django DB에 데이터를 입력하기 위한 폼을 만들어 보겠다.





'Coding' 카테고리의 다른 글

로우코드와 노코드, 코딩 해방 가능한가?  (0) 2024.07.06
6. Django + Mariadb 연동 & APP DB 어드민 등록  (0) 2019.01.06
4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16


이전장에서 bootstrap 과 django를 다루어보았다.

이번장에서는 DB를 생성하는 방법을 다루어본다.


처음 django를 접하는 사람은 DB는 언제 어떻게 생성하지? 하는 궁금증을 가지게 된다.

Django에서는 models.py에 클래스를 정의하여 DB를 컨트롤 한다. 

기존에 웹프로그래밍을 했던 사람이라면 혼란스럽기도 하고 신세계이기도 할것이다.


이전장에서 pat이란 앱을 만들었다.

앱 디렉토리에 models.py가 존재한다.

[root@leopit.com pat]# ls
admin.py   apps.py   __init__.py   migrations  models.pyc  templates  views.py
admin.pyc  apps.pyc  __init__.pyc  models.py   static      tests.py   views.pyc
[root@leopit.com pat]#


DB를 생성하기 위해 models.py에 아래와 같이 필드를 추가하였다.

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.

class Notice(models.Model)
    name = models.CharField(max_length=50)
    title = models.CharField(max_length=50)
    content = models.TexeField()
    cdate = models.DateTimeField(auto_now_add=True)


간단히 이름/제목/내용/날짜 필드를 만들었다.

models 모듈에 속한 필드 클래스로 멤버를 선언하면 마이그레이션 후 자동으로 DB와 연결된다.

Field Type에 대한 상세한 내용은 Django 문서를 참조하기 바란다.

https://docs.djangoproject.com/en/1.8/topics/db/models/#fields


이제 makemigrations 명령어를 통해 마이그레이션 스크립트를 생성한다. 

수정/삭제/생성할 필드들을 스크립트로 생성하여 migrations 디렉토리에 저장하게 된다.

[root@leopit.com leopit]# python manage.py makemigrations Migrations for 'pat': pat/migrations/0001_initial.py - Create model Notice [root@leopit.com leopit]#


마지막으로 migrate를 하여 DB를 생성한다.

[root@leopit.com leopit]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, pat, sessions
Running migrations:
  Applying pat.0001_initial... OK
[root@leopit.com leopit]#


'Coding' 카테고리의 다른 글

6. Django + Mariadb 연동 & APP DB 어드민 등록  (0) 2019.01.06
5. Django 글쓰는 폼 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16
2. Django 설치편  (0) 2018.12.14

실전 프로젝트 개발 과정


 이전 시간에는 Django(이하 장고) 프레임워크를 활용한 개발 패턴에 대해서 정리했었다. 이번에는 김석훈 저자의 '장고를 활용한 쉽고 빠른 웹 개발 파이썬 웹 프로그래밍'이라는 서적에서 다루고 있는 기본적인 웹 애플리케이션 제작을 직접 해보고, 내용에 대해서 나름대로 정리해본다. 책에서는 본격적인 애플리케이션 개발에 앞서서 디자인을 먼저 수행하는데, 화면(UI) - 테이블(데이터베이스) - 로직 - URL 순서에 따라서 설계를 진행한다. 그리고 이전 포스팅에서 정리했던 것과 마찬가지로 개발 순서를 가이드하고 있다.


프로젝트 생성 - 모델 작성 - URL 작성 - 템플릿 작성 - 뷰 작성


프로젝트 생성 - 프로젝트 및 앱 개발에 필요한 디렉터리와 파일을 생성

모델 작성 - 테이블 관련 사항을 개발, modelsspy, admin.py

URL 작성 - URL 및 뷰 매핑 관계를 정의 urls.py

템플릿 작성 - templates 디렉터리 하위의 html 파일 작성

뷰 작성 - 제어 흐름 및 로직 개발 views.py


 실제적인 개발을 진행해보면 위 다섯가지 단계보다 조금 더 세세한 개발 패턴을 정의할 수 있다. 내 나름대로의 정리한 장고를 활용한 웹 개발은 아래의 사이클을 갖고있는 것 같다.


가상환경 설정(virtualenv) - 프로젝트 생성(startproject) - 프로젝트 설정(settings.py) - 기본 테이블 생성(migrate) - 수퍼유저 생성(createsuperuser) - App 생성(startapp)과 등록(settings.py) - 모델 작성(model.py) - Admin 사이트 반영(admin.py) - 테이블(DB) 반영(makemigrations, migrate) 및 확인 - URL 작성(urls.py) - 로직 작성(view.py) - 화면(UI) 작성(templates) 


 프로세스에 대한 전반적인 얘기를 해보자면, 맨 처음 장고를 활용한 웹 개발을 진행할 때는 위의 모든 과정을 수행해야한다. 그러나 장고 프로젝트는 내부에 다수의 앱을 보유할 수 있기 때문에 각 앱을 작성할 때에는 파란색 과정만 수행하면 된다. 추가적으로 맨 처음 가상환경 설정의 경우 효율적인 파이썬 개발환경을 구축하기 위한 과정인데 필수적인 부분은 아니다. 그러나 파이썬 개발 서적에서 가상 환경에 대해서는 적극 권장하고 있기 때문에 이에 대한 내용을 따로 정리했다. virtualenv에 대해서는 다음 포스팅을 참조하기 바란다. [virtualenv를 활용한 독립개발 환경 구축



 이어서 가상환경 설정 단계를 제외한 각 단계에 대해서 세세하게 정리해본다.

 프로젝트 생성(startproject) - 앞으로 진행할 프로젝트의 뼈대를 구성하는 것이다. 아래의 명령어 한 줄로써 프로젝트에 뼈대가 생성되는데, 동일한 디렉터리가 두 개가 상하 관계로 생성된다. 동일한 이름으로 인해 상위 디렉터리의 이름은 변경을 권장한다.

# django-admin.py startproject `projectname`


 프로젝트 설정(settings.py) - 이전 포스팅에서 알아봤던 settings.py 파일에 개발에 필요한 프로젝트 초기 설정을 해야한다. 크게는 DATABASES, TEMPLATES, STATIC, TIME_ZONE, MEDIA, LANGUAGE_CODE 정도가 되겠다. 이들 중 타임존이나 언어 설정의 경우에는 필수는 아니다. 장고에서 정적 파일은 아래와 같이 두 종류로 구분이 된다.

STATIC: 개발 리소스 정적 파일, MEDIA: 유저로 업로드한 모든 파일


 기본 테이블 설정(migrate) - 아직 테이블 작성을 하지 않았지만, 장고는 디폴트로 사용자와 사용자의 권한 그룹 테이블을 갖는다. 따라서 기존에 어떤 테이블을 작성하지 않았어도, 아래의 명령어를 통해 사용자 및 권한 그룹에 대한 테이블을 생성해야 한다.

# python3 manage.py migrate


 수퍼유저 생성(createsuperuser) - 관리자 권한을 갖는 슈퍼 유저를 생성한다.

# python3 manage.py createsuperuser


 App 생성(startapp)과 등록(settings.py) - 하나의 장고 프로젝트는 다수의 앱으로 구성되는데, 아래의 명령어를 통해 앱을 생성할 수 있다. 그리고 만들어진 앱 정보를 settings.py에 입력함으로써 프로젝트에 앱이 등록된다.

# python3 manage.py startapp `app name`


 김석훈 저자의 '장고를 활용한 쉽고 빠른 웹 개발 파이썬 웹 프로그래밍'이라는 서적에서 가장 기본적으로 제작해보는 Bookmark 앱에 대한 코드는 [Github 저장소]에 업로드했다. 또한 코드에 대한 상세한 내용은 주석을 통해 설명한다.



출처: http://taekho-nology.tistory.com/64 [태코놀로지]

'Coding' 카테고리의 다른 글

5. Django 글쓰는 폼 만들기  (0) 2018.12.30
4. Django DB 만들기  (0) 2018.12.30
3. Django + Bootstrap  (1) 2018.12.16
2. Django 설치편  (0) 2018.12.14
1. Django 개념알기  (0) 2018.12.06

이번장에서는 Django에 bootstrap frame을 사용해보겠다.


이전장에서 프로젝트 이름을 cert, 앱 이름을 pat으로 만들었다.

django template을 사용하기 위해 pat 디렉토리 하위에 static을 만들고 static 하위에 pat이란 이름의 디렉토리를 생성한다.

[root@leopit.com ~]# mkdir -p pat/static/pat

[root@leopit.com ~]# cd pat/static/pat


본인이 사용할 bootstrap template을 가져온다.

[root@leopit.com pat]# wget https://github.com/BlackrockDigital/startbootstrap-shop-homepage/archive/gh-pages.zip

[root@leopit.com pat]unzip gh-pages.zip

[root@leopit.com pat]# ls

404.html              gulpfile.js        register.html

bak                   js                 scss

blank.html            LICENSE            startbootstrap-sb-admin-gh-pages

charts.html          index.html     login.html         tables.html

css                   package.json       vendor

forgot-password.html  package-lock.json

gh-pages.zip          README.md


이 다음 앱 디렉토리 하위에 templates/pat 디렉토리를 생성한 후 index.html 파일 옮긴다.

본인의 경우 index.html 파일명을 main.html로 변경하였다.

[root@leopit.com ~]# mkdir -p ~/pat/templates/pat

[root@leopit.com ~]# cd /pat/templates/pat

[root@leopit.com pat]# mv ~/pat/static/pat/index.html ./main.html

[root@leopit.com pat]# ls

main.html


이제 html 파일의 css 경로를 바꿔주자

문서 최상단에 {% load staticfiles %} 을 추가해주고 각종 css 경로를 수정한다.

경로는 static 디렉토리 하위에 존재하는 bootstrap 템플릿 경로를 써주면 된다.


[root@leopit.com ~]# vi main.html

<!DOCTYPE html>

{% load staticfiles %}


   <title>SB Admin - Dashboard</title>

    <!-- Bootstrap core CSS-->
    <link href='{% static "pat/vendor/bootstrap/css/bootstrap.min.css" %}' rel="stylesheet">

    <!-- Custom fonts for this template-->
    <link href='{% static "pat/vendor/fontawesome-free/css/all.min.css" %}' rel="stylesheet" type="text/css">

    <!-- Page level plugin CSS-->
    <link href='{% static "pat/vendor/datatables/dataTables.bootstrap4.css" %}' rel="stylesheet">

    <!-- Custom styles for this template-->
    <link href='{% static "pat/css/sb-admin.css" %}' rel="stylesheet">

    <!-- Bootstrap core JavaScript -->
    <script src='{% static "pat/vendor/jquery/jquery.min.js" %}'></script>
    <script src='{% static "pat/vendor/popper/popper.min.js" %}'></script>
    <script src='{% static "pat/vendor/bootstrap/js/bootstrap.min.js" %}'></script>


이제 view.html을 수정하여 template을 연결해준다.


[root@leopit.com pat]# vim ~/pat/views.py

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from django.shortcuts import render

from django.http import HttpResponse

from django.template import loader


# Create your views here.

def index(request):

    template = loader.get_template('pat/main.html')

    context = {

        'latest_question_list': "test",

    }

    return HttpResponse(template.render(context, request))


외부에서 접근할 url을 설정하고 해당 url에 대한 html 파일을 연결해준다.

settings.py에 맨 하단에 STATIC_URL과 ROOT설정을 해준다.


STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')


마지막으로 collectstatic을 해주면 static/pat에 파일이 복사된다.

[root@leopit.com ~]# python manage.py collectstatic

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/base.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/changelists.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/dashboard.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/fonts.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/forms.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/login.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/rtl.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/widgets.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt'

...



[root@leopit.com ~]# cd ~/static/pat

[root@leopit.com pat]# ls

404.html     css                   js            package-lock.json  tables.html

bak          forgot-password.html  LICENSE       README.md          vendor

blank.html   gh-pages.zip          login.html    register.html

charts.html  gulpfile.js           package.json  scss


마지막으로 데몬실행후 사이트 접근

[root@leopit.com ~]# python manage.py runserver 0.0.0.0:8000





'Coding' 카테고리의 다른 글

4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
2. Django 설치편  (0) 2018.12.14
1. Django 개념알기  (0) 2018.12.06
[PHP] 다운로드 구현시 파일이름에 [1] 등이 자동으로 붙어버리는 문제  (0) 2017.01.07

+ Recent posts