一、rest=framework之解析器

1)解析器作用。

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

比如解析的数据格式有

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

默认支持的数据类型

'rest_framework.parsers.JSONParser'
'rest_framework.parsers.FormParser'
'rest_framework.parsers.MultiPartParser'

2)解析器局部配置

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

视图函数配置

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

实例

说明不支持该格式

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

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser'
#'rest_framework.parsers.FormParser'
#'rest_framework.parsers.MultiPartParser'
]}

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

3)全局配置+局部配置

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

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

 二、rest=framework之认证组件

1)用户登录测试

1.1)先创建用户表

# 认证的表
class User(models.Model):
nid = models.AutoField(primary_key=True)
name= models.CharField(max_length=)
pwd=models.CharField(max_length=,null=True) class UserToken(models.Model):
user = models.OneToOneField(to=User,to_field='nid')
token=models.CharField(max_length=)

用户认证相关表

1.2)定义路由系统

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

1.3)创建视图函数

# 认证组件
import hashlib,time
def get_token(username):
md = hashlib.md5()
md.update(username.encode('utf-8'))
md.update(str(time.time()).encode('utf-8'))
return md.hexdigest() class Login(APIView):
def post(self,requeset):
response = MyResponse()
name = requeset.data.get('name')
pwd = requeset.data.get('pwd')
user = models.User.objects.filter(name=name,pwd=pwd).first()
if user:
response.msg='登陆成功'
# 需要生成一个随机字符串
token=get_token(name)
response.token=get_token(name)
# 吧随机字符串保存到数据库
#ret = models.UserToken.objects.update_or_create(user_id=user.id,kwargs={'token':token}) # 都可以
ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
else:
response.msg='用户名或密码错误'
response.status=
return JsonResponse(response.get_dic)

class Login

1.4)登录测试

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

2.1)查看定义的路由

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

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

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

myserial.py

2.3)创建视图函数

# 认证组件
import hashlib,time
def get_token(username):
md = hashlib.md5()
md.update(username.encode('utf-8'))
md.update(str(time.time()).encode('utf-8'))
return md.hexdigest() class Login(APIView):
def post(self,requeset):
response = MyResponse()
name = requeset.data.get('name')
pwd = requeset.data.get('pwd')
user = models.User.objects.filter(name=name,pwd=pwd).first()
if user:
response.msg='登陆成功'
# 需要生成一个随机字符串
token=get_token(name)
response.token=get_token(name)
# 吧随机字符串保存到数据库
#ret = models.UserToken.objects.update_or_create(user_id=user.id,kwargs={'token':token}) # 都可以
ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
else:
response.msg='用户名或密码错误'
response.status=
return JsonResponse(response.get_dic) from app01 import myserial
class Book(APIView):
def get(self,request):
# 必须登录才能反问数据库
# token = request.GET.get('token')
token = request.query_params.get('token')
ret = models.UserToken.objects.filter(token=token).first()
response = MyResponse()
if ret:
books=models.Book.objects.all()
ret = myserial.BookSer(instance=books,many=True)
response.msg = '查询成功'
response.data=ret.data
else:
response.msg = '没有登录'
response.status=
return JsonResponse(response.get_dic,safe=False)

Class Login and Books

2.4)登录测试

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

只修改了视图函数的方法

import hashlib,time
def get_token(username):
md = hashlib.md5()
md.update(username.encode('utf-8'))
md.update(str(time.time()).encode('utf-8'))
return md.hexdigest() class Login(APIView):
def post(self,requeset):
response = MyResponse()
name = requeset.data.get('name')
pwd = requeset.data.get('pwd')
user = models.User.objects.filter(name=name,pwd=pwd).first()
if user:
response.msg='登陆成功'
token=get_token(name)
response.token=get_token(name)
ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
else:
response.msg='用户名或密码错误'
response.status=
return JsonResponse(response.get_dic) from rest_framework.exceptions import AuthenticationFailed
class myAuthen():
def authenticate(self,request):
token=request.query_params.get('token')
ret = models.UserToken.objects.filter(token=token).first()
if ret:
return ret.user,ret
else:
raise AuthenticationFailed('您没有登录')
def authenticate_header(self,value):
# 该函数一定要写
pass from app01 import myserial
class Book(APIView):
authentication_classes = [myAuthen,]
def get(self,request):
response = MyResponse()
books=models.Book.objects.all()
ret = myserial.BookSer(instance=books,many=True)
response.msg = '查询成功'
response.data=ret.data
return JsonResponse(response.get_dic,safe=False)

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

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

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

