视图组件和认证组件

1.使用mixin和generics类编写视图 

from rest_framework.mixins import CreateModelMixin, ListModelMixin, DestroyModelMixin, RetrieveModelMixin,     UpdateModelMixin
from rest_framework.generics import GenericAPIView

class BooksView(CreateModelMixin, ListModelMixin, GenericAPIView):
    serializer_class = BookSerializer
    queryset = models.Book.objects.all()

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

class BookView(UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, GenericAPIView):
    serializer_class = BookSerializer
    queryset = models.Book.objects.all()

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

2.使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 编写视图

from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

class BooksView(ListCreateAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

class BookView(RetrieveUpdateDestroyAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

3. 使用ModelViewSet 编写视图

url配置:
url(r‘^books/(?P<pk>\d+)‘, views.BooksView.as_view({‘get‘: ‘retrieve‘, ‘put‘: ‘update‘, ‘delete‘: ‘destroy‘})),
url(r‘^books/$‘, views.BooksView.as_view({‘get‘: ‘list‘, ‘post‘: ‘create‘})),
views层:
# 使用ModelViewSet
from rest_framework.viewsets import ModelViewSet

class BooksView(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

4.ViewSetMixin的使用

url 配置
 url(r‘^test/‘, views.Publish.as_view({
        ‘get‘: ‘get_all‘, ‘post‘: ‘create_one‘, ‘put‘: ‘update‘, ‘delete‘: ‘delete‘
    })),

views:
from rest_framework.viewsets import ViewSetMixin

class Publish(ViewSetMixin, APIView):
    def get_all(self, request):
        return HttpResponse(‘get_all‘)

    def create_one(self, request):
        return HttpResponse(‘create_one‘)

    def update(self, request):
        return HttpResponse(‘update‘)

    def delete(self, request):
        return HttpResponse(‘delete‘)

5. 认证组件

drf认证组件源码实现‘‘‘
1: APIView的dispach方法
2.self.initial(request, *args, **kwargs)方法
3. self.perform_authentication(request)[认证]
4.def perform_authentication(self, request)
5. request.user-> Request(request为dispach中替换过的新的request)
6.Request中找到user
7.self._authenticate()[self是新的request对象]
8.Request类的_authenticate(self)方法,深度
‘‘‘
from rest_framework.views import APIView
from rest_framework.exceptions import AuthenticationFailed
import uuid
from rest_framework.request import Request

class CheckLogin():
    def authenticate(self, request):
        token = request.GET.get(‘token‘)
        ret = models.UserToken.objects.filter(token=token).first()
        if ret:
            return None
        else:
            raise AuthenticationFailed(‘验证失败‘)

    def authenticate_header(self, request):
        pass

class BooksView(APIView):
    authentication_classes = [CheckLogin]

    def get(self, request):
        return HttpResponse(‘ok‘)

class Login(APIView):
    def post(self, request):
        response = {
            ‘status‘: 100,
            ‘msg‘: None
        }
        name = request.data.get(‘name‘)
        pwd = request.data.get(‘pwd‘)
        # 数据库校验该用户是否存在
        user = models.User.objects.filter(name=name, pwd=pwd).first()
        if user:
            # 正常返回登录成功, 返回唯一token
            token = uuid.uuid4()
            ret = models.UserToken.objects.update_or_create(user=user, defaults={‘token‘: token})
            response[‘msg‘] = ‘登录成功‘
            response[‘token‘] = token
        else:
            response[‘msg‘] = ‘登录失败‘
            response[‘status‘] = 101
        return Response(response)

原文地址:https://www.cnblogs.com/yangyufeng/p/10610523.html

时间: 2024-08-30 17:50:31

视图组件和认证组件的相关文章

061.Python前端Django组件用户认证组件

一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---

Django:(6)用户认证组件 &amp; 中间件

用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuperuser API: (1)from django.contrib import auth (auth模块的方法) 1. # 做验证:如果 验证成功 返回 user 对象(就是 auth_user 这张表中的一条记录对象),否则返回None user = auth.authenticate(usern

10.Django用户认证组件

用户认证组件: 功能:用session记录登录验证状态: 前提:用户表,django自带的auth_user 创建超级用户:python manage.py createsuperuser           kris的密码是abc123456 基于用户认证组件的登录验证信息储存 views.py from django.shortcuts import render, HttpResponse, redirect # Create your views here. from django.co

rest-framework的认证组件

认证组件 1.登录认证(与组件无关): 首先要在model表内添加用户表和token表: from django.db import models # Create your models here. class User(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) class Token(models.Model): user=models.OneToOneFie

DAY99 - Rest Framework(四)- 认证组件和权限组件

一.认证组件 1.使用 # 模型层 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) class UserToken(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=64) #myAuth.py from app

rest framework认证组件和django自带csrf组件区别详解

使用 Django 中的 csrf 处理 Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查.它的原理是在<form>标签中生成一个隐藏的<input>标签,提交表单时将这个隐藏的<input>一起提交,服务器端验证这个字段是否正确. 官方给出的csrf的操作步骤是: 在MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddlewa

DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分页组件 七 xxx 八 xxx 一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个self.initial(request, *args, **kwargs),那么认证.权限.频率这三个默认组件都在这个方法里面了,如果我们自己没有做这三个组件的配置,那么会使用源码中默

DjangoRestFramework之认证组件,权限组件,频率组件

一 . 认证组件 我们现在知道的认证机制有cookie, session,session比较安全,session的信息是存在服务器上的,如果用户量足够大的话,服务器的压力也就比较大,并且django的session存到了django_session表中,不是很好操作,现在生产中使用的一个叫做token机制的方式比较多.可以使用这个机制把token存到用户信息里,当用户登录成功的时候放里面,等他来的时候就要带着这个来,而且们每次来的时候都更新token,防止被拦截. 我们这里使用一下token,首

Django中rest_framework的认证组件,权限组件,频率组件,序列化组件的最简化版接口

url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.Login.as_view()), # Book表 url(r'^books/$',views.BookHandle.as_view({ 'get':'list', 'post':'create' })), url(r'^books/(?P<pk>\d+)/',views.BookHandle.as_view({ 'get':'retrieve