DRF之三大组件

news/2024/10/30 15:28:58/

一、django路由转换器

django转换器:django 2.x以后,为了取代 re_path

-int    path('books/<str:name>')   ---->/books/1----》name=1---》当参数传入视图类的方法中-str-path-slug-uuid

二、Django配置文件

1  项目的根路径

BASE_DIR = Path(__file__).resolve().parent.parent

2 密钥

djagno中涉及到加密的,大部分都会用这个密钥

SECRET_KEY = 'django-insecure-eh=o(kt_70%8wj4r+le-7*$7t+fn%_2rfh61f09(2^&3q-5vk)'

3 是否开启调试模式

上线一定关闭

只要是调试模式:

 访问的路径不存在,他会显示出所有能访问的路径
 视图类出了异常,浏览器中能看到

DEBUG = False

4 项目部署相关

部署在某个服务器上,这个列表写,部署服务器的ip地址, * 表示任意地址都可以

ALLOWED_HOSTS = ['*']

5 内置

我们自己写的app

INSTALLED_APPS = ['django.contrib.admin',  # 后台管理---》很多表不是它的,是别的app的'django.contrib.auth',  # auth 模块,UsrInfo表----》有6个表'django.contrib.contenttypes',  # 有个django_content_type表是,这个app的'django.contrib.sessions',  # session相关的'django.contrib.messages',  # 消息框架'django.contrib.staticfiles',  # 静态文件开启的app'app01.apps.App01Config',  # app01'rest_framework'  # drf
]

6  中间件

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware',  # session相关'django.middleware.common.CommonMiddleware',  # 公共'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

7 根路由

ROOT_URLCONF = 'drf_day07.xxx'

8 模板文件所在路径

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [BASE_DIR / 'templates'],  # 必须是个列表'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]

9 项目上线,运行application

WSGI_APPLICATION = 'drf_day07.wsgi.application'

10 数据库配置

DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}

11 密码认证相关

AUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]

12 做国际化

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True

13 静态文件

STATIC_URL = '/static/'

14 数据库主键自增

默认可以不写id,id主键自增,之前全是AutoField,长度很短

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

 三、登录功能

表模型

from django.db import models# Create your models here.class UserInfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)user_type = models.IntegerField(choices=((1, '超级管理员'), (2, '普通登录用户'), (3, '2B用户')), default=3)class UserToken(models.Model):token = models.CharField(max_length=64)user = models.OneToOneField(to=UserInfo, on_delete=models.CASCADE)

视图类

class UserView(ViewSet):@action(methods=['POST'], detail=False)def login(self, request):username = request.data.get('username')password = request.data.get('password')user = UserInfo.objects.filter(name=username, password=password).first()if user:# 登录成功# 1 生成一个随机字符串 tokentoken = str(uuid.uuid4())# 2 把token存到表中,UserToken表有值就更新,没有值就新增UserToken.objects.update_or_create(user=user, defaults={'token': token})return Response({'code': 100, 'msg': '登录成功', 'token': token})else:return Response({'code': 101, 'msg': '用户名或密码错误'})

补充:

UserToken表中有user字段拿到了一个UserToken表的对象  user_token.token 就是字符串user_token.user  基于对象的跨表查询,拿到的是user对象  user_token.user.passworduser_token.user_id  隐藏了这个字段,是可以用的,它是管理的user对象的id号查询功能UserToken.objects.filter(user=user对象)UserToken.objects.filter(user_id=user.id)

路由

# 方式一:
path('login/', views.UserView.as_view({'post':'login'})),
# 路由如果这样写,是不需要使用action装饰器# 方式二:自动生成路由---》视图类中一定要用action装饰器
from rest_framework.routers import SimpleRouterrouter = SimpleRouter()
router.register('user', views.UserView, 'user')
urlpatterns = [path('admin/', admin.site.urls),
]
# http://127.0.0.1:8000/user/login/
urlpatterns += router.urls

四、认证组件

APIView执行流程

-在视图视图类的方法之前,执行了三大认证
        -认证

认证:登录认证

-登录认证---》控制,某个接口必须登录后才能访问

认证组件使用步骤(固定用法)

1 写一个类,继承BaseAuthentication

2 在类中写:authenticate
3 在方法中,完成登录认证,如果 不是登录的,抛异常
4 如果是登录的,返回登录用户和token

from rest_framework.authentication import BaseAuthentication
from .models import UserToken
from rest_framework.exceptions import AuthenticationFailedclass LoginAuth(BaseAuthentication):def authenticate(self, request):# 校验用户是否登录---》请求中携带我给的token,就是登录了# token在哪携带,是接口规定的---》# 1 规定带在请求地址中---》讲这个# 2 规定带在请求头中(这个多)# 3 规定待在请求体中# 取出token    META     HTTP_TOKENtoken = request.query_params.get('token')# 数据库中,根据token,校验有没有数据user_token = UserToken.objects.filter(token=token).first()if user_token:user = user_token.userreturn user, tokenelse:# 说明它带的token是不对的raise AuthenticationFailed('您没有登录,不能访问')

 5 在视图类中,使用认证类(局部使用)

 class BookView(APIView):authentication_classes = [LoginAuth, ] 

 6 全局使用:

重点:不要在配置文件中,导入莫名其妙的包

from rest_framework.settings
REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.LoginAuth'],}

7 全局使用后,局部禁用

 class UserView(ViewSet):# 局部禁用authentication_classes = []