完善认证组件代码

import hashlib,time
def get_token(username):
md = hashlib.md5()
md.update(username.encode('utf-8'))
md.update(str(time.time()).encode('utf-8'))
return md.hexdigest() class Login(APIView):
def post(self,requeset):
response = MyResponse()
name = requeset.data.get('name')
pwd = requeset.data.get('pwd')
user = models.User.objects.filter(name=name,pwd=pwd).first()
if user:
response.msg='登陆成功'
token=get_token(name)
response.token=get_token(name)
ret = models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
else:
response.msg='用户名或密码错误'
response.status=
return JsonResponse(response.get_dic) from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication
class myAuthen(BaseAuthentication):
def authenticate(self,request):
token=request.query_params.get('token')
ret = models.UserToken.objects.filter(token=token).first()
if ret:
return ret.user,ret
else:
raise AuthenticationFailed('您没有登录') from app01 import myserial
class Book(APIView):
authentication_classes = [myAuthen,]
def get(self,request):
response = MyResponse()
print(request.user.name) # 打印用户
print(request.auth.token) # 携带的token
books=models.Book.objects.all()
ret = myserial.BookSer(instance=books,many=True)
response.msg = '查询成功'
response.data=ret.data
return JsonResponse(response.get_dic,safe=False)

3.3)认证组件总结

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

全局使用实例

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser'
# 'rest_framework.parsers.FormParser'
# 'rest_framework.parsers.MultiPartParser'
],
"DEFAULT_AUTHENTICATION_CLASSES":["app01.views.myAuthen",]
}

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

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

二、rest=framework之权限组件

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

创建类

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

mychoice选择类型

2.1)定义权限组件

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

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

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

视图

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

from rest_framework.permissions import BasePermission
class myPermission(BasePermission):
message = '不是超超级用户,查看不了'
def has_permission(self,request,view):
print(request.user.usertype)
if request.user.usertype !=:
return False
else:
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. MyEclipse 10 + OsChina GIt项目托管

    环境:Egit+MyEclipse 10,此教程默认MyEclipse 10和Egit都已经配置好. 1.注册OsChina Git账号,网址:http://git.oschina.net/,具体注册 ...

  2. mybatis的动态sql编写以及一对一关系查询和一对多的查询

    创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis **************** ...

  3. sweetalert弹窗的使用

    之前接触到layer弹出层,今天又发现了一个非常实用的弹出层插件,它的名字叫做sweetalert. 官网地址:http://t4t5.github.io/sweetalert/ npm下载方式:np ...

  4. mysql六种日志

    错误日志 MySQL服务启动和关闭过程中的信息以及其它错误和警告信息.默认在数据目录下 普通查询日志 用于记录select查询语句的日志.general_log.general_log_file 默认 ...

  5. sqlserver数据库镜像运行模式

    运行模式: 从大层面来说,SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作.可以从图1-1中查看运行模式. 在高性能模式下,主体服务器不需要等待镜 ...

  6. Python的随机数模块

    random模块中几个随机函数用法. 引入random模块: import random 1.random.random() 此函数用于生成一个0到1的随机浮点数:0 <= n < 1.0 ...

  7. gdb 使用

    2018年7月27日21:05:16 —— 多进程调试 1.follow_fork_mode 作用:在fork之后跟随父进程还是子进程 可以使用 show follow_fork_mode查看再for ...

  8. RMI(远程方法调用)入门

    这两篇可以入门 http://www.cnblogs.com/ninahan0419/archive/2009/06/25/javarmi.html http://www.cnblogs.com/wx ...

  9. python使用细节

    python的函数位置参数在调用时可以直接传参,也可以a=5,b=7的形式传参,原以为kw参数才可以. >>> def f(a,b): print a+b >>> ...

  10. pyqt5.0 GraphicsView框架

    场景(The Scene) QGraphicsScene提供图形视图场景.该场景具有以下职责: 提供用于管理大量图元的快速界面(锅) 将事件传播到每个图元(把螃蟹烧熟了) 管理图元状态,例如选择和焦点 ...