zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    According to TLD or attribute directive in tag file, attribute end does not accept any expressions
    Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.
    sql注入漏洞
    Servlet—简单的管理系统
    ServletContext与网站计数器
    VS2010+ICE3.5运行官方demo报错----std::bad_alloc
    java 使用相对路径读取文件
    shell编程 if 注意事项
    Ubuntu12.04下eclipse提示框黑色背景色的修改方法
    解决Ubuntu环境变量错误导致无法正常登录
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9794349.html
Copyright © 2011-2022 走看看