一、rest=framework之解析器

1)解析器作用。

根据提交的数据。只解析某些特定的数据。非法数据不接收,为了系统安全问题

比如解析的数据格式有

有application/json,x-www-form-urlencoded,form-data等格式

默认支持的数据类型

  1. 'rest_framework.parsers.JSONParser'
  2. 'rest_framework.parsers.FormParser'
  3. 'rest_framework.parsers.MultiPartParser'

2)解析器局部配置

定义路由:url(r'^books/', views.Book.as_view()),

视图函数配置

  1. from rest_framework.parsers import JSONParser # 只能解析json格式
  2. class Book(APIView):
  3. parser_classes = [JSONParser, ] # 如果加上这行只支持json格式,不加都支持
  4. def get(self,request,*args,**kwargs):
  5. return HttpResponse('OK')
  6. def post(self,request):
  7. print(request.data)
  8. return HttpResponse('post')

实例

说明不支持该格式

2)全局配置。在settings.py的最后加入配置,一般实际工作中,都使用json格式

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PARSER_CLASSES':[
  3. 'rest_framework.parsers.JSONParser'
  4. #'rest_framework.parsers.FormParser'
  5. #'rest_framework.parsers.MultiPartParser'
  6. ]}

视图函数,则不需要再添加了

3)全局配置+局部配置

解析器查询顺序,先从本地函数==》settings.py配置 ===》系统函数

即某函数需要用多个解析器,则单独配置,就不走全局配置了

 二、rest=framework之认证组件

1)用户登录测试

1.1)先创建用户表

  1. # 认证的表
  2. class User(models.Model):
  3. nid = models.AutoField(primary_key=True)
  4. name= models.CharField(max_length=)
  5. pwd=models.CharField(max_length=,null=True)
  6.  
  7. class UserToken(models.Model):
  8. user = models.OneToOneField(to=User,to_field='nid')
  9. token=models.CharField(max_length=)

用户认证相关表

1.2)定义路由系统

url(r'^login/', views.Login.as_view()),

1.3)创建视图函数

  1. # 认证组件
  2. import hashlib,time
  3. def get_token(username):
  4. md = hashlib.md5()
  5. md.update(username.encode('utf-8'))
  6. md.update(str(time.time()).encode('utf-8'))
  7. return md.hexdigest()
  8.  
  9. class Login(APIView):
  10. def post(self,requeset):
  11. response = MyResponse()
  12. name = requeset.data.get('name')
  13. pwd = requeset.data.get('pwd')
  14. user = models.User.objects.filter(name=name,pwd=pwd).first()
  15. if user:
  16. response.msg='登陆成功'
  17. # 需要生成一个随机字符串
  18. token=get_token(name)
  19. response.token=get_token(name)
  20. # 吧随机字符串保存到数据库
  21. #ret = models.UserToken.objects.update_or_create(user_id=user.id,kwargs={'token':token}) # 都可以
  22. ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
  23. else:
  24. response.msg='用户名或密码错误'
  25. response.status=
  26. return JsonResponse(response.get_dic)

class Login

1.4)登录测试

2)用户登录之后才能访问数据测试

2.1)查看定义的路由

  1. url(r'^books/', views.Book.as_view()),
  2. url(r'^login/', views.Login.as_view()),

2.2)查看自己定义的序列化组件

  1. from rest_framework import serializers
  2. from app01 import models
  3.  
  4. class BookSer(serializers.ModelSerializer):
  5. class Meta:
  6. model = models.Book
  7. exclude=['authors']
  8. name = serializers.CharField(error_messages={'required':'该字段必填'})

myserial.py

