문제

ASP.NET MVC에서는 acceptverbs 속성을 사용하여 뷰 함수를 동사와 상관시킬 수 있습니다.

public ActionResult Create()
{
    // do get stuff
} 

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
    // do post stuff
}

Django 책 다음과 같은 것을 제안합니다.

def method_splitter(request, *args, **kwargs):
    get_view = kwargs.pop('GET', None)
    post_view = kwargs.pop('POST', None)
    if request.method == 'GET' and get_view is not None:
        return get_view(request, *args, **kwargs)
    elif request.method == 'POST' and post_view is not None:
        return post_view(request, *args, **kwargs)
    raise Http404

urls.py :

urlpatterns = patterns('',
    # ...
    (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 
        'POST': views.some_page_post}),
    # ...
)

그것은 나에게 약간 추악 해 보인다 - HTTP 동사를보기, ASP.NET MVC 스타일 또는이를 수행 할 수있는 또 다른 방법과 연관시킬 수있는 데코레이터가 있습니까?

도움이 되었습니까?

해결책

특정 HTTP 방법 또는 허용 된 방법 목록이 필요한 표준 내장 장식기가 있습니다.

코드보기 : http://code.djangoproject.com/browser/django/trunk/django/views/decorators/http.py.

다른 팁

2016 년 업데이트 된 답변 : Modern Django에는 필요한 모든 것이 내장되어 있으며 수업 기반 견해. 가장 원시적 인 형태로, 정식 접근 방식은 서브 클래싱입니다. django.views.generic.View HTTP 동사의 이름을 따서 명명 된 클래스 방법을 구현합니다.

class MyView(View):
    def get(self, request, *args, **kwargs):
        # ...

    def post(self, request, *args, **kwargs):
        # ...

내부적으로 이것은 아래의 고대 코드와 매우 유사한 방식으로 작동합니다 (Django가 수업 기반 견해를 갖기 전에 작성되었습니다). 이있다 View.dispatch 기본적으로 전화 할 내용을 찾거나 405를 찾을 수없는 경우 405를 반환하는 방법 : getattr(self, request.method.lower(), self.http_method_not_allowed).

물론, 처리, 템플릿 렌더링 또는 일반적인 CRUD 작업을 수행하는 경우 사용 가능한 것을 확인하십시오. View 서브 클래스.


2009 년의 레거시 답변. 이 코드는 여전히 2016 년에 작동하지만 건식 솔루션은 아니므로 사용하지 마십시오. 2011 년 Django는 수업 기반 견해를 얻었고 요즘에는 일을 수행하는 방법입니다. 나는 이것을 역사적 목적으로 만 여기에 보관하고 있습니다. 오래된 답변 텍스트는 다음과 같습니다.

다른 HTTP 방법에 대한 별도의 코드가 있어야하는 한 가지 특별한 관점에서 (이것은 내 작은 Webdav 구현입니다) 다음과 같은 일을하고 있습니다.

class SomeView(object):
    def method_get(self, request, ...):
        ...

    def __call__(self, request, *args, **kwargs):
        m = getattr(self, 'method_%s' % request.method.lower(), None)
        if m is not None:
            return m(request, user, *args, **kwargs)
        return HttpResponseNotAllowed("405 Method Not Allowed")

# Then url(r'...', SomeView()),

추가/편집 : 글쎄, 나는 조금 생각하고 실제로 데코레이터 접근법을 구현했습니다. 내가 처음 생각했던 것만 큼 나쁘지는 않습니다.

def method_not_allowed_view(request, *args, **kwargs):
    return HttpResponseNotAllowed("405 Method Not Allowed")

def http_method(*methods):
    methods = map(lambda m: m.lower(), methods)
    def __method_wrapper(f):
        this_module = __import__(__name__)
        chain = getattr(this_module, f.__name__, method_not_allowed_view)
        base_view_func = lambda request, *args, **kwargs: \
            f(request, *args, **kwargs) if request.method.lower() in methods \
                                        else chain(request, *args, **kwargs)
        setattr(this_module, f.__name__, base_view_func)
        return base_view_func
    return __method_wrapper

@http_method('get')
def my_view(request):
    return HttpResponse("Thank you for GETting.")

@http_method('post', 'put')
def my_view(request):
    return HttpResponse("Thank you for POSTing or PUTting.")

# url(r'...', 'app.my_view'),

이 게시물은 커뮤니티 위키이기 때문에 아이디어가 마음에 들면 자유롭게 개선하십시오! 그리고 개정 내역에는 이것을 쓰기 전에 시도한 약간 다른 접근법도 포함되어 있습니다 ...

당신이 사용할 수있는 데코레이터를 봅니다

문서에서 :

from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
    # I can assume now that only GET or POST requests make it this far
    # ...
    pass
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top