rest-framework之APIView
阿新 • • 發佈:2018-12-15
一 安裝djangorestframework
方式一:pip3 install djangorestframework
方式二:pycharm圖形化介面安裝
方式三:pycharm命令列下安裝(裝在當前工程所用的直譯器下)
二 djangorestframework的APIView分析
匯入APIView
from
as_view 方法
@classmethod def as_view(cls, **initkwargs): """ Store the original class on the view function. This allows us to discover information about the view when we do URL reverse lookups. Used for breadcrumb generation. """ if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet): def force_evaluation(): raise RuntimeError( 'Do not evaluate the `.queryset` attribute directly, ' 'as the result will be cached and reused between requests. ' 'Use `.all()` or call `.get_queryset()` instead.' ) cls.queryset._fetch_all = force_evaluation view = super(APIView, cls).as_view(**initkwargs) view.cls = cls view.initkwargs = initkwargs # Note: session based authentication is explicitly CSRF validated, # all other authentication is CSRF exempt. return csrf_exempt(view) as_view方法通過繼承父類as_view方法並且對csrf做了處理
dis_patch方法
def dispatch(self, request, *args, **kwargs): """ `.dispatch()` is pretty much the same as Django's regular dispatch, but with extra hooks for startup, finalize, and exception handling. """ self.args = args self.kwargs = kwargs request = self.initialize_request(request, *args, **kwargs) self.request = request self.headers = self.default_response_headers # deprecate? try: self.initial(request, *args, **kwargs) # Get the appropriate handler method if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) except Exception as exc: response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs) return self.response dispatch方法通過客戶端的請求方法來分發到檢視函式中cbv中的對應方法
initialize_request方法
def initialize_request(self, request, *args, **kwargs): """ Returns the initial request object. """ parser_context = self.get_parser_context(request) return Request( request, parsers=self.get_parsers(), authenticators=self.get_authenticators(), negotiator=self.get_content_negotiator(), parser_context=parser_context ) #將django中的request進行了封裝,為其添加了解析器,認證,許可權,頻率等功能
initial方法
def initial(self, request, *args, **kwargs):
"""
Runs anything that needs to occur prior to calling the method handler.
"""
self.format_kwarg = self.get_format_suffix(**kwargs)
# Perform content negotiation and store the accepted info on the request
neg = self.perform_content_negotiation(request)
request.accepted_renderer, request.accepted_media_type = neg
# Determine the API version, if versioning is in use.
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
# Ensure that the incoming request is permitted
self.perform_authentication(request)
self.check_permissions(request)
self.check_throttles(request)
initial方法(內部呼叫認證,許可權和頻率)
三 djangorestframework的Request物件簡單介紹
__getattr__ 方法
通過點號攔截方法,當物件點屬性時,找不到會觸發
__setattr__方法
賦值攔截方法,當物件點屬性賦值時,原本沒有這個屬性會觸發
data 方法
不管請求方法是什麼,request.data都會將前臺的傳送的資料轉成字典