2.3)创建视图函数

  1. # 认证组件
  2. import hashlib,time
  3. def get_token(username):
  4. md = hashlib.md5()
  5. md.update(username.encode('utf-8'))
  6. md.update(str(time.time()).encode('utf-8'))
  7. return md.hexdigest()
  8.  
  9. class Login(APIView):
  10. def post(self,requeset):
  11. response = MyResponse()
  12. name = requeset.data.get('name')
  13. pwd = requeset.data.get('pwd')
  14. user = models.User.objects.filter(name=name,pwd=pwd).first()
  15. if user:
  16. response.msg='登陆成功'
  17. # 需要生成一个随机字符串
  18. token=get_token(name)
  19. response.token=get_token(name)
  20. # 吧随机字符串保存到数据库
  21. #ret = models.UserToken.objects.update_or_create(user_id=user.id,kwargs={'token':token}) # 都可以
  22. ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
  23. else:
  24. response.msg='用户名或密码错误'
  25. response.status=
  26. return JsonResponse(response.get_dic)
  27.  
  28. from app01 import myserial
  29. class Book(APIView):
  30. def get(self,request):
  31. # 必须登录才能反问数据库
  32. # token = request.GET.get('token')
  33. token = request.query_params.get('token')
  34. ret = models.UserToken.objects.filter(token=token).first()
  35. response = MyResponse()
  36. if ret:
  37. books=models.Book.objects.all()
  38. ret = myserial.BookSer(instance=books,many=True)
  39. response.msg = '查询成功'
  40. response.data=ret.data
  41. else:
  42. response.msg = '没有登录'
  43. response.status=
  44. return JsonResponse(response.get_dic,safe=False)

Class Login and Books

2.4)登录测试

3)抽取验证是否登录功能,测试(减少重复验证登录的代码冗余)

只修改了视图函数的方法

  1. import hashlib,time
  2. def get_token(username):
  3. md = hashlib.md5()
  4. md.update(username.encode('utf-8'))
  5. md.update(str(time.time()).encode('utf-8'))
  6. return md.hexdigest()
  7.  
  8. class Login(APIView):
  9. def post(self,requeset):
  10. response = MyResponse()
  11. name = requeset.data.get('name')
  12. pwd = requeset.data.get('pwd')
  13. user = models.User.objects.filter(name=name,pwd=pwd).first()
  14. if user:
  15. response.msg='登陆成功'
  16. token=get_token(name)
  17. response.token=get_token(name)
  18. ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
  19. else:
  20. response.msg='用户名或密码错误'
  21. response.status=
  22. return JsonResponse(response.get_dic)
  23.  
  24. from rest_framework.exceptions import AuthenticationFailed
  25. class myAuthen():
  26. def authenticate(self,request):
  27. token=request.query_params.get('token')
  28. ret = models.UserToken.objects.filter(token=token).first()
  29. if ret:
  30. return ret.user,ret
  31. else:
  32. raise AuthenticationFailed('您没有登录')
  33. def authenticate_header(self,value):
  34. # 该函数一定要写
  35. pass
  36.  
  37. from app01 import myserial
  38. class Book(APIView):
  39. authentication_classes = [myAuthen,]
  40. def get(self,request):
  41. response = MyResponse()
  42. books=models.Book.objects.all()
  43. ret = myserial.BookSer(instance=books,many=True)
  44. response.msg = '查询成功'
  45. response.data=ret.data
  46. return JsonResponse(response.get_dic,safe=False)

3.1)调试模式,打印输出登录的用户,即携带的token

  1. from app01 import myserial
  2. class Book(APIView):
  3. authentication_classes = [myAuthen,]
  4. def get(self,request):
  5. response = MyResponse()
  6. print(request.user.name) # 打印用户
  7. print(request.auth.token) # 携带的token
  8. books=models.Book.objects.all()
  9. ret = myserial.BookSer(instance=books,many=True)
  10. response.msg = '查询成功'
  11. response.data=ret.data
  12. return JsonResponse(response.get_dic,safe=False)

3.2)处理 该函数 authenticate_header 内容为pass 的问题。需要继承 BaseAuthentication 才可删除该无用函数

