Frage

In ASP.NET MVC, können Sie die AcceptVerbs verwendet Attribut eine View-Funktion mit einem Verb korrelieren:

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

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

The Django Buch so etwas wie dies schon sagt:

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}),
    # ...
)

Das scheint ein wenig hässlich zu mir - gibt es einen Dekorateur, die ein HTTP-Verb mit dem Ziel verbinden können, ASP.NET MVC-Stil oder eine andere akzeptierte Art und Weise, dies zu tun

?
War es hilfreich?

Lösung

Es gibt integrierte Standard-Dekorateure für erfordern bestimmte HTTP-Methode oder die Liste der erlaubten Methoden.

Sehen Sie den Code: http: // Code. djangoproject.com/browser/django/trunk/django/views/decorators/http.py .

Andere Tipps

Aktualisiert Antwort im Jahr 2016: Moderne Django hat alles, was notwendig eingebaut und verfügbar durch das klassenbasierte Ansichten . In dem am meisten Rohform wird der kanonische Ansatz subclasssing django.views.generic.View und Implementierung von Klassenmethoden, die nach den HTTP-Verben benannt werden:

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

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

Intern funktioniert dies in einer Art und Weise sehr ähnlich zu meinem alten Code (was geschrieben wurde, bevor Django klassenbasierte Ansichten hatte). Es gibt eine Methode, die View.dispatch was sieht grundsätzlich bis zu rufen, oder 405 zurück, wenn sie nichts finden können. getattr(self, request.method.lower(), self.http_method_not_allowed)

Natürlich, wenn Sie die Formularverarbeitung zu tun, Template-Rendering oder gemeinsame CRUD Sachen, sollten Sie die verfügbaren View Subklassen überprüfen.


Legacy-Antwort aus dem Jahr 2009 unter. Der Code funktioniert noch im Jahr 2016, ist aber nicht eine trockene Lösung, so nutzt sie nicht. Im Jahr 2011 bekam Django klassenbasierte Ansichten und heute sind sie der normale Weg, wie die Dinge getan werden sollte. Ich halte dies hier nur zu historischen Zwecken. Alter Antworttext folgt:

In einem besonderen Blick, wo ich für verschiedene HTTP-Methoden separaten Code habe (dies ist meine kleine WebDAV-Implementierung), ich bin so etwas wie dies zu tun:

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()),

hinzugefügt / bearbeitet: Nun, ich habe gedacht, ein wenig und eigentlich Dekorateur Ansatz umgesetzt. Es ist nicht so schlimm, wie ich anfangs dachte.

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'),

Dieser Beitrag ein Community Wiki ist, wie auch immer, so fühlen sich frei zu verbessern, wenn Sie die Idee gefällt! Und die Revisionsgeschichte enthält auch einige etwas unterschiedlichen Ansätze Ich habe versucht, bevor das Schreiben von ...

Sie können mit Ansicht Zierer

Aus der Dokumentation:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top