Hi Hi

'Django Python'에 해당되는 글 1건

  1. [Python Djago] 4. 주소 체계 설정, admin 모드 설정

[Python Djago] 4. 주소 체계 설정, admin 모드 설정

 


urls.py : 주소 체계 설정 파일

웹 서비스에 유행하는 주소 체계는 ( ? , = ) 같은 기호를 쓰지 않고 마치 디렉토리나 파일에 바로 접근하는 것 처럼 꾸민다.

=  /list/webroot/page_1

이런 주소는 웹 검색기들도 주소 체계를 더 잘 파악한다고 해서 유행처럼 많이 쓰익 있다. 이를 FancyURL 혹은 BeautifulURL 이라고 부르는데, 여러 웹 서버에서 다양한 방법으로 이런 기능을 제공한다.

IIS : ISAPI 필터를 이용하여 구현
Apache : mo_rewrite 모듈을 이용하여 구현

다시 말하면 FancyURL 은 php 이나 파이썬 등으로 만든 cgi에서 구현하는 것이 아니라 웹서버에서 제공하는 기능이다.

웹 서버단에서 일일이 FancyURL 규칙이나 체계를 설정하는 것보다 cgi에서 주소를 분석하여 각 주소에 맞는 처리를 하도록 하는 것이 더 편리하다.


이용자가 서비스에 접근할 때는 접근하려는 url 이있는데, 이 url을 지정한 대표 cgi 로 건내주면 cgi는 url을 분석해서 그에 맞는 처리를 하는 것이다. 요청 받는 모든 url을 webroot.py 가 받는다고 하면, /list/hello 로 접근을 하든 /read/webroot 로 접근을 하든 webroot.py 가 이 주소를 받은 뒤 urls.py 에서 저런 주소 규칙이 있는지 찾아서 있으면 그 주소 규칙에 연결된 행동을 하고, 없다면 없다는 오류를 낸다.

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'^webroot/', include('webroot.foo.urls')),
    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
)

from django.conf.urls import patterns, include, url 는 바로 이전 글에서 설명한 모듈을 가져오는 부분이다.
urlpatten 라는 변수가 바로 우리가 쓸 주소 체계/규칙을 담아놓는 변수이다.
이 변수는 Django.conf.urls.defaults 에 있는 patterns 라는 함수가 만들어주는 값을 담는다.

patterns 함수는 크게 두가지 인자를 넘겨 받는다.
하나는 접두사(perfix)고, 또 하나는 주소체계(pattern)이다.
- 접두사는 patterns 함수인 첫 번째 인자로 넘기고, 두 번째 인자부터 튜플(tuple) 자료형으로 주소 체계를 넣으면 된다. 주소 체계가 3개라면 두 번째 인자부터 네 번째 인자까지 넣는 방식이다.

주소 체계 덩어리 : ('주소 규칙', '실행 할 행동 지정')

/blog 로 접근을 하면 inde_blog 라는 함수를 실행한다면
('/blog', 'index_blog')
이런 비슷한 모양으로 주소 체계 덩어리를 만드는 것이다.
('/blog', 'index_blog') , ('/blog1', 'index_blog1')

(r'^blog/ (\d+)/$' , 'webroot.blog.view.index')
문자열들은 정규표현식이다. 정규표현식은매우 강력한 문자열 처리 방식이며 일정한 규칙(pattern)을 지정하여 문자열을 다루는 데 쓴다.


Django admin mode

RoR(Ruby on Rails) 같은 웹 프레임워크들은 스카폴딩 이라는 편리하고 매력있는 기능을 제공한다. 스카폴딩은 쇠관으로 틀을 지어 건물을 짓거나 보수할 때 유용한 임시 건축 틀이다. 적어도 건축 용어로는 그러한데, 다른 분야에서 이 낱말을 쓸 때도 알맹이를 만드는 데 유용한 이시 보완 틀이라는 점에서 거의 비슷한 개념이다. 이런 스카폴딩 RoR 에서 어떻게 편리함을 제공하는 지 궁금할텐데, 여기가 아직 글쓰는 화면과 기능을 정식으로 만들지 않았는데 일단 DB에 글을 써넣어야 화면에 글이 보이게 하고 싶을 때, 임시로 글을 써넣는 기능은 아주 짧은 시간과 노력을 들여 후다닥 만들어서 필요한 상황을 편하게 해소할 수 있다.


 Django 에는 이렇게 편리한 스카폴딩 기능을 제공하지 않는다. 대신 admin 기능 (A dynamic admin interface)을 제공하는데 , 스카폴딩에서 누리는 편리함을 대부분 제공한다.  Django 는 임시 틀을 만들지도 않고 admin 이라는 미리 지어진 별도 공간에서 처리하므로 어떤점에서 보면 잔손질을 좀 더 덜하는 셈이다. admin 기능을 임시 건축물 틀이 아니라 집 그자체 라는 재밌는 표현을 쓰고 있다.

이번 글에선 글 목록 기능을 만들텐데 아직 글 쓰기 기능을 만들지 않았으니 admin 기능을 익힐 겸 admin 영역에서 글을 써보려 한다. 
 

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'webroot.blog',


admin 기능에 필요한 DB 테이블을 생성해야 하는데 간단하게

manage.py syncdb

라는 명령어를 치면 된다, 마치 blog 에 있는 models.py에 모델을 디자인 하듯이 Django.contrib.admin 에도 모델들이 정의되어 있어서 자동으로 테이블을 만드는 것이다.

이제 웹에서 admin 기능으로 접근할 수 잇게 주소 체계를 설정해야 한다. 바로 이 부분을 해야 해서 위에서 길게 urls.py 를 설명한 것이다.
우선 urls.py 를 열면

# Uncomment this for admin:
# (r'^admin/', include('django.contrib.admin.urls')), 비슷한 줄이 잇는데, 이 줄을  주석을 해제하는 것이다. 

그리고 admin 모듈을 가져와야 한다.
from django.contrib import admin 이번엔 그 아래에
 
admin.autodiscover() 코드를 추가하면 된다.
이 코드는 settings.py 에서 INSTALLED_APPS 에 admin.py를 자동으로 불러든이는 기능을 핚다.

이제 주소 규칙을 새로 해야 하는데,

(r'^admin/', include('django.contrib.admin.urls')),
 
대신에
(r'^admin/(.*)', admin.site.root), 라고 해야 한다.


이번엔 django 내장 웹서버를 구동한다 ( manage.py runserver ). 이미 django 내장 웹서버를 구동했다면 스스로 재구동한다.
그럼 뒤 웹브라우저에서 http://localhost:8000/admin 이라고 치면 Django administration 로그인 화면이 나타난다.