[Django#3] Getting started with simple application
Getting started with simple application
지난 포스팅에 이어 Application 개발 심화 과정을 다루고자 한다.
http://rocksea.tistory.com/308
이번 포스팅에서는 기본적인 Restful 기반의 App 개발에 대해서 다루고자 한다.
기본적인 인증, 권한, DBPool관리, json데이터를 이용한 기본적인 Restful 방식의
Web Application을 구현 할 것이다.
step1. setting.py 설정
일단 기본적인 앱을 만들기 위해 settings.py에 대한 정보를 몇가지 설정해 줘야한다.
App이 추가되면 INSTALLED_APPS 에 추가를 한다.
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#2015.07.06 by rocksea - polls
'polls',
)
step2. MySQL Connection Pool 설정
pip를 이용하여 Connection Pool 모듈을 설치합니다.
$ pip install django-mysqlpool
step3. Auth app 생성
사용자 인증을 위해 auth 앱을 생성한다.
$ python manage.py startapp auth
auth/html/login_view.html
로그인 화면을 임시로 만든다. 주의할점은 Login시 "csrfmiddlewaretoken" 을
추가해주어야 한다. 그렇지 않으면 POST전송 시 403 Forbidden 에러가 발생한다.
<html> <head> <title> </title> </head> <body> <form action="/auth/loginAction" method="POST"> <input type="text" name="username" value="rocksea" /><BR/> <input type="text" name="password" value="1234" /><BR/> <input type="submit" value="confirm" /> <div style="display:none"> <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> </div> </form> </body> </html>
auth/urls.py
url과 Login View Controller객체를 Mapping한다.
from django.conf.urls import include, url import views urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^loginAction', views.loginAction, name='loginAction'), url(r'^login', views.login, name='login'), ]
auth/views.py
contrib.auth의 authenticate를 통해 로그인 인증을 처리한 뒤, login()를 통해
로그인 처리 후 serializer를 이용하여 XML or JSON형태의 결과를 날린다.
from django.http import HttpResponse from django.shortcuts import render from django.contrib.auth import authenticate, login from django.shortcuts import render from django.core import serializers # Create your views here. def index(request): return HttpResponse("Hello, world. You're at the polls main index.") def loginView(request): return render(request, 'auth/html/login_view.html') def loginAction(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: if user.is_active: login(request, user) # XML or JSON Serializer data = serializers.serialize('json', [user]) # Redirect to a success page. return HttpResponse(data) else: # Return a 'disabled account' error message return HttpResponse("Disable account.") else: # Return an 'invalid login' error message. return HttpResponse("Invalid account.")
[그림 1] 로그인 화면
[그림 2] 로그인 완료 시 JSON 출력 화면
step3. flight app 생성 및 DB Table 생성
$ python manage.py startapp flight
생성할 모델을 추가한다.
from django.db import models # Create your models here. class Nation(models.Model): nation_nm = models.CharField(max_length=200) nation_cd = models.CharField(max_length=10) pub_dt = models.DateTimeField('date published') class Kind(models.Model): flight_nm = models.CharField(max_length=200) flight_cd = models.CharField(max_length=10) pub_dt = models.DateTimeField('date published') class Airport(models.Model): nation = models.ForeignKey(Nation) airport_nm = models.CharField(max_length=200) airport_cd = models.CharField(max_length=10) pub_dt = models.DateTimeField('date published') class Schedule(models.Model): flight_kind = models.IntegerField() start_airport = models.IntegerField() arrival_airport = models.IntegerField() start_dt = models.DateTimeField() arrival_dt = models.DateTimeField() last_dt = models.DateTimeField() status_cd = models.CharField(max_length=10) pub_dt = models.DateTimeField('date published') class Reservation(models.Model): start_airport = models.IntegerField() arrival_airport = models.IntegerField() start_flight = models.IntegerField() arrival_flight = models.IntegerField() start_dt = models.DateTimeField() arrival_dt = models.DateTimeField() last_dt = models.DateTimeField() status_cd = models.CharField(max_length=10) pub_dt = models.DateTimeField('date published')
이제 실제 물리적인 DBMS의 Schema에 추가하도록 한다.
$ python manage.py migrate
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: flight, sessions, admin, polls, auth, contenttypes
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying flight.0001_initial... OK
DB Table에 추가된 모습을 확인 해 볼 수 있다.
mysql> show tables;
+----------------------------+
| Tables_in_rocksea |
+----------------------------+
| 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 |
| flight_airport |
| flight_kind |
| flight_nation |
| flight_reservation |
| polls_choice |
| polls_question |
+----------------------------+
$ rm <app-dir>/migrations/*
$ python manage.py schemamigration <app-name> --initial
$ python manage.py migrate <app-name> 0001 --fake --delete-ghost-migrations
step4. flight 정보 입력
http://<host-ip>:8000/admin/ 에 접속하여 각 객체에 기본 정보를 입력한다.
[그림 3] 관리자 접속 화면
trabi/urls.py
flight url에 객체를 추가한다.
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ # Examples: # url(r'^$', 'trabi.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^polls/', include('polls.urls')), url(r'^auth/', include('auth.urls')), url(r'^flight/', include('flight.urls')), ]
flight/urls.py
url 객체와 View Controller를 추가한다.
from django.conf.urls import include, url import views urlpatterns = [ url(r'^nation/list', views.nationsList, name='NationsList'), url(r'^schedule/regSchdl', views.regSchedule, name='regSchedule'), ]
flight/views.py
View Controller에 관리자에서 입력한 데이터를 출력해보는 코드를 작성하였다.
from django.http import HttpResponse from django.shortcuts import render from django.contrib.auth import authenticate, login from django.shortcuts import render from django.core import serializers from .models import Nation, Kind, Airport, Schedule, Reservation # Create your views here. def nationsList(request): data = serializers.serialize('json', Nation.objects.all()) return HttpResponse(data) def regSchedule(request): data = serializers.serialize('json', Nation.objects.all()) return HttpResponse(data)
이제 Server를 실행하여 확인해 본다.
$ python manage.py runserver 0.0.0.0:8000
[그림 4] 데이터 JSON 출력 화면
이상 하나의 Cycle을 돌아 보았으니 응용해서 여러 Application을 개발 해 보도록 한다.