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

作者:铠甲巨人 时间:2022-05-17 12:00:21 

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

来源:https://www.cnblogs.com/ArmoredTitan/p/7882272.html

标签:Django,rest,framework,工具包
0
投稿

猜你喜欢

  • PyTorch两种安装方法

    2022-04-16 04:11:50
  • python进程类subprocess的一些操作方法例子

    2021-08-26 16:21:35
  • 详解Python if-elif-else知识点

    2022-02-23 16:06:23
  • 一文带你梳理Python的中级知识

    2022-03-13 14:36:29
  • python微信跳一跳系列之棋子定位像素遍历

    2023-11-04 01:27:47
  • 利用matlab与Excel交互之单元格操作

    2022-12-04 15:06:54
  • Get方法和Post方法的区别深入理解

    2023-12-09 11:42:18
  • python区块及区块链的开发详解

    2023-07-05 16:26:36
  • JavaScript实现开关等效果

    2024-04-25 13:13:55
  • 详解Python中__str__和__repr__方法的区别

    2023-02-28 17:29:17
  • 超级实用的8个Python列表技巧

    2021-01-14 06:27:12
  • 使用python实现下拉选择框和页签的方法

    2021-10-01 04:07:41
  • 玩客云折腾记录之编译 ArmBian 系统

    2022-03-07 15:28:52
  • Python编程OpenCV和Numpy图像处理库实现图片去水印

    2023-10-10 15:12:44
  • my sql存储过程学习总结

    2011-07-12 19:12:35
  • python读取word 中指定位置的表格及表格数据

    2021-04-10 02:42:21
  • 一个表单焦点效果函数

    2008-01-19 10:59:00
  • Python接口自动化之文件上传/下载接口详解

    2022-01-02 17:32:28
  • 小三角的做法与使用

    2008-10-08 10:25:00
  • python数据结构之图的实现方法

    2022-12-29 04:59:38
  • asp之家 网络编程 m.aspxhome.com