본문 바로가기
백엔드기술/개발언어

Django decorators 정의해서 사용하기

by RevFactory 2014. 3. 6.
반응형

django에서 데코레이션이란 기능을 이용하면 view별로 공통 소스를 넣지 않아도 된다.


스프링의 어노테이션하고 비슷하다고 보면 된다.


로그인에서 사용하는 데코레이션 login_required 예제


from django.contrib.auth.decorators import login_required


@login_required(login_url='/accounts/login/')

def my_view(request):

    ...



사용자 정의해서 데코레이션 사용하기


urls.py

from revfactory import views
urlpatterns = patterns('',

    url(r'index/$', views.index),

    url(r'index2/$', views.index2),

)


views.py


두개 이상지정도 가능하다.


from django.http.response import HttpResponse, HttpResponseRedirect



def ipcheck(function=None):

    def _dec(view_func):

        def _view(request, *args, **kwargs):

            ip = request.META.get("REMOTE_ADDR")

 

            if ip != "127.0.0.1":

                print "ok"

                return HttpResponseRedirect('/index2')

            else:

                print "no"

                return view_func(request, *args, **kwargs)

 

        _view.__name__ = view_func.__name__

        _view.__dict__ = view_func.__dict__

        _view.__doc__ = view_func.__doc__

        return _view

 

    if function is None:

        return _dec

    else:

        return _dec(function)

    

def ipcheck2(function=None):

    def _dec(view_func):

        def _view(request, *args, **kwargs):

            ip = request.META.get("REMOTE_ADDR")

 

            if ip == "127.0.0.1":

                print "ok1"

                return HttpResponseRedirect('/index2')

            else:

                print "no2"

                return view_func(request, *args, **kwargs)

 

        _view.__name__ = view_func.__name__

        _view.__dict__ = view_func.__dict__

        _view.__doc__ = view_func.__doc__

        return _view

 

    if function is None:

        return _dec

    else:

        return _dec(function)


@ipcheck

@ipcheck2

def index(request):

    return HttpResponse('welcome')



def index2(request):

    return HttpResponse('bye')



index접속시


[06/Mar/2014 02:49:03] "GET /index2/ HTTP/1.1" 200 3

no

ok1


반응형

댓글0