Django-rest-frame简单使用

本文详细介绍了如何快速搭建Django REST框架,包括配置settings、创建和上传models、序列化models、处理Views以及URL配置等核心步骤。此外,还介绍了用户身份验证、权限认证、节流使用、序列化级联查询和admin后台管理等进阶技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速搭建Django-rest-frame框架,适合给用过但忘记了具体步骤的人。

1.settings配置信息

添加’rest_framework’到您的INSTALLED_APPS设置

INSTALLED_APPS = [
    ...
    'rest_framework',
    # 或者选这个
    'corsheaders',
]

2.models创建以及上传

from django.db import models


# 创建Student表格
class Student(models.Model):
    name = models.CharField(max_length=10)
    sex = models.BooleanField(default=False)
    time = models.DateTimeField(auto_now_add=True)  # 创建时自动添加时间,auto_now:每次更新都会刷新一次

    class Meta:
        db_table = 'student'

上传表单

python manage.py makemigrations
python manage.py migrate

3.序列化models

创建一个serilizer.py

from rest_framework import serializers

from APIViews.models import Student

# 创建序列化Student表格的类,这是从表
class StudentSerializer(serializers.ModelSerializer):
    #序列化外键全部字段
    #snippet(外键的related_name) = SnippetSerializers(read_only=True, many=True)这是序列化外键 ,many=True不能缺少
    # 序列化单个字段
    #  questionnaire_title = serializers.CharField(source='questionnaire.title', read_only=True)  source='外键的字段.title'
 # questionnaire_id = serializers.IntegerField()  如果与models字段一样就可以自动识别
    class Meta:
        model = Student            # 要序列化的模型
        fields = ['name' , 'sex']  # 要序列化的字段
     #  fields ='__all__'   # 序列化全部

4.Views处理

from rest_framework.generics import ListCreateAPIView , RetrieveUpdateDestroyAPIView , CreateAPIView

from APIViews.models import Student  # 导入Student表格
from APIViews.serializer import StudentSerializer  # 导入Student序列化的类

# 查询合集和创建数据
class StudentsViews(ListCreateAPIView , CreateAPIView):
    queryset = Student.objects.filter(sex=False)
    serializer_class = StudentSerializer

# 查询单个,更新和删除
class StudentsViews(RetrieveUpdateDestroyAPIView):
    queryset = Student.objects.filter(sex=False)  # 这里可以直接筛选出某一些数据,也可以直接all获取全部
    serializer_class = StudentSerializer  # 指定序列化类

ListCreateAPIView: GET objects -> 查询一个集合
CreateAPIView:create object -> 创建一个记录
RetrieveAPIView: GET a object -> 查询一个记录
UpdateAPIView: Update a object -> 更新一个记录
DestroyAPIView: Delete a object -> 删除某个记录

还有各种基于以上功能Mixin的类

5.URL配置

注意格式,pk是表的主键,只适合更新,删除和查询单个。

urlpatterns = [
	# 查询合集和创建数据的URL
	path('students/' , views.StudentsViews.as_view() , name='students') ,
	
	# 查询单个,更新和删除的URL
    re_path('student/(?P<pk>\d+)' , views.StudentsViews.as_view()) ,
]

接下来是进阶篇

1.用户身份验证

个别页面的操作需要用户登录时候使用,仅提供思路,创建一个专门用来校验的py文件:APISettings.py

from django.core.cache import cache
from rest_framework.authentication import BaseAuthentication
from rest_framework.permissions import BasePermission
from rest_framework import exceptions

from Authentication.models import User

class UserAuthentication(BaseAuthentication):
    '''认证用户是否登录'''

    def authenticate(self , request):
        if request.method == 'GET':
            try:
                token = request.query_params.get('token')  # 获取请求中的token
                userid = cache.get(token)  # 从缓存中获取到用户ID
                user = User.objects.get(id=userid)  # 从数据库获取到该用户实例
                return user , token  # 返回的用户实例和token,将会被封装到request里
            except:
                raise exceptions.NotAuthenticated

