Function Based Views
Saying [that class-based views] is always the superior solution is a mistake.— Nick Coghlan 클래스 기반 뷰가 항상 우수한 해결책이라고 말하는 것은 실수다.
REST framework also allows you to work with regular function based views.
레스트 프레임워크는 너가 일반적인 함수 기반 뷰로도 일할 수 있는 것을 허용한다.It provides a set of simple decorators that wrap your function based views to ensure they receive an instance of Request
(rather than the usual Django HttpRequest
) and allows them to return a Response
(instead of a Django HttpResponse
), and allow you to configure how the request is processed.
@api_view()
Signature: @api_view(http_method_names=['GET'])
The core of this functionality is the api_view
decorator, which takes a list of HTTP methods that your view should respond to.
For example, this is how you would write a very simple view that just manually returns some data:
예를 들어, 이것은 너가 매우 간단하게 작성한 어떤 데이터를 수동으로 반환하는 뷰이다.from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"})
This view will use the default renderers, parsers, authentication classes etc specified in the settings.
이 뷰는 설정안에 있는 기본 렌더러와 파서, 인증 클래스들을 사용할 것이다.By default only GET
methods will be accepted.
Other methods will respond with "405 Method Not Allowed".
다른 메서드들은 ‘405 메서드 허용하지 않음’으로 응답할 것이다.To alter this behaviour, specify which methods the view allows, like so:
이 행동을 바꾸는 것은, 해당 뷰에 다음처럼 메서드들 허용을 지정해야한다.@api_view(['GET', 'POST'])
def hello_world(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "Hello, world!"})
API policy decorators
api 정책 데코레이터To override the default settings, REST framework provides a set of additional decorators which can be added to your views.
기본 설정을 재정의 하기 위해서, 레스트 프레임워크는 너의 뷰를 더할 수 있는 추가의 데코레이터 세트를 제공한다.These must come after (below) the @api_view
decorator.
For example, to create a view that uses a throttle to ensure it can only be called once per day by a particular user, use the @throttle_classes
decorator, passing a list of throttle classes:
from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle
class OncePerDayUserThrottle(UserRateThrottle):
rate = '1/day'
@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle]) # api_view 아래에 기재, 리스트로 전달
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"})
These decorators correspond to the attributes set on APIView
subclasses, described above.
The available decorators are:
사용가능한 데코레이터는 다음과 같다.@renderer_classes(...)
랜더러 → 어떤 역할?
@parser_classes(...)
파서→ 어떤 역할?
@authentication_classes(...)
인증
@throttle_classes(...)
조절
@permission_classes(...)
권한
Each of these decorators takes a single argument which must be a list or tuple of classes.
이런 데코레이터들은 클래스를 리스트나 튜퓰형태로, 하나의 인수로 받는다.데코레이터를 사용하지 않는다면 기본값으로 될 것이고, 만약 커스텀을 위해서는 새로 설정할 값을 클래스로 만든 후, 리스트나 튜플 형태로 데코레이터에 삽입하여 넣어야 하는 것 같다.
View schema decorator
To override the default schema generation for function based views you may use the @schema
decorator.
This must come after (below) the @api_view
decorator. For example:
from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema
class CustomAutoSchema(AutoSchema):
def get_link(self, path, method, base_url):
# override view introspection here...
@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"})
This decorator takes a single AutoSchema
instance, an AutoSchema
subclass instance or ManualSchema
instance as described in the Schemas documentation.
You may pass None
in order to exclude the view from schema generation.
@api_view(['GET'])
@schema(None)
def view(request):
return Response({"message": "Will not appear in schema!"})
Summary
- 데코레이터로 메서드를 받아들인다.(플라스크와 유사)
- 기본 메서드는 get이다.
- 메서드가 여러개라면 if로 분기처리하여 사용가능하다.
- 데코레이터를 추가로 기재하여 기본값들을 커스텀할 수 있다.
- 예를들어 스로틀(제어)과 스키마(디비명세) 등