Django rest framework工具包简单用法示例
时间:2018-07-20
这篇文章主要介绍了Django rest framework工具包简单用法,结合匿名访问控制的具体实例分析了Django rest framework工具包的注册、路由设置、视图、权限控制、配置等相关操作技巧,需要的朋友可以参考下
本文实例讲述了Django rest framework工具包简单用法。分享给大家供大家参考,具体如下:
Django rest framework 工具包做API非常方便。
下面简单说一下几个功能的实现方法。
实现功能为,匿名用户访问首页一分钟能访问3次,登录用户一分钟访问6次,只有登录用户才能访问order页面。
第一步,注册app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app.apps.AppConfig', 'rest_framework', #注册 ]
settings文件注册app
第二步,定义URL,注意url路径最好使用名词。我们这里注册三个视图函数的url,实现验证,首页和定单页面。
from django.conf.urls import url from django.contrib import admin from app import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^auth/', views.AuthView.as_view()), #验证 url(r'^index/', views.IndexView.as_view()), #首页 url(r'^order/', views.OrderView.as_view()), #定单 ]
url文件设置路由
第三步,auth视图函数
from rest_framework.views import APIView from rest_framework.request import Request from django.http import JsonResponse,HttpResponse from app.utils.commons import gen_token from app.utils.auth import LuffyAuthentication from app.utils.throttle import LuffyAnonRateThrottle,LuffyUserRateThrottle from app.utils.permission import LuffyPermission from . import models class AuthView(APIView): """ 认证相关视图 由于继承了APIView,所以csrf就没有了,具体的源代码只是有一个装饰器, 加上了csrf_exempt装饰器,屏蔽了csrf 写法是在return的时候csrf_exempt(view) 和@使用装饰器效果是一样的,这种写法还可以写在url路由中。 """ def post(self,request,*args,**kwargs): """ 用户登录功能 :param request: :param args: :param kwargs: :return: """ ret = {'code': 1000, 'msg': None} # 默认要返回的信息 user = request.data.get('username') # 这里的request已经不是原来的request了 pwd = request.data.get('password') user_obj = models.UserInfo.objects.filter(user=user, pwd=pwd).first() if user_obj: tk = gen_token(user) #返回一个哈希过得字符串 #进行token验证 models.Token.objects.update_or_create(user=user_obj, defaults={'token': tk}) # 数据库存入一个token信息 ret['code'] = 1001 ret['token'] = tk else: ret['msg'] = "用户名或密码错误" return JsonResponse(ret)
上面的代码主要是实现了一个验证的功能,通过gen_token
函数来验证,并存入数据库信息。
gen_token
单独写到一个utils目录下的auth.py文件中。代码如下:
def gen_token(username): import time import hashlib ctime = str(time.time()) hash = hashlib.md5(username.encode('utf-8')) hash.update(ctime.encode('utf-8')) return hash.hexdigest()
通过时间和哈希等生成一个不重复的字符串。
第四步,index视图函数
class IndexView(APIView): """ 用户认证 http://127.0.0.1:8001/v1/index/?tk=sdfasdfasdfasdfasdfasdf 获取用户传入的Token 首页限制:request.user 匿名:5/m 用户:10/m """ authentication_classes = [LuffyAuthentication,] #认证成功返回一个用户名,一个对象,不成功就是None throttle_classes = [LuffyAnonRateThrottle,LuffyUserRateThrottle] #访问次数限制,如果合格都为True def get(self,request,*args,**kwargs): return HttpResponse('首页')
同样,将LuffyAuthentication,LuffyAnonRateThrottle,LuffyUserRateThrottle写到了utils目录下。代码如下:
auth.py :
from rest_framework.authentication import BaseAuthentication from rest_framework import exceptions from app import models class LuffyAuthentication(BaseAuthentication): def authenticate(self, request): tk = request.query_params.get('tk') if not tk: return (None,None) # raise exceptions.AuthenticationFailed('认证失败') token_obj = models.Token.objects.filter(token=tk).first() if not token_obj: return (None,None) return (token_obj.user,token_obj)
验证是否为登录用户,如果之前没有登陆过,则将token信息存到数据库
throttle.py :
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle class LuffyAnonRateThrottle(SimpleRateThrottle): scope = "luffy_anon" def allow_request(self, request, view): """ Return `True` if the request should be allowed, `False` otherwise. """ if request.user: return True # 获取当前访问用户的唯一标识 self.key = self.get_cache_key(request, view) # 根据当前用户的唯一标识,获取所有访问记录 # [1511312683.7824545, 1511312682.7824545, 1511312681.7824545] self.history = self.cache.get(self.key, []) # 获取当前时间 self.now = self.timer() # Drop any requests from the history which have now passed the # throttle duration while self.history and self.history[-1] <= self.now - self.duration: self.history.pop() if len(self.history) >= self.num_requests: #判断访问次数是否大于限制次数 return self.throttle_failure() return self.throttle_success() #返回True def get_cache_key(self, request, view): return 'throttle_%(scope)s_%(ident)s' % { 'scope': self.scope, 'ident': self.get_ident(request), # 判断是否为代理等等 } class LuffyUserRateThrottle(SimpleRateThrottle): scope = "luffy_user" def allow_request(self, request, view): """ Return `True` if the request should be allowed, `False` otherwise. """ if not request.user: #判断登录直接返回True return True # 获取当前访问用户的唯一标识 # 用户对所有页面 # self.key = request.user.user self.key = request.user.user + view.__class__.__name__ # 用户对单页面的访问限制 # 根据当前用户的唯一标识,获取所有访问记录 # [1511312683.7824545, 1511312682.7824545, 1511312681.7824545] self.history = self.cache.get(self.key, []) # 获取当前时间 self.now = self.timer() # Drop any requests from the history which have now passed the # throttle duration while self.history and self.history[-1] <= self.now - self.duration: self.history.pop() if len(self.history) >= self.num_requests: #访问次数的限制 return self.throttle_failure() return self.throttle_success() #返回True
限制匿名用户和登录用户的访问次数,需要从settings中的配置拿去配置信息。
permission.py
from rest_framework.permissions import BasePermission class LuffyPermission(BasePermission): def has_permission(self, request, view): """ Return `True` if permission is granted, `False` otherwise. """ if request.user: return True return False
权限控制
第五步,order视图函数
class OrderView(APIView): """ 订单页面:只有登录成功后才能访问 - 认证(匿名和用户) - 权限(用户) - 限制() """ authentication_classes = [LuffyAuthentication, ] permission_classes = [LuffyPermission,] #登录就返回True throttle_classes = [LuffyAnonRateThrottle, LuffyUserRateThrottle] def get(self,request,*args,**kwargs): return HttpResponse('订单')
第六步,settings配置
REST_FRAMEWORK = { 'UNAUTHENTICATED_USER': None, 'UNAUTHENTICATED_TOKEN': None, "DEFAULT_THROTTLE_RATES": { 'luffy_anon': '3/m', #匿名用户一分钟访问3次 'luffy_user': '6/m' #登录用户一分钟访问6次 }, }
最后,实现功能为,匿名用户访问首页一分钟能访问3次,登录用户一分钟访问6次,只有登录用户才能访问order页面。
学习Django rest framework需要随时查看源代码,判断源代码的逻辑思路来自定义自己的功能,如此学习效率极高。
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
- 设计模式专题(六)——原型模式
- ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件Sys.Component成员Sys.IDisposable成员Sys.INotifyDisposin
- 设计模式专题(七)——建造者模式
- ASP.NET AJAX(14)__UpdatePanel与服务器端脚本控件脚本控件的作用脚本控件的指责Extender模型脚本控件和Extender模型在PostBack中保持状态在UpdatePa
- ASP.NET AJAX(15)__构建高性能ASP.NET AJAX应用UpdatePanel的性能问题使用UpdatePanel的注意事项脚本加载避免脚本阻塞页面显示AjaxControlTool
- LINQ to SQL(1):基础入门
- 设计模式专题(十)——观察者模式
- LINQ to SQL(2):生成对象模型
- 使用 Oracle 的 Security External Password Store 功能实现数据库加密登陆
- LINQ to SQL(3):增删改查
- LINQ to SQL(4):OR设计器
- 在不同浏览器都实用的各窗口大小获取方法
- JavaScript获得对象属性个数的方法
- 设计模式专题(十一)——抽象工厂模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 彻底弄懂 Unicode 编码
- 两种使用代码获得SAP CRM product sales status的办法
- C#: "$"作用和用法
- SAP ABAP字符和字符串变量隐式转换的一些规则
- MySQL information_schema详解 COLLATION_CHARACTER_SET_APPLICABILITY
- 如何处理Angular项目在Visual Studio Code打开报关于@Decorators的警告信息
- QT 中普通数值与字符串之间的转换
- C# 时间与时间戳互转 13位
- 在C#中ref和out具体怎么使用?在什么情况下使用?
- Vs code 创建vue模版
- [892]python中re.split()方法
- MacOS抓包工具Charles
- PYTHON替代MATLAB在线性代数学习中的应用(使用Python辅助MIT 18.06 Linear Algebra学习)
- C# TCP/IP 文件(图片、视频等)收发系统
- 反制面试官 | 14张原理图 | 再也不怕被问 volatile!