当前位置: 首页 > news >正文

苏州高新区网站建设网站漏洞 在线扫描

苏州高新区网站建设,网站漏洞 在线扫描,企帮手logo设计官网,湖北响应式网站建设Django DRF action 详解:自定义 ViewSet 方法 在 Django REST Framework(DRF)中,action 装饰器用于为 ViewSet 添加自定义的 API 端点。相比于 update、create 等默认方法,action 允许我们定义 更加清晰、语义化 的 A…

Django DRF @action 详解:自定义 ViewSet 方法

在 Django REST Framework(DRF)中,@action 装饰器用于为 ViewSet 添加自定义的 API 端点。相比于 updatecreate 等默认方法,@action 允许我们定义 更加清晰、语义化 的 API 访问路径,使接口更加易读且符合 RESTful 设计原则。


1. @action 的作用

@action 主要用于 自定义 API 端点,避免滥用 updatecreate 等标准方法,使 API 语义更加清晰。例如:

  • POST /users/{id}/assign_roles/(自定义用户角色分配接口,语义清晰)
  • POST /users/{id}/change_password/(单独的修改密码接口)
  • GET /users/{id}/permissions/(查询用户权限)

2. @action 的基本用法

📌 示例:为用户分配角色

from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets, status
from django.contrib.auth.models import Userclass UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer@action(detail=True, methods=['post'])def assign_roles(self, request, pk=None):"""自定义 API 端点:为用户分配角色- `detail=True` 表示该方法针对单个用户(即 /users/{id}/assign_roles/)- 仅允许 `POST` 方法"""user = self.get_object()roles = request.data.get('roles', [])# 处理角色分配逻辑(假设 UserRole 是用户角色关联表)UserRole.objects.filter(user=user).delete()for role_id in roles:UserRole.objects.create(user=user, role_id=role_id)return Response({"message": "Roles assigned successfully"}, status=status.HTTP_200_OK)

📌 访问路径

方法访问路径说明
POST/users/{id}/assign_roles/为用户分配角色

3. @action 的参数

@action 可以接收多个参数,主要有:

(1)detail=True/False

  • detail=True:作用于单个对象,路径格式为 /users/{id}/action_name/
  • detail=False:作用于集合,路径格式为 /users/action_name/
@action(detail=True, methods=['post'])
def assign_roles(self, request, pk=None): """ /users/{id}/assign_roles/ """
@action(detail=False, methods=['get'])
def active_users(self, request):  """ /users/active_users/ """active_users = User.objects.filter(is_active=True)serializer = self.get_serializer(active_users, many=True)return Response(serializer.data)

(2)methods=['get', 'post', 'put', 'patch', 'delete']

@action 默认使用 GET,但可以指定其他方法:

@action(detail=True, methods=['patch'])
def change_password(self, request, pk=None):  """ /users/{id}/change_password/ """user = self.get_object()new_password = request.data.get('password')user.set_password(new_password)user.save()return Response({"message": "Password updated"}, status=status.HTTP_200_OK)

(3)permission_classes=[...], authentication_classes=[...]

@action 允许自定义权限和认证策略:

from rest_framework.permissions import IsAdminUser@action(detail=False, methods=['get'], permission_classes=[IsAdminUser])
def admin_users(self, request):  """ /users/admin_users/ 仅管理员可访问 """admins = User.objects.filter(is_staff=True)serializer = self.get_serializer(admins, many=True)return Response(serializer.data)

4. @actionupdate 的区别

方法作用访问路径适用场景
update更新单个用户PUT /users/{id}/用户资料更新
@action自定义操作POST /users/{id}/assign_roles/角色分配、修改密码等

📌 最佳实践

  • 简单的用户信息更新 → 用 update
  • 特定业务操作(如分配角色、修改密码) → 用 @action

5. @action 的最佳实践

(1)单一职责:一个 API 只做一件事

错误示例(混合多个逻辑):

def update(self, request, pk=None):user = self.get_object()user.username = request.data.get('username', user.username)user.set_password(request.data.get('password'))user.save()

正确示例(拆分成两个 API):

@action(detail=True, methods=['patch'])
def change_username(self, request, pk=None):user = self.get_object()user.username = request.data.get('username', user.username)user.save()return Response({"message": "Username updated"}, status=status.HTTP_200_OK)@action(detail=True, methods=['patch'])
def change_password(self, request, pk=None):user = self.get_object()user.set_password(request.data.get('password'))user.save()return Response({"message": "Password updated"}, status=status.HTTP_200_OK)

(2)语义化 URL

  • 用户更新资料PUT /users/{id}/
  • 分配角色POST /users/{id}/assign_roles/
  • 查询活跃用户GET /users/active_users/
  • 修改密码POST /users/{id}/change_password/

避免滥用 update 处理多个逻辑!


(3)权限控制

确保敏感操作(如修改密码)有适当的权限:

@action(detail=True, methods=['post'], permission_classes=[IsAuthenticated])
def change_password(self, request, pk=None):""" 只有登录用户才能修改密码 """

6. 总结

  • @action 适用于自定义 API 端点
  • 避免滥用 update,拆分独立逻辑
  • 更符合 RESTful 设计,使 API 语义清晰
  • 可搭配权限、认证等更灵活

👉 结论:@action 是 DRF 中提升代码可读性和 API 设计的重要工具,建议在特定业务场景下使用! 🚀

http://www.dtcms.com/a/555517.html

相关文章:

  • 丰台网站建设微商网站怎么做的
  • 【Linux】基础指令(3):理解linux常见指令和打包压缩
  • 东莞网站建设 烤活鱼vs 网站开发教程
  • 桂林生活网站系统网站主题有哪些问题
  • 福田网站优化申请注册公司需要多少钱
  • vscode-python编译器问题
  • 中关村网站建设的公司wordpress菜单分开
  • 阿里云网站如何做淘宝客在线设计房屋装修app
  • 杭州网站建设企业竞价推广代运营公司
  • 建设企业网站的需求分析这样制作公司网站
  • 长三角打造空中走廊,低空航线密集开通
  • 整站优化seo排名点击成都网站建设全美
  • 宣威网站建设c3sales网站开发是怎么开发的
  • 咨询公司经营范围大全商丘市网络优化公司地址
  • 个人网站搭建模拟感想电话外呼系统怎么收费
  • 网站建设制作方式有哪些网络营销岗位描述的内容
  • html网站制作答辩ppt最新型建筑模板有哪些
  • wordpress怎么加入站长统计代码山东省环保厅官方网站建设项目
  • 怎么做有趣的微视频网站惠州市跨境电子商务网站开发
  • 网站图片做多大semester是什么意思
  • 手机怎么做微电影网站吗做百度移动网站
  • 聊城网站建设品牌非常旺财的公司名字
  • mp3链接地址制作网站网址大全免费下载
  • 怎么建立类似百度问答的网站企业网站建设和管理
  • asp.net网站开发视频教程申请网站域名怎么做网站
  • 网站建设模板之家免费下载企业网站中( )是第一位的。
  • 网站建设 概念网站建设标准合同书
  • 温州微网站制作电话月嫂服务公司网站建设方案
  • 从复杂到原子:通过知识感知的双重组写和推理提升增强生成能力
  • 沈阳哪里可以做网站营销收费 WordPress