完善认证组件代码

  1. import hashlib,time
  2. def get_token(username):
  3. md = hashlib.md5()
  4. md.update(username.encode('utf-8'))
  5. md.update(str(time.time()).encode('utf-8'))
  6. return md.hexdigest()
  7.  
  8. class Login(APIView):
  9. def post(self,requeset):
  10. response = MyResponse()
  11. name = requeset.data.get('name')
  12. pwd = requeset.data.get('pwd')
  13. user = models.User.objects.filter(name=name,pwd=pwd).first()
  14. if user:
  15. response.msg='登陆成功'
  16. token=get_token(name)
  17. response.token=get_token(name)
  18. ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
  19. else:
  20. response.msg='用户名或密码错误'
  21. response.status=
  22. return JsonResponse(response.get_dic)
  23.  
  24. from rest_framework.exceptions import AuthenticationFailed
  25. from rest_framework.authentication import BaseAuthentication
  26. class myAuthen(BaseAuthentication):
  27. def authenticate(self,request):
  28. token=request.query_params.get('token')
  29. ret = models.UserToken.objects.filter(token=token).first()
  30. if ret:
  31. return ret.user,ret
  32. else:
  33. raise AuthenticationFailed('您没有登录')
  34.  
  35. from app01 import myserial
  36. class Book(APIView):
  37. authentication_classes = [myAuthen,]
  38. def get(self,request):
  39. response = MyResponse()
  40. print(request.user.name) # 打印用户
  41. print(request.auth.token) # 携带的token
  42. books=models.Book.objects.all()
  43. ret = myserial.BookSer(instance=books,many=True)
  44. response.msg = '查询成功'
  45. response.data=ret.data
  46. return JsonResponse(response.get_dic,safe=False)

3.3)认证组件总结

  1. 作用:校验是否登录
  2. 首先定义一个类,继承BaseAuthentication,写一个方法authenticate,在方法内部实现认证过程,
  3. 认证通过,返回None或者两个对象(user,auth),在视图类的request中可以取出来。这2个对象也可以是任意2个对象
  4.  
  5. from rest_framework.authentication import BaseAuthentication
  6. class myAuthen(BaseAuthentication):
  7. def authenticate(self,request):
  8. token=request.query_params.get('token')
  9. ret = models.UserToken.objects.filter(token=token).first()
  10. if ret:
  11. # return ret.user, ret
  12. # 要写多个认证类,这个的返回None
  13. # 最后一个认证类,返回这俩值
  14. return ret.user,ret
  15. else:
  16. raise AuthenticationFailed('您没有登录')
  17.  
  18. 局部使用:在视图类中(可以写多个)
  19. authentication_classes = [myAuthen,]
  20. 全局使用:在settings.py中写入
  21. 注意:、全局使用时,认证组件不可以放在视图函数内
  22. 、写了全局,局部就要删掉
  23. 、在登录函数中,也会走认证组件,而登录是不要认证的
  24. 需要在登录中添加:authentication_classes = []
  25. class Login(APIView):
  26. authentication_classes = []
  27. def post(self,requeset):
  28. ......

全局使用实例

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PARSER_CLASSES':[
  3. 'rest_framework.parsers.JSONParser'
  4. # 'rest_framework.parsers.FormParser'
  5. # 'rest_framework.parsers.MultiPartParser'
  6. ],
  7. "DEFAULT_AUTHENTICATION_CLASSES":["app01.views.myAuthen",]
  8. }

token不存数据库方式,请参照

原文链接:https://www.cnblogs.com/liuqingzheng/articles/9766397.html

二、rest=framework之权限组件

  1. 作用:校验用户是否有权限访问
  2. 因为是在认证通过才执行的,所以可以取出user

创建类

  1. class User(models.Model):
  2. nid = models.AutoField(primary_key=True)
  3. name = models.CharField(max_length=32)
  4. pwd=models.CharField(max_length=32,null=True)
  5. mychoice=((1,'普通用户'),(2,'超级用户'),(3,'宇宙用户'))
  6. usertyle=models.IntegerField(choices=mychoice,default=1)

mychoice选择类型

2.1)定义权限组件

  1. # 权限组件
  2. class myPermission():
  3. message = '不是超超级用户,查看不了'
  4. def has_permission(self,request,view):
  5. print(request.user.usertype)
  6. if request.user.usertype !=:
  7. return False
  8. else:
  9. return True

使用和认证组件的方法一样,只是要写在认证组件之后

  1. from app01 import myserial
  2. from app01.auth import myPermission
  3. class Book(APIView):
  4. authentication_classes = [myAuthen,]
  5. permission_classes = [myPermission,]
  6. def get(self,request):
  7. response = MyResponse()
  8. # print(request.user.name) # 打印用户
  9. # print(request.auth.token) # 携带的token
  10. books=models.Book.objects.all()
  11. ret = myserial.BookSer(instance=books,many=True)
  12. response.msg = '查询成功'
  13. response.data=ret.data
  14. return JsonResponse(response.get_dic,safe=False)

视图