8 认证类的使用顺序
        -优先用视图类配置的
        -其次用项目配置文件
        -最后用drf默认的配置

小重点;一旦通过认证,在request中就有当前登录用户

 def get(self, request):# 一旦通过认证,在request中就有当前登录用户print(request.user.name,'访问了接口')

五、权限组件

大家都登录了,但有的功能(接口),只有超级管理员能做,有的功能所有登录用户都能做----》这就涉及到权限的设计了

权限设计:比较复杂---》有acl,rbac,abac。。。

咱们现在只是为了先讲明白,drf的权限组件如何用,咱们先以最简单的为例

-查询所有图书:所有登录用户都能访问(普通用户和超级管理员)
        -其实没有权限控制
    -删除图书,只有超级管理员能访问
        -给其它用户设置的权限

权限类的使用步骤:

1 写一个类,继承BasePermission
2 在类中写方法:has_permission
        -如果有权限,就返回True
        -如果没有权限,就返回False
        -错误信息是self.message='字符串'

from rest_framework.permissions import BasePermissionclass BookPermission(BasePermission):def has_permission(self, request, view):# 如果有权限,就是返回True,没有权限,返回False# 判断user_type是不是 1,根据当前登录用户# request.user  # 就是当前登录用户,一旦来到这里,认证就通过了if request.user.user_type == 1:return Trueelse:self.message = '你好:%s,你没有权限' % request.user.namereturn False

 3 局部使用

class BookDetailView(APIView):permission_classes = [AdminPermission, ]

 4 全局使用

REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['app01.permission.AdminPermission'],}

5 局部禁用

class BookView(APIView):permission_classes = []

六、频率组件

限制访问频次
    -比如某个接口,一分钟只能访问5次,超过了就得等
    -按IP地址  限制
    -按用户id  限制

频率类的使用步骤

1 写个类,继承:SimpleRateThrottle
    2 重写某个方法:get_cache_key
        -可以返回ip或用户id
        -返回什么,就以什么做频率限制
        
    3 写一个类属性,随意命名一个名
        scope = 'ch'

from rest_framework.throttling import SimpleRateThrottleclass BookThrottling(SimpleRateThrottle):scope = 'ch'def get_cache_key(self, request, view):# 返回客户端ip地址ip = request.META.get('REMOTE_ADDR')print('客户端的ip是:', ip)return ip

4 在配置文件中配置:

'DEFAULT_THROTTLE_RATES': {'ch': '3/m' # 一分钟访问3次},

5 全局用

# 频率全局'DEFAULT_THROTTLE_CLASSES': ['app01.throttle.BookThrottling'],

 6 局部用

class BookView(APIView):throttle_classes = [MyThrottle]


http://www.ppmy.cn/news/92263.html

相关文章

使用dumpbin工具查看动态库中函数列表

一、Windows环境下如何安装dumpbin工具&#xff1f; Dumpbin是Visual Studio自带的一个命令行工具&#xff0c;用于查看可执行文件、静态库和动态库的导入表、导出表、符号表等信息。在Windows环境下&#xff0c;可以通过以下步骤安装和使用dumpbin&#xff1a; 1. 打开 Visu…

初探 Compose for Wear OS:实现一个简易选择APP

前言 俗话说&#xff0c;人生有三大难题&#xff1a;早上吃啥、中午吃啥、晚上吃啥。 这个问题一度困扰着无数的人&#xff0c;直到一款帮你选择吃什么的神器《今天吃啥》出现&#xff0c;人们再也不用为了每天吃啥而犯愁了。 哈哈&#xff0c;以上纯属抖机灵。 最近访问谷歌…

总结880

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;1800基础部分&#xff0c;背诵15篇短文&#xff0c;核心主词&#xff09; 周目标&#xff1a;1800高等数学部分并完成错题记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#xff09; 复习微分方…

算法基础学习笔记——⑦位运算

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨位运算 ✨操作一 &#x1f353;十进制转化成二进制、八进制、十六进制&#xff08;连除法&#xff09; &#x1f353;二进制、八进制、十六进制转化成十进制 &#x1f353;关于原码&#xff0c;反码&am…

【ISO14229_UDS刷写】-3-$36诊断服务TransferData理论部分

总目录&#xff1a;&#xff08;单击下方链接皆可跳转至专栏总目录&#xff09; 《UDS/OBD诊断需求编辑工具》总目录https://blog.csdn.net/qfmzhu/article/details/123697014 目录 1 $0x36 TransferData诊断服务描述 2 0x36服务请求消息 2.1 0x36服务请求消息定义 2.2 0…

SQL教程1

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中&#xff0c;您将学到如何使用 SQL 访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;MySQL、SQL Server、Access、Oracle、Sybase、DB2 等等。 SQL 简介 SQL (Structured Query Language:结构化…

OSPF协议

OSPF&#xff1a;开放式最短路径优先协议 无类别IGP协议&#xff1b;链路状态型&#xff1b;基于LSA收敛&#xff0c;故更新量较大&#xff0c;为在中大型网络正常工作&#xff0c;需要进行结构化的部署 --- 区域划分、ip地址规划 组播更新 --- 224.0.0.5 224.0.0.6 支持等开销…

八、Docker存储

Docker存储 默认情况下&#xff0c;Docker容器里产生的数据&#xff0c;如果不通过docker commit 生成新的镜像&#xff0c;使数据作为镜像的一部分保存下来&#xff0c;就会在容器删除后丢失。为了能够持久化保存和共享容器的数据&#xff0c;Docker 提出了两种管理容器内部以…