As I am learning Django I have some questions about the handling of request methods for function based views (FBVs) in Django.
What I found for FBVs:
The URLconf doesn’t look at the request method. In other words, all request methods – POST, GET, HEAD, etc. – will be routed to the same function for the same URL.
from URL-Dispatcher.
require_http_methods(request_method_list)¶ Decorator to require that a view only accepts particular request methods
from View Decorators
Does that mean, I can restrict an URL
defined in urls.py
to a function which in turn only accepts say PUT
-Requests and in case I want to handle DELETE
said URL
is wasted, since I restricted it to PUT
?
Or otherwise, I have to "dispatch" myself within the FBV?
E.g. with request.method == 'PUT'
Alternatively for CBVs
Organization of code related to specific HTTP methods (GET, POST, etc.) can be addressed by separate methods instead of conditional branching.
from Introduction to class-based views
Does that mean, if I want to handle PUT
or DELETE
in separate functions I have to
a) use a class based view with the verbs being implemented like put()
and delete()
b) use DjangoResteFramework only for having APIViews and @api_view(['Put'])
as a decorator for FBVs?
CodePudding user response:
You can use normal FBV. I think this is not good in Django, but you can:
def myFunctionView(request, *args, **kwargs):
match request.method:
case "GET":
# do some stuff
return response_for_get
case "DELETE":
# do some stuff
return response_for_delete
case "PATCH":
# do some stuff
return response_for_path
case _: # post, put, option e.t.c
# do some stuff
return response_for_post
It is completely against Django Philosophy, but it is possible. You can made an decorator to send "method not allowed" status for some request.methods. you can use this decorator in urls.py. But i don't understand, why you want to avoid the GCBV, best part of Django views.