ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [WebPage] 3-3. 서버개발을 빠르게, 웹 프레임워크 Django
    Web/WebPage 2015. 6. 26. 10:50





    3.3.1 장고(Django)란 ?


     장고는 파이썬으로 작성된 오픈소스 웹 어플리케이션 프레임워크입니다. 간단한 사용법수많은 내장 기능 덕분에 쉽고 빠르게 고품질의 홈페이지를 만들 수 있게 도와주는 프레임워크입니다. 웹 어플리케이션을 만들 때 자주 반복하는 많은 귀찮은 일을 모아서 함수나 클래스 등으로 만들어 놓았기 때문에 사용자들은 필요할 때 그 기능을 쓰면됩니다.




    3.3.2 장고 시작 해 보기

     

     본격적으로 장고를 이용한 개발에 대해 배워보기 위해 먼저 장고를 이용하여 아주 간단한 예제를 통해 장고를 알아보겠습니다. 간단한 예제를 실행해 보고 장고에 대한 설명에 본격적으로 들어가도록 하겠습니다.



     1. 프로젝트 만들고 설정하기

      

      1) 콘솔에서 장고 프로젝트 생성하기

       

       - cmd 창을 열고 원하는 장고 프로젝트를 만들고 싶은 폴더로 이동합니다.

       - C 내에 Django란 폴더를 생성해서 작업하겠습니다.

       






       - 폴더 내에 dProject1 이라는 이름으로 프로젝트를 생성하겠습니다.


        django-admin.py startproject dProject1








     경로

     이름 

     역할 

     / 

     manage.py 

     장고 프로젝트 관리 

     /프로젝트이름/

     settings.py 

     장고에 관한 각종 설정들 

     /프로젝트이름/

     urls.py 

     홈페이지 주소를 장고와 연결 해 주는 역할 

     /프로젝트이름/

     wsgi.py 

     장고 실행 서버 관련 설정 

    장고 관련 파일들 






       - 프로젝트를 생성했으면 이제 프로젝트에 속할 app을 생성하겠습니다.

       - 프로젝트 폴더로 진입하여 아래 명령어를 입력합니다.


         manage.py startapp polls







          

       - app을 생성 했으면 이제 django의 설정을 위해 settings.py 파일을 에디터로 열어봅니다.(notepad++ 를 설치하셔서 사용하시면 편합니다)









       - 파일의 DATABASES 부분의 소스를 아래와 같이 수정합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DATABASES = {
        'default': {
            'ENGINE''django.db.backends.sqlite3'# Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME''data.sqlite',                      # Or path to database file if using sqlite3.
            'USER''',                      # Not used with sqlite3.
            'PASSWORD''',                  # Not used with sqlite3.
            'HOST''',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT''',                      # Set to empty string for default. Not used with sqlite3.
        }
    }
    cs



       - 다음으로 INSTALLED_APP을 수정합니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'polls',
        # Uncomment the next line to enable the admin:
        'django.contrib.admin',
        # Uncomment the next line to enable admin documentation:
        # 'django.contrib.admindocs',
    )
    cs



       - 여기까지만 진행을 해도 기본적인 Django 사용에는 아무런 문제가 없습니다.

       - But, 장고에서 만들 html의 뼈대라고 할 수 있는 탬플릿을 사용하기 위해서는 탬플릿의 경로를 설정해 줘야 합니다.

       - 프로젝트 폴더 내에 탬플릿들을 저장 할 폴더를 생성해야 합니다.

       - templates 폴더를 생성합니다.









       - 다음은 탬플릿 폴더를 경로 설정을 해줘야 합니다.

       - 아래와 같이 settings.py 내의 부분을 수정하세요.




    1
    2
    3
    4
    5
    6
    7
    8
    import os
    TEMPLATE_DIRS = (
        # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
        os.path.join(os.path.dirname(__file__), "..", "templates"),
    )
    FILE_CHARSET = 'euc-kr'
    cs


     




     2. 첫 장고 프로그램 따라 해 보기

      

      본격적으로 django에 대해 알아보기 전에 방금 만든 프로젝트 위에 간단한 프로젝트를 하나 만들어 보도록 하겠습니다.

     

      1) 프로젝트 폴더의 앱 폴더(polls)에 들어가면 models.py 파일이 있습니다. models.py 파일은 장고에서 사용할 객체를 지정 해 주는 파일입니다. models.py에 아래와 같은 코드를 입력하고 저장합니다.





    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from django.db import models
     
    class Poll(models.Model):
        question = models.CharField(max_length = 200)
        pub_date = models.DateTimeField('date published')
        def __unicode__(self):
            return self.question
            
    class Choice(models.Model):
        poll = models.ForeignKey(Poll)
        choice = models.CharField(max_length = 200)
        votes = models.IntegerField()
     
    cs



      2) Poll이라는 클래스와 Choice 클래스를 생성합니다. Poll이라는 설문에 Choice라는 선택지가 들어가는 형태 입니다. admin.py 파일을 만들어서 아래 코드를 입력합니다. (admin.py 저장 경로는 dProject1/polls 입니다.)




      * admin.py 


    1
    2
    3
    4
    5
    from polls.models import *
    from django.contrib import admin
     
    admin.site.register(Poll)
    admin.site.register(Choice)
    cs





      3) 위 작성한 정보를 가지고 데이터베이스를 구축하면 됩니다. 파이썬으로 작성한 객체를 장고가 읽어서 데이터베이스에 적절하게 테이블을 생성해 줍니다. manage.py가 있는 프로젝트 폴더로 이동하여 manage.py syncdb 입력합니다.







       진행이 되면서 superuser에 대해 묻습니다. yes 치고 엔터하신 다음, 간단하게 아이디, 이메일, 비번을 입력하여 설정하세요.












      4) 어떤 테이블이 자동으로 생성되었는 지 궁금하시면 manage.py sql 명령을 통해 확인 가능합니다.

        

        manage.py sql "앱 이름"


     





      5) 마지막으로 한 단계만 더 진행하면 실제 장고로 만든 간단한 페이지를 볼 수 있습니다. 아까 생성된 파일 중에 수정하지 않은 파일 중에 urls.py 라는 파일을 이용하여 우리가 만든 프로그램에게 주소를 주면 프로그램이 돌아가는 모습을 볼 수 있습니다. 아래와 같이 urls.py를 수정해주세요.





    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    from django.conf.urls import patterns, include, url
     
    # Uncomment the next two lines to enable the admin:
    from django.contrib import admin
    admin.autodiscover()
     
    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'dProject1.views.home', name='home'),
        # url(r'^dProject1/', include('dProject1.foo.urls')),
     
        # Uncomment the admin/doc line below to enable admin documentation:
        # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
     
        # Uncomment the next line to enable the admin:
        url(r'^admin/', include(admin.site.urls)),
    )
     
    cs







      6) 이제 장고 서버를 실행 해 보도록 하겠습니다. 콘솔 창에 manage.py runserver라고 입력해 보세요. 아래와 같이 에러 없이 실행되면 서버가 정상적으로 가동된 것입니다.







      7) 다음으로는 Aptana Studio를 통해 진행해 보겠습니다. 먼저 Aptana에서 파이썬을 사용하기 위해서는 몇 가지 설정을 해 줘야 합니다.


      8) Windows -> Preferences -> PyDev 아래에 보면 Interpreter - Python 이라는 항목이 있습니다. 이 항목에서 Auto Config를 클릭하여 자동으로 Python을 잡아줍니다.






      9) OK를 누르고 프로젝트를 생성해 보겠습니다. File -> New -> Project 를 선택하면 아래와 같은 창이 뜨는데, PyDev를 선택해서 그 아래 PyDev Django Project를 선택합니다.












      10) Project name에 dProject1 이라고 입력한 뒤 Next 버튼을 누릅니다. 데이터베이스를 설정하는 화면에서 기본적으로 sqlite3가 선택되어 있고, 데이터베이스 이름도 설정되어 있습니다.(Reference Page는 그냥 Next 해주세요)


      11) 생성된 프로젝트를 보면 콘솔 때와 같은 구조의 파일이 생기는 것을 확인 할 수 있습니다. 
     * 콘솔에서 작성한 모든 파일을 Aptana에 그대로 옮겨서 똑같은 환경을 구축하세요!







      12) Aptana Studio에서 생성된 프로젝트에서 오른쪽 마우스 버튼을 눌러 Djago 아래에 여러 서브메뉴들이 있고 Create application, sync db 등과 같은 자주 쓰는 메뉴들이 존재하는 것을 확인 할 수 있습니다.



      13) Aptana를 통해 서버를 구동시킵니다. 서버를 구동시켰으면 브라우저 창에 127.0.0.1:8000/admin/ 을 입력합니다. 이전에 설정한 계정을 입력합니다.
















      14) 이전에 입력한 Choice와 Poll 모델이 보입니다. Polls의 + Add 버튼을 눌러보겠습니다.

      15) 적당한 내용을 입력 후, save를 누릅니다. 새로운 항목이 입력 된 것을 확인 할 수 있습니다.





      16) 상단에 Home을 누른 뒤 이번에는 Choices의 +add 버튼을 눌러봅니다. Poll 항목에 아까 우리가 만든 Poll이 떠 있는 것을 확인 할 수 있습니다.










      17) 이런 식으로 간단하게 모델을 정의하는 것 만으로도 admin 모듈을 통해 데이터를 관리 할 수 있고, 유저의 추가, 삭제도 할 수 있습니다. 경우에 따라서는 별도의 홈페이지를 만들지 않고 이러한 모듈만을 가지고 데이터를 다루는 것으로 목적을 달성하는 경우도 있을 정도니 매우 강력하고 편리한 기능이라고 할 수 있습니다. 하지만 모든 사람에게 admin 권한을 주고 admin 페이지에서 모든 일을 하라고 할 수는 없으니 이 데이터를 입맛에 맞게 화면에 출력해 주는 것을 해줘야 합니다. 그러한 부분이 바로 Django의 view 입니다.


      18) templates 폴더에 index.html을 만들어 아래 코드를 입력합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    {% if poll_list %}
        <ul>
            {% for poll in poll_list %}
                <li><a href="/{{ poll.id }}/">{{ poll.question }}</a></li>
            {% endfor %}
        </ul>
    {% else %}
        <p>No polls are availables.</p>
    {% endif %}
     
    cs





      19) 다음으로 templates 폴더에 detail.html을 추가로 만듭니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <h1>{{ poll.question }}</h1>
     
    <form action="/{{poll.id}}/vote/" method="post">
        {% for choice in poll.choice_set.all %} 
            <input type="radio" name="choice" value="{{choice.id}}" />
            {{choice.choice}} - {{choice.votes}} 표 <br/>
        {% endfor %}
        <input type="submit" value="Vote" />
    </form>
     
    cs


     

      템플릿 형태이므로 html 일반적 형태와 다릅니다. 




      20) views.py 파일을 영어 수정해보도록 하겠습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    from django.shortcuts import render_to_response
    from django.http import Http404, HttpResponseRedirect
    from polls.models import Poll
    from django.core.urlresolvers import reverse
    from django.views.decorators.csrf import csrf_exempt
     
    def index(request):
        poll_list = Poll.objects.all()
        args = {'poll_list': poll_list}
        
        return render_to_response('index.html', args)
     
    def detail(request, poll_id):
        try:
            p = Poll.objects.get(id=poll_id)
        except Poll.DoesNotExist:
            raise Http404
        return render_to_response('detail.html', {'poll',p})
     
    @csrf_exempt
    def vote(request, poll_id):
        try:
            p = Poll.objects.get(id=poll_id)
            choice = p.choice_set.get(id=request.POST['choice'])
        except:
            raise Http404
        
        choice.votes += 1
        choice.save()
        
        return HttpResponseRedirect(reverse('polls.views.detail', args=(p.id,)))
     
    cs




      21) views.py 파일에 3개의 뷰를 넣었습니다. 뷰는 각각이 하나의 페이지에 대응된다고 볼 수 있습니다. 먼저 index는 홈페이지에 들어왔을 때 가장 먼저 보게되는 페이지입니다. 모든 설문의 목록을 템플릿에 렌더링하여 보여주게 됩니다. detail은 설문을 눌렀을 때 뜨는 페이지로 설문에 해당하는 항목을 볼 수 있고 항목에 투표를 할 수 있게 되어 있습니다. detail에서 투표를 하게 되면 vote 뷰에서 투표 처리를 해 주게 되는데 투표를 한 뒤 다시 detail 화면으로 넘어가게 되어 있는 구조입니다.


      22) 간단하게 메인 페이지와 상세 보기 페이지만을 코드로 나타냈습니다. 이제 urls.py 파일을 다시 열어 목록을 보여 줄 메인 페이지와 상세보기 페이지를 등록합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from django.conf.urls import patterns, include, url
     
    # Uncomment the next two lines to enable the admin:
    from django.contrib import admin
    admin.autodiscover()
     
    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls)),
        url(r'^$''polls.views.index'),
        url(r'^(?P<poll_id>\d+)/$''polls.views.detail'),
        url(r'^(?P<poll_id>\d+)/vote''polls.views.vote'),
    )
     
    cs


      23) 다시 "http://127.0.0.1:8000/"에 들어가 보도록 하겠습니다.





      간단한 코드로 설문 프로그램이 완료 되었습니다. 조금 복잡해 보일 수도 있지만 실제로 코드를 작성 한 부분은 얼마 되지 않습니다.




     * 본 포스팅은 이재근 등 4명 저 "Fast Web Service Build up: 웹 서비스를 쉽고 빠르게 구축하는 기술" 저서를 참고하여 작성하였습니다

    댓글

Designed by Tistory.