python国际认证_从小白到小黑 python学习之旅 日常总结 86(drf 路由 认证)

目录

一 路由Routers

对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。

REST framework提供了两个router

SimpleRouter

DefaultRouter

1.1 使用方法

1) 创建router对象,并注册视图集,例如

1

2

3

4

from rest_framework import routers

router = routers.SimpleRouter()

router.register(r'router_stu', StudentModelViewSet, base_name='student')

register(prefix, viewset, base_name)

prefix 该视图集的路由前缀

viewset 视图集

base_name 路由别名的前缀

如上述代码会形成的路由如下:

1

2

^books/$ name: book-list

^books/{pk}/$ name: book-detail

2)添加路由数据

可以有两种方式:

1

2

3

4

urlpatterns = [

...

]

urlpatterns += router.urls

1

2

3

4

urlpatterns = [

...

url(r'^', include(router.urls))

]

1.2 代码演示

使用路由类给视图集生成了路由地址

1

2

3

4

5

6

7

8

9

10

# 必须是继承ModelViewSet的视图类才能自动生成路由

from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet

class StudentModelViewSet(ModelViewSet):

queryset = Student.objects.all()

serializer_class = StudentModelSerializer

# 这种方法不会自动生成,需要用action配置

def login(self,request):

"""学生登录功能"""

print(self.action)

return Response({"message":"登录成功"})

路由代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

from django.urls import path, re_path

from . import views

urlpatterns = [

...

]

"""使用drf提供路由类router给视图集生成路由列表"""

# 实例化路由类

# drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样

from rest_framework.routers import DefaultRouter

router = DefaultRouter()

# 注册视图集

# router.register("路由前缀",视图集类)

router.register("router_stu",views.StudentModelViewSet)

# 把生成的路由列表追加到urlpatterns

print( router.urls )

urlpatterns += router.urls

上面的代码就成功生成了路由地址[增/删/改/查一条/查多条的功能],但是不会自动我们在视图集自定义方法的路由。

所以我们如果也要给自定义方法生成路由,则需要进行action动作的声明。

1.2 视图集中附加action的声明

在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。

action装饰器可以接收两个参数:

methods: 声明该action对应的请求方式,列表传递

detail

: 声明该action的路径是否与单一资源对应,及是否是

1

xxx//action方法名/

True 表示路径格式是xxx//action方法名/

False 表示路径格式是xxx/action方法名/

举例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from rest_framework.viewsets import ModelViewSet

from rest_framework.decorators import action

class StudentModelViewSet(ModelViewSet):

queryset = Student.objects.all()

serializer_class = StudentModelSerializer

# methods 设置当前方法允许哪些http请求访问当前视图方法

# detail 设置当前视图方法是否是操作一个数据

# detail为True,表示路径名格式应该为 router_stu/{pk}/login/

@action(methods=['get'], detail=False)

def login(self, request):

return Response({'msg':'登陆成功'})

@action(methods=['put'], detail=True)

def get_new_5(self, request,pk):

return Response({'msg':'获取5条数据成功'})

由路由器自动为此视图集自定义action方法形成的路由会是如下内容:

1

2

^router_stu/get_new_5/$ name: router_stu-get_new_5

^router_stu/{pk}/login/$ name: router_stu-login

1.3 路由router形成URL的方式

1) SimpleRouter

2)DefaultRouter

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

为了方便接下来的学习,我们创建一个新的子应用 opt

1

python manage.py startapp opt

因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员.

1

2

3

python3 manage.py makemigrations

python3 manage.py migrate

python3 manage.py createsuperuser

创建管理员以后,访问admin站点,先修改站点的语言配置

settings.py

1

2

3

4

5

6

7

8

9

LANGUAGE_CODE = 'zh-hans' # 中文

TIME_ZONE = 'Asia/Shanghai' # 时区是亚洲上海

USE_I18N = True # 国际化

USE_L10N = True # 本地化

USE_TZ = True # 数据库是否使用TIME_ZONE,True表示使用上海的时区,False表示不使用,使用UTC时间,然后转成上海,会差8个小时

访问admin 站点效果:

一 认证Authentication

1.1 自定义认证方案

1.1.1 编写models

1

2

3

4

5

6

7

8

9

# models.py

class User(models.Model):

username=models.CharField(max_length=32)

password=models.CharField(max_length=32)

user_type=models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'二笔用户')))

class UserToken(models.Model):

user=models.OneToOneField(to='User')

token=models.CharField(max_length=64)

1.1.2 新建认证类

1

2

3

4

5

6

7

8

9

10

11

from rest_framework.authentication import BaseAuthentication

class TokenAuth():

def authenticate(self, request):

token = request.GET.get('token')

token_obj = models.UserToken.objects.filter(token=token).first()

if token_obj:

return

else:

raise AuthenticationFailed('认证失败')

def authenticate_header(self,request):

pass

1.1.3 编写视图

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

def get_random(name):

import hashlib

import time

md=hashlib.md5()

md.update(bytes(str(time.time()),encoding='utf-8'))

md.update(bytes(name,encoding='utf-8'))

return md.hexdigest()

class Login(APIView):

def post(self,reuquest):

back_msg={'status':1001,'msg':None}

try:

name=reuquest.data.get('name')

pwd=reuquest.data.get('pwd')

user=models.User.objects.filter(username=name,password=pwd).first()

if user:

token=get_random(name)

models.UserToken.objects.update_or_create(user=user,defaults={'token':token})

back_msg['status']='1000'

back_msg['msg']='登录成功'

back_msg['token']=token

else:

back_msg['msg'] = '用户名或密码错误'

except Exception as e:

back_msg['msg']=str(e)

return Response(back_msg)

class Course(APIView):

authentication_classes = [TokenAuth, ]

def get(self, request):

return HttpResponse('get')

def post(self, request):

return HttpResponse('post')

1.1.4 全局使用

1

2

3

REST_FRAMEWORK={

"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]

}

1.1.5 局部使用

1

2

#局部使用,只需要在视图类里加入:

authentication_classes = [TokenAuth, ]

1.2 内置认证方案(需要配合权限使用)

可以在配置文件中配置全局默认的认证方案

1

2

3

4

5

6

REST_FRAMEWORK = {

'DEFAULT_AUTHENTICATION_CLASSES': (

'rest_framework.authentication.SessionAuthentication', # session认证

'rest_framework.authentication.BasicAuthentication', # 基本认证

)

}

也可以在每个视图中通过设置authentication_classess属性来设置

1

2

3

4

5

6

7

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

from rest_framework.views import APIView

class ExampleView(APIView):

# 类属性

authentication_classes = [SessionAuthentication, BasicAuthentication]

...

认证失败会有两种可能的返回值:

401 Unauthorized 未认证

403 Permission Denied 权限被禁止

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值