一、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

  1. from django.views import View
  2. class UsersView(View):
  3. def get(self,request):
  4. response = {'code':1000,'data':None}
  5. response['data'] = [
  6. {'name': 'haiyan', 'age': 22},
  7. {'name': 'haidong', 'age': 10},
  8. {'name': 'haixiyu', 'age': 11},
  9. ]
  10. return HttpResponse(json.dumps(response),stutas=200)
  11.  
  12. class UserView(View):
  13. def get(self,request,pk):
  14. return HttpResponse(json.dumps({'name':'haiyan','age':11})) #返回一条数据
  15. def post(self,request,pk):
  16. return HttpResponse(json.dumps({'code':1111})) #返回一条数据
  17. def put(self,request,pk):
  18. pass
  19. def delete(self,request,pk):
  20. pass
  21.  
  22. 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方法

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

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

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方法(内部调用认证,权限和频率)

restframework安装及APIView分析的更多相关文章

  1. Django 之restfromwork 源码---APIView 分析

    Django 之 djangorestframework的APIView分析 APIView 类中的as_view() 方法 首先 我们从视图函数入手,在urls.py 中的 URLconfig中添加 ...

  2. Linux安装程序Anaconda分析(续)

    本来想写篇关于Anaconda的文章,但看到这里写的这么详细,转,原文在这里:Linux安装程序Anaconda分析(续) (1) disptach.py: 下面我们看一下Dispatcher类的主要 ...

  3. drf安装与APIView初步分析

    drf安装 1. pip install djangorestframework 2. 在settings文件中注册app : INSTALLED_APPS = [..., 'rest_framewo ...

  4. Linux安装程序Anaconda分析

    1.概述     Anaconda是RedHat.CentOS.Fedora等Linux的安装管理程序.它能够提供文本.图形等安装管理方式,并支持Kickstart等脚本提供自己主动安装的功能.此外, ...

  5. Android应用程序安装过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6766010 Android系统在启动的过程中, ...

  6. 安装mysqlsla性能分析工具

    开启mysql慢查询日志 vi /etc/my.cnf slow-query-log = on  #开启MySQL慢查询功能 slow_query_log_file = /data/mysql/127 ...

  7. Apache的安装与AWstats分析系统

    实验拓扑图: 实验要求: 1.  WEB服务器: 使用源码包apache实现.安装完成后,并优化执行路径. 启动服务后,客户端通过http://IP能访问默认的网站. 2.  DNS服务器: 安装DN ...

  8. 《阿里巴巴Java开发手册》扫描插件正式发布--插件安装和使用分析

    "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 阿里巴巴于10月14日上午9:00在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发 ...

  9. facebook工具xhprof的安装与使用-分析php执行性能

    下载源码包的网址 http://pecl.php.net/package/xhprof

随机推荐

  1. fabric添加多主机ssh互信

    最近折腾fabric,把服务器ssh互信用fabric写了一遍,单向互信,master可以无密码访问client,具体如下: 执行:fab  -f ./copyrsa.py allsshkey 即可, ...

  2. Redis实现求交集操作结果缓存的设计方案

    Redis的集合操作 实话说,Redis提供的集合操作是我选择它成为内存数据库的一个主要理由,它弥补了传统关系型数据库在这方面带来的复杂度,使得只需要简单的一个命令就可以完成一个复杂SQL任务,并且交 ...

  3. git简单获取远程某个分支代码命令

    git clone resource.git git branch -a list all the local and remote branches git checkout [remote bra ...

  4. <正则吃饺子> :关于redis配置文件参数详解

    来源于网络博文,感谢作者的分享,转载只为学习,方便查找,原文地址:http://blog.csdn.net/ljl890705/article/details/51540427 Redis是一个应用非 ...

  5. Will&nbsp;you&nbsp;still&nbsp;need&nbsp;me?

    ON FRIDAY, the National Bureau of Statistics announced that China's working-age population shrank la ...

  6. js函数定义参数个数和实际传入参数的对比

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  7. Javascript实现页面左边的菜单选中项高亮显示

    在项目开发过程中,遇到一个问题 在一个模板页面中,Layout.cshtml,页面左边放了一个菜单项menu,每一项都是一个链接到一个新的页面.但所有页面都是用这个模板Layout.cshtml.需要 ...

  8. mysql由浅入深探究(三)----mysql增删改查

    通过前两节的学习,目前我们已经完成了数据库的安装,用户的创建及权限操作等相关操作,但是我们似乎我们只是隐隐约约接触到了数据库的一些基本操作,对数据库表还是比较陌生.那么现在我们呢开始了解一些数据库的一 ...

  9. SEO优化之——hreflang(多语言网站优化)

    用法格式 <link rel="alternate" href="URL" hreflang="zh-cn"> // href ...

  10. git从远程仓库gitLab上拉取指定分支到本地仓库

    例如:将gitLab 上的dev分支拉取到本地 1>与远程仓库建立连接:git remote add origin XXXXX.git 2>使用git branch 查看本地是否具有dev ...