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 基础学习第二弹 类属性和实例属性
Aug 27 Python
使用python检测手机QQ在线状态的脚本代码
Feb 10 Python
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python运算符重载用法实例分析
Jun 01 Python
Python自动发送邮件的方法实例总结
Dec 08 Python
Python实现的统计文章单词次数功能示例
Jul 08 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
python序列类型种类详解
Feb 26 Python
django 外键创建注意事项说明
May 20 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
python模块内置属性概念及实例
Feb 18 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
php限制文件下载速度的代码
2015/10/20 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python连接Redis的基本配置方法
2018/09/13 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
七一党建活动方案
2014/01/28 职场文书
六五普法规划实施方案
2014/03/21 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
农村党支部承诺书
2015/04/30 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
Python利用capstone实现反汇编
2022/04/06 Python