随后再把它添加到你需要验证的View中即可

class UsersViewset(ListCreateAPIView):
    queryset = User.objects.filter(is_delete=False)
    serializer_class = UserSerializer
    authentication_classes = (UserAuthentication ,)

Tip:由于继承自BaseAuthentication,而父类默认返回raise NotImplementedError

2.用户权限认证

在APISettings.py中添加一个继承BasePermission的类

class UserPermission(BasePermission):
    '''认证用户权限'''

    def has_permission(self , request , view):
        if request.method == 'GET':
        # 根据源代码,如果认证过用户,用户实例会成为request的user属性.如果没有认证过,只能自己去获取用户实例.若是true则通过
            return request.user.is_super  
        else:
            return True

随后再把它添加到你需要验证的View中即可

class UsersViewset(ListCreateAPIView):
    queryset = User.objects.filter(is_delete=False)
    serializer_class = UserSerializer
    authentication_classes = (UserAuthentication ,)
    permission_classes = (UserPermission ,)  # 权限认证

3.节流的使用

from django.core.cache import cache
from rest_framework.throttling import UserRateThrottle

from App.models import User


class UserThrottle(UserRateThrottle):
    scope = 'user'  # 给该类命名,设置时候要使用

    def get_cache_key(self , request , view):
        if isinstance(request.user , User):
            ident = request.auth  # 如果身份验证后,token会变成request的auth属性。如果没有认证过,自行获取token
        else:
            ident = self.get_ident(request)

        return self.cache_format % {
            'scope': self.scope ,
            'ident': ident
        }

添加配置,设定时间:

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'App.Throttles.UserThrottle',  # 注册UserThrottle
    ],
    'DEFAULT_THROTTLE_RATES': {
        'user': '5/min',  # 设置scope是user的频率
        'address': '10/m'  # 设置注册AddressRateThrottle的频率
    }
}

View添加频率类:

class UsersViewset(ListCreateAPIView):
    queryset = User.objects.filter(is_delete=False)
    serializer_class = UserSerializer
	throttle_classes = [UserThrottle, ]

4.序列化的级联查询

当表与表之间出现多对多的关系时(以user和address为例):

from rest_framework import serializers
from App.models import User , Address

class AddressSerializer(serializers.ModelSerializer):
    class Meta:
        model = Address
        fields = ['owner' , 'address']

class UserSerializer(serializers.ModelSerializer):
    address_set = AddressSerializer(many=True , read_only=True)  # address作为次要表
    class Meta:
        model = User
        fields = ['username' , 'id' , 'password' , 'address_set']

5.admin后台管理简单操作

from django.contrib import admin

# Register your models here.
from Admin.models import Human , Pet


@admin.register(Human)
class HumanAdmin(admin.ModelAdmin):
    # exclude = ('age',)
    search_fields = ('name' ,)  # 搜索属性
    list_filter = ('name' ,)  # 筛选属性
    list_per_page = 5  # 设置每行5条数据

    def parse_sex(self):  # 由于性别是true和false所以这里做解析
        if self.sex:
            return '男'
        else:
            return '女'

    parse_sex.short_description = '性别'  # 简介
    list_display = ('name' , 'age' , parse_sex)  # 展现的属性

坑点1:经过Django-rest-frame封装过后,请求的参数是在query_params里获取,参考代码如下:

request.query_params.get('action')

坑点2:经过Django-rest-frame封装过后,Post的参数是在data里获取,参考代码如下:

request.data.get('name')

坑点3:由于Django的封装,默认是不能修改request上传的数据。只要把_mutable属性修改便可以

request.data._mutable = True  # 默认是False,修改为True后便能操作
request.data['description'] = 'soadhasogdoasdoasdg'
request.data._mutable = False  # 记得将其关闭

坑点4:方法重造
有时候Django-rest-frame提供的方法不能满足需求,需要重造时,最好别用super,容易出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值