restframework安装及APIView分析

一、restframework的安装

方式一:pip3 install djangorestframework

方式二:pycharm图形化界面安装

方式三:pycharm命令行下安装(装在当前工程所用的解释器下)

 

二、基于Django实现的API(不带restframework)

FBV

 1 from django.shortcuts import render,HttpResponse
 2 
 3 # Create your views here.
 4 import json
 5 
 6 def users(request):
 7     response = {'code':1000,'data':None}  #code用来表示状态,比如1000代表成功,1001代表
 8     response['data'] = [
 9         {'name':'haiyan','age':22},
10         {'name':'haidong','age':10},
11         {'name':'haixiyu','age':11},
12     ]
13     return HttpResponse(json.dumps(response))  #返回多条数据
14 
15 def user(request,pk):
16     if request.method =='GET':
17         return HttpResponse(json.dumps({'name':'haiyan','age':11}))  #返回一条数据
18     elif request.method =='POST':
19         return HttpResponse(json.dumps({'code':1111}))  #返回一条数据
20     elif request.method =='PUT':
21         pass
22     elif request.method =='DELETE':
23         pass
24 
25 views

 

CBV

from django.views import View
class UsersView(View):
    def get(self,request):
        response = {'code':1000,'data':None}
        response['data'] = [
            {'name': 'haiyan', 'age': 22},
            {'name': 'haidong', 'age': 10},
            {'name': 'haixiyu', 'age': 11},
        ]
        return HttpResponse(json.dumps(response),stutas=200)

class UserView(View):
    def get(self,request,pk):
        return HttpResponse(json.dumps({'name':'haiyan','age':11}))  #返回一条数据
    def post(self,request,pk):
        return HttpResponse(json.dumps({'code':1111}))  #返回一条数据
    def put(self,request,pk):
        pass
    def delete(self,request,pk):
        pass

views

 

三、restframework里封装的APIView分析

基于django实现的API许多功能都需要我们自己开发,这时候djangorestframework就给我们提供了方便,直接基于它来返回数据,总之原理都是一样的,就是给一个接口也就是url,让前端的人去请求这个url去获取数据,在页面上显示出来。这样也就达到了前后端分离的效果。

as_view方法

 

 1 @classmethod
 2     def as_view(cls, **initkwargs):
 3         """
 4         Store the original class on the view function.
 5 
 6         This allows us to discover information about the view when we do URL
 7         reverse lookups.  Used for breadcrumb generation.
 8         """
 9         if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
10             def force_evaluation():
11                 raise RuntimeError(
12                     'Do not evaluate the `.queryset` attribute directly, '
13                     'as the result will be cached and reused between requests. '
14                     'Use `.all()` or call `.get_queryset()` instead.'
15                 )
16             cls.queryset._fetch_all = force_evaluation
17 
18         view = super(APIView, cls).as_view(**initkwargs)
19         view.cls = cls
20         view.initkwargs = initkwargs
21 
22         # Note: session based authentication is explicitly CSRF validated,
23         # all other authentication is CSRF exempt.
24         return csrf_exempt(view)
25 
26 as_view方法
View Code

 

dispatch方法

 1 def dispatch(self, request, *args, **kwargs):
 2         """
 3         `.dispatch()` is pretty much the same as Django's regular dispatch,
 4         but with extra hooks for startup, finalize, and exception handling.
 5         """
 6         self.args = args
 7         self.kwargs = kwargs
 8         request = self.initialize_request(request, *args, **kwargs)
 9         self.request = request
10         self.headers = self.default_response_headers  # deprecate?
11 
12         try:
13             self.initial(request, *args, **kwargs)
14 
15             # Get the appropriate handler method
16             if request.method.lower() in self.http_method_names:
17                 handler = getattr(self, request.method.lower(),
18                                   self.http_method_not_allowed)
19             else:
20                 handler = self.http_method_not_allowed
21 
22             response = handler(request, *args, **kwargs)
23 
24         except Exception as exc:
25             response = self.handle_exception(exc)
26 
27         self.response = self.finalize_response(request, response, *args, **kwargs)
28         return self.response
29 
30 dispatch
View Code

initialize_request

 1 def initialize_request(self, request, *args, **kwargs):
 2         """
 3         Returns the initial request object.
 4         """
 5         parser_context = self.get_parser_context(request)
 6 
 7         return Request(
 8             request,
 9             parsers=self.get_parsers(),
10             authenticators=self.get_authenticators(),
11             negotiator=self.get_content_negotiator(),
12             parser_context=parser_context
13         )
14 
15 initialize_request
View Code

initial方法(内部调用认证,权限和频率)

 1 def initial(self, request, *args, **kwargs):
 2         """
 3         Runs anything that needs to occur prior to calling the method handler.
 4         """
 5         self.format_kwarg = self.get_format_suffix(**kwargs)
 6 
 7         # Perform content negotiation and store the accepted info on the request
 8         neg = self.perform_content_negotiation(request)
 9         request.accepted_renderer, request.accepted_media_type = neg
10 
11         # Determine the API version, if versioning is in use.
12         version, scheme = self.determine_version(request, *args, **kwargs)
13         request.version, request.versioning_scheme = version, scheme
14 
15         # Ensure that the incoming request is permitted
16         self.perform_authentication(request)
17         self.check_permissions(request)
18         self.check_throttles(request)
19 
20 initial方法(内部调用认证,权限和频率)
View Code

 

 

 

posted @ 2018-10-15 20:14  Roc_Atlantis  阅读(211)  评论(0编辑  收藏  举报