Django rest framework工具包简单用法示例


Posted in Python onJuly 20, 2018

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
Python中数字以及算数运算符的相关使用
Oct 12 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
Python笔记之facade模式
Nov 20 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
python 实现矩阵按对角线打印
Nov 29 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
浅谈Python3中print函数的换行
Aug 05 Python
python爬虫工具例举说明
Nov 30 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
Elasticsearch 聚合查询和排序
Apr 19 Python
Django 中使用流响应处理视频的方法
Jul 20 #Python
Python实现手写一个类似django的web框架示例
Jul 20 #Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 #Python
python实现求两个字符串的最长公共子串方法
Jul 20 #Python
Django基础知识与基本应用入门教程
Jul 20 #Python
opencv python 2D直方图的示例代码
Jul 20 #Python
Linux下python制作名片示例
Jul 20 #Python
You might like
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
第三节--定义一个类
2006/11/16 PHP
PHP经典面试题集锦
2015/03/19 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
js的with语句使用方法
2007/09/21 Javascript
extjs fckeditor集成代码
2009/05/10 Javascript
Ionic快速安装教程
2016/06/03 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
python批量获取html内body内容的实例
2019/01/02 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
Python实现像awk一样分割字符串
2020/09/15 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
植物选择:Botanic Choice
2017/02/15 全球购物
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
出纳试用期自我鉴定
2014/04/07 职场文书
干部考核评语
2014/04/29 职场文书
认错检讨书
2014/10/02 职场文书
看雷锋电影观后感
2015/06/10 职场文书
会议主持词结束语
2015/07/03 职场文书
学术研讨会主持词
2015/07/04 职场文书