【说明】django本身有session的东西
一开始django本身有session的机制,登录后,就会往数据库里存一个session值。
admin页面登录就是,会存一个session,浏览器并保存了session,就登录成功了。
此文档就是利用了django本身有session写了个登陆和登出的方法,登录时往里session里存了东西,再后续写业务接口时,用这个东西来判断是否登录
【说明】(视图类、视图集) 都有认证和授权
只要时APIviews及后代类,都有认证和授权
此文档说明APIviews有哪些继承类 文档:视图类、视图集_A~taoker的博客-CSDN博客
认证、授权默认配置
查看源码 APIview提供了认证和授权的功能。
假如一开始就不配置 DEFAULT_PERMISSION_CLASSES、(默认为AllowAny)
不配置DEFAULT_AUTHENTICATION_CLASSES (默认为session认证)
授权器默认是: AllowAny (所以一开始定义的APIview的接口是可以直接访问的)
用视图集写的接口、 或者函数视图用到了@api_view 语法糖(APIview的后代),接口都可以响应成功
【操作一】认证方式保持默认用session, 授权改成登录才行
表示登录后,才行(再在项目的setting中 的)
REST_FRAMEWORK = {
--------
'DEFAULT_PERMISSION_CLASSES': [
#1- AllowAny不管是否有认证成功,都能获取所有权限
#2- IsAdminUser管理员(管理员需要登录)具备所有权限
#3- IsAuthenticated只要登录,就具备所有权限
#4- IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
'rest_framework.permissions.IsAuthenticated',]
---------
}
一、 使用浏览器不登录和登录时的对比
登录时访问的 admin 页面进行登录
退出再刷新一次,就不行了
Django Rest framework接口视图页,也可以配置登录按钮
只需要加一句话,页面就有了登入和登出按钮
这里的登录,和admin页面登录效果一样,也是会存一个sessionid
在外层urls.py文件中设置如下、 路由名称 是随便写的,如这里写的api/
path('api/',include('rest_framework.urls'))
原因:rest_framework 自带了一个urls,里面有login , 和 logout方法 路由和方法的配置
登录成功后,就可以访问了,还有登出按钮
postman不登录和登录对比
(只影响apiview 后代的接口)
不登录时
登录时
django restframwork的 session 认证, 用的是django本身的session,
只要一登录,获取到sessionid, 再调用接口时,放到cookies里传递,就能成功
1. postman先登录一下
这里写了一个获取session的登录接口:
- django表里存了一份: rghn0orxhwknupqflnwbcc4ycaagtfpf
- 响应header里,返回了set-cookie,里面有sessionid (postman自动把seesionid存到了cookie)
登录业务接口
利用django本身的获取session的登录,封装了登录接口
django自有的session校验机制_django用户登录session验证-CSDN博客
【补充总结】session认证方式图
这样配置好后,通过模型视图集定义的接口就可以 通过session 的方式来认证和授权
【操作二】 认证方式改成jwttoken
DEFAULT_AUTHENTICATION_CLASSES 里面 把JWTtoken写在上面,就会优先用这个
查看没有token时的效果
步骤一,改成如下配置
REST_FRAMEWORK = {
--------
# 指定使用的认证类
# a.在全局指定默认的认证类(指定认证方式)
'DEFAULT_AUTHENTICATION_CLASSES': [
# 先进行token认证
'rest_framework_simplejwt.authentication.JWTAuthentication',
# b.Session会话认证
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
],
# 指定使用的权限类
# a.在全局指定默认的权限类(当认证通过之后,可以获取何种权限)
'DEFAULT_PERMISSION_CLASSES': [
#1- AllowAny不管是否有认证成功,都能获取所有权限
#2- IsAdminUser管理员(管理员需要登录)具备所有权限
#3- IsAuthenticated只要登录,就具备所有权限
#4- IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
'rest_framework.permissions.IsAuthenticatedOrReadOnly',
],
------
}
补充:没有token,假如有sessionid 也可以登录的
步骤二:首先把 sessionid给删了,不让他用session的方式通过
查看有token时的效果
步骤三:
登录获取token,参考 【Django】基于Jwt的token认证(登录接口)_could not import 'rest_framework_jwt.authenticatio-CSDN博客
把这个token 复制到 业务接口 请求头的Authorization里,这样又请求成功了
【补充】
局部配置
除了以上介绍的全局配置,还有局部配置(优先级更高),如下图、
项目中的做法(不想读文档直接看过来了)
全局配置(配成:登录才能用)
'DEFAULT_AUTHENTICATION_CLASSES': [
# 先进行token认证
'rest_framework_simplejwt.authentication.JWTAuthentication',
# b.Session会话认证
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
],
# 指定使用的权限类
# a.在全局指定默认的权限类(当认证通过之后,可以获取何种权限)
'DEFAULT_PERMISSION_CLASSES': [
#1- AllowAny不管是否有认证成功,都能获取所有权限
#2- IsAdminUser管理员(管理员需要登录)具备所有权限
#3- IsAuthenticated只要登录,就具备所有权限
#4- IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
'rest_framework.permissions.IsAuthenticated',
],
sq的做法:在自定义的BaseModelViewSet 里面,也 设置了 授权为 IsAuthenticated
(也相当于全局配置设置了这个)
登录啊,注册啊,局部配置为 AllyowAny
其他的补充(找源码,找文件):
- 1 . 一种方式,两次shift ,适用于找文件名 (找文件见名)
- 2. 一种方式(适合找内容):
- 先不停ctrl+左键,点到源码,然后点击pycharm上方的 【靶心】按键,找到源码目录
- 在目录的 外层目录右键,选择 find in files 进行搜索