2.2)继承权限:from rest_framework.permissions import BasePermission

  1. from rest_framework.permissions import BasePermission
  2. class myPermission(BasePermission):
  3. message = '不是超超级用户,查看不了'
  4. def has_permission(self,request,view):
  5. print(request.user.usertype)
  6. if request.user.usertype !=:
  7. return False
  8. else:
  9. return True

class myPermission

Django高级篇三。restful的解析器,认证组件,权限组件的更多相关文章

  1. Django高级篇一RESTful架构及API设计

    一.什么是RESTful架构? 通过互联网通信,建立在分布式体系上"客户端/服务器模式”的互联网软件,具有高并发和高延时的特点. 简单的来说,就是用开发软件的模式开发网站.网站开发,完全可以 ...

  2. day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等

     DjangoRsetFramework学习---restful规范,解析器组件,Postman等           本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...

  3. 基于Django的Rest Framework框架的解析器

    本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...

  4. Django rest framework(5)----解析器

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  5. Python爬虫开发【第1篇】【beautifulSoup4解析器】

    CSS 选择器:BeautifulSoup4 Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. pip 安装:pip instal ...

  6. Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

    在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...

  7. rest认证组件,权限组件,频率组件,url注册器,响应器组件,分页器组件

    1.认证组件 1.1 认证组件利用token来实现认证 1.2 token认证的大概流程 用户登录===>获取用户名和密码===>查询用户表 如果用户存在,生成token,否则返回错误信息 ...

  8. $Django Rest Framework-认证组件,权限组件 知识点回顾choices,on_delete

    一 小知识点回顾 #orm class UserInfo (models.Model): id = models.AutoField (primary_key=True) name = models. ...

  9. JAVA高级篇(三、JVM编译机制、类加载机制)

    一.类的加载过程 JVM将类的加载分为3个步骤: 1.装载(Load) 2.链接(Link) 3.初始化(Initialize) 其中 链接(Link)又分3个步骤,如下图所示: 1) 装载:查找并加 ...

随机推荐

  1. logback不输出日志消息,且SLF4J绑定源错误

    我之前的项目已经成功使用过logback作为日志输出,但是今天新项目在使用的时候,不输出日志信息. 最后终于找到问题所在,并成功解决.解决步骤如下: 第一步:检查pom.xml 按照以往惯例,我先检查 ...

  2. JNDI在Spring和tomcat下的使用

    1. 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一.JNDI 在 J2EE 中的角色就是&q ...

  3. iOS ReactiveCocoa的使用

    一.ReactiveCocoa简介 reactiveCocoa简称RAC,它是一个三方框架,很多人把它叫做函数响应式编程框架,因为它具有函数式编程和响应式编程的特性. 由于该框架的编程思想,使得它具有 ...

  4. shell脚本(一)

     shell脚本(一) 定义:脚本就是一条条命令的堆积.常见脚本有:js asp,jsp,php,python Shell特点:简单易用高效 Shell分类:图形界面(gui shell) 命令行界面 ...

  5. Oracle 学习笔记(二)

    一.索引 表的数据是无序的,所以叫堆表(heap table),意思为随机存储数据.因为数据是随机存储的,所以在查询的时候需要全表扫描.索引就是将无序的数据有序化,这样就可以在查询数据的时候 减少数据 ...

  6. Python 内置os模块的简单实用

    获取路径&目录添加文件 在自动化测试的过程,考虑到工程文件的移动或者在其他人的工作环境中运行,所以我们的路径要灵活,不能把路径写死. 推荐使用Python的内置模块OS 参照图 import ...

  7. dubbo实现原理介绍

      一.什么是dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,     ...

  8. 解决PHP使用POST提交数据不完整,数据不全的问题

    在后台form中,通过ajax请求返回了一个有很多input的form表单,提交数据后,要格式化数组时发现提交过来的数据不完整. PHP从5.3.9开始 php.ini 增加一个变量 max_inpu ...

  9. SpringBoot +Jpa+ Hibernate+Mysql工程

    1 使用工具workspace-sts 3.9.5.RELEASE (1)新建一个SpringBoot 项目,选择加载项目需要的的组件.DevTools,JPA,Web,Mysql. Finish.  ...

  10. get_time

    def get_current_time(): #将python的datetime转换为unix时间戳 dtime = datetime.datetime.now() un_time = time.m ...