发布时间:2026/8/29 21:22:56
零基础入门python35:Django用户登录与权限边界 零基础入门python35Django用户登录与权限边界一、上一篇课后练习讲解Admin 中创建时间应设置readonly_fields订单金额不能开放编辑因为订单是财务事实修改应经过支付或退款服务并留下审计记录。上一篇课后练习完整答案上一篇练习的要求已落实到下面完整文件先运行项目测试再用 curl 对照状态码和数据库持久化结果答案要点ProductAdmin 配置搜索、筛选、关联预取和只读时间Admin action 只下架不开放订单金额编辑。文件shop/admin.py完整参考答案文件完整文件shop/admin.pyfromdjango.contribimportadminfrom.modelsimportProductadmin.register(Product)classProductAdmin(admin.ModelAdmin):list_display(name,category,price,stock,is_active)list_select_related(category,)search_fields(name,slug)list_filter(is_active,category)完整参考答案文件本篇对应的交付源码完整文件django-shop/shop/admin.pyfromdjango.contribimportadminfrom.modelsimportCategory,Order,OrderItem,Productadmin.register(Category)classCategoryAdmin(admin.ModelAdmin):list_display(name,slug)prepopulated_fields{slug:(name,)}admin.register(Product)classProductAdmin(admin.ModelAdmin):list_display(name,category,price,stock,is_active)list_filter(is_active,category)search_fields(name,)prepopulated_fields{slug:(name,)}classOrderItemInline(admin.TabularInline):modelOrderItem extra0readonly_fields(product,product_name,price,quantity)admin.register(Order)classOrderAdmin(admin.ModelAdmin):list_display(id,user,status,total_amount,created_at)list_filter(status,)inlines(OrderItemInline,)验收命令python -m pytest -qDjango 项目使用 python manage.py test。预期测试通过若失败先检查迁移、配置和事务回滚。二、本篇完成什么商品列表公开购物车和结算需要登录订单列表只返回当前用户的订单。认证解决“你是谁”权限解决“你能操作什么”。三、DRF权限配置classCheckoutView(generics.GenericAPIView):permission_classes(permissions.IsAuthenticated,)权限类是第一道门get_queryset()仍然必须过滤用户因为“已登录”不等于“能看所有订单”。不要用客户端传来的user_id做权限依据。四、验收未登录访问/api/checkout/返回 403登录后可以结算用户 A 的订单不会出现在用户 B 的/api/orders/。课后练习为订单详情增加对象级权限测试。项目增量Django 认证与权限注册使用 Django 密码哈希登录由 AuthenticationForm 校验商品后台权限和前台订单权限是两套规则不要把“已登录”当成“可以修改所有数据”。defrequire_login(request):ifnotrequest.user.is_authenticated:returnredirect(login)returnNone订单查询必须 filter(userrequest.user)详情页猜 id 也不能看到他人订单。验收未登录、普通用户和 staff 三种角色课后练习增加装饰器保护结账页面。五、上一篇练习讲解Admin action 也要有权限批量下架 action 应只修改is_active并使用request.user写审计日志不能把 action 做成“批量改价格”。测试用 staff 用户调用 action普通用户访问 Admin 应返回 302 到登录页或 403取决于项目设置。六、认证和授权是两件事认证回答“你是谁”授权回答“你能做什么”。Django 的request.user.is_authenticated只能证明登录不能让用户读取别人的订单。结账视图可以这样写fromdjango.contrib.auth.decoratorsimportlogin_requiredfromdjango.httpimportJsonResponselogin_requireddefcheckout(request):ifrequest.method!POST:returnJsonResponse({error:method_not_allowed},status405)# 购物车内容随后会交给 service.place_order视图不直接扣库存。orderplace_order(request.user,request.session.get(cart,{}))request.session[cart]{}returnJsonResponse({id:order.id,total:str(order.total)},status201)login_required默认返回 302纯 API 可以配置LoginRequiredMiddleware或自定义装饰器返回 401/403。视图只负责 HTTP库存和事务放进 service避免网页和 API 两套下单规则。七、对象级权限的查询写法deforder_detail(request,order_id):orderget_object_or_404(Order,idorder_id,userrequest.user)returnJsonResponse(OrderSerializer(order).data)把userrequest.user放进get_object_or_404用户 A 猜到 B 的 id 只会得到 404。管理员查看全部订单应使用独立 URL 和独立权限检查而不是在普通详情接口中偷偷放宽查询。八、会话安全和排错登录后检查响应是否包含HttpOnly、SameSiteLaxcookie生产环境开启 HTTPS 后再设置SecureTrue。出现“登录后跳回登录页”检查django.contrib.sessions、SessionMiddleware和AuthenticationMiddleware的顺序。AnonymousUser访问request.user.id会得到None不要把它直接用于数据库写入。九、本篇练习写三个测试未登录访问结账、普通用户访问他人订单、staff 访问管理员订单列表。下一篇会用 Session 保存购物车并说明为什么价格必须重新从数据库读取。十、认证故障排查清单遇到 403 时按顺序检查用户是否真的登录request.user.is_authenticated、SessionMiddleware 是否加载、CSRF token 是否随 POST 提交、接口是否要求 staff。不要为了让测试通过而全局关闭 CSRFAPI 可以使用 token 认证后台表单仍保留 CSRF。密码验证失败时确认使用set_password而非直接给password字段赋值后者会把明文写入数据库。可在测试中打印response.wsgi_request.user和client.cookies但生产日志不应输出 cookie。认证和授权边界固定后购物车、订单、管理员 action 都只依赖request.user不会再从请求体猜用户。十一、角色矩阵练习把角色写成矩阵更直观游客可读在售商品普通用户可管理自己的购物车和订单staff 可维护商品、查看全部订单超级用户可管理权限。为矩阵每一格至少写一个测试避免以后新增接口时把“已登录”误当成“管理员”。本篇结束完整模块文件下面是交付项目中真实存在的完整文件 django-shop/shop/views.py。它覆盖本篇新增逻辑以及前文已经完成的依赖代码复制单个函数会丢失上下文因此这里提供整份文件。fromrest_frameworkimportgenerics,permissions,status,viewsetsfromrest_framework.responseimportResponsefrom.modelsimportCategory,Order,Productfrom.serializersimportCategorySerializer,CheckoutSerializer,OrderSerializer,ProductSerializerfrom.servicesimportcreate_orderclassCategoryViewSet(viewsets.ReadOnlyModelViewSet):querysetCategory.objects.order_by(name)serializer_classCategorySerializerclassProductViewSet(viewsets.ReadOnlyModelViewSet):serializer_classProductSerializerdefget_queryset(self):queryProduct.objects.filter(is_activeTrue).select_related(category)ifcategory:self.request.query_params.get(category):queryquery.filter(category_idcategory)ifkeyword:self.request.query_params.get(q):queryquery.filter(name__icontainskeyword)returnquery.order_by(-created_at)classCheckoutView(generics.GenericAPIView):permission_classes(permissions.IsAuthenticated,)serializer_classCheckoutSerializerdefpost(self,request):serializerself.get_serializer(datarequest.data)serializer.is_valid(raise_exceptionTrue)ordercreate_order(request.user,serializer.validated_data[items])returnResponse(OrderSerializer(order).data,status201)classMyOrderViewSet(viewsets.ReadOnlyModelViewSet):permission_classes(permissions.IsAuthenticated,)serializer_classOrderSerializerdefget_queryset(self):returnOrder.objects.filter(userself.request.user).prefetch_related(items).order_by(-id)classCartView(generics.GenericAPIView):defget(self,request):returnResponse(request.session.get(cart,{}))defpost(self,request):productgenerics.get_object_or_404(Product,idrequest.data.get(product_id),is_activeTrue)quantityint(request.data.get(quantity,1))ifquantity1orquantityproduct.stock:returnResponse({message:数量必须大于0且不能超过库存},statusstatus.HTTP_400_BAD_REQUEST)cartrequest.session.setdefault(cart,{})cart[str(product.id)]quantity request.session.modifiedTruereturnResponse(cart,statusstatus.HTTP_201_CREATED)defdelete(self,request):cartrequest.session.get(cart,{})cart.pop(str(request.data.get(product_id)),None)request.session.modifiedTruereturnResponse(cart)

相关新闻

2026/8/29 21:22:56

实验 8:变量体系与 Facts

文章目录 实验 8:变量体系与 Facts 一、本章学习目标 二、实验背景:为什么需要变量? 2.1 硬编码的问题 2.2 变量的价值:数据与逻辑分离 三、5 种变量定义方式双视角解析 方式 1:Playbook 内联变量(vars) 【专家视角】 【小白视角】 方式 2:group_vars 组变量 【专家视角…

2026/8/29 21:22:56

分布式锁与 CAP 理论:底层机制、CP/AP 权衡与选型破局之道

文章目录🔒 深入底层:分布式锁的本质、痛点消解与 CAP 理论全景权衡📑 文章摘要🌳 核心基础:什么是分布式锁、解决什么问题与 CAP 理论全景🧩 2.1 什么是分布式锁?它解决了什么痛点?…

2026/8/29 21:22:56

Java工程师必备:JVM故障排查实战指南与经典场景解析

1. 项目概述:为什么JVM故障分析是每个Java工程师的必修课 最近在线上处理一个服务时,又遇到了经典的“服务运行一段时间后响应变慢,最终无响应”的问题。登录服务器一看,CPU不高,网络正常,但内存使用率居高…

2026/8/29 21:32:58

前端八股文不是洪水猛兽:如何将面试题转化为工程能力

做了好些年前端,也面过不少候选人,我自己也反复被这个现象折腾过:一边在社区里看大家骂“前端八股文害人”,一边打开面试题库老老实实背事件循环、闭包、虚拟DOM。后来想明白了一件事——前端八股文本身不是洪水猛兽,它…

2026/8/29 21:32:58

STM32 PWM输入捕获:从原理到实战,解决蓝桥杯嵌入式竞赛高频考点

1. 项目背景与核心需求解析在蓝桥杯嵌入式赛事的备赛过程中,PWM输入捕获是一个高频且关键的考点。它不仅是测量外部信号频率和占空比的基础,更是后续实现电机测速、舵机控制、通信协议解码等复杂功能的基石。很多同学在初次接触时,往往被STM3…

2026/8/29 21:32:58

2026年国内数字人OEM贴牌服务商TOP10榜单:品牌合作选型实用参考

数字人贴牌项目做到一半才发现系统跑不动、售后找不到人——这种经历在2026年的数字人OEM市场并不少见。本文基于技术拟真度、功能完整性、成本透明度、合规保障、服务生态五大维度,结合2026年Q2对10家主流数字人OEM服务商的实测数据与全网用户口碑,为计…

2026/8/29 21:32:58

windows+ubuntu双系统,可远程切换启动系统

1. Ubuntu操作步骤(UEFI模式): 1.安装工具 sudo apt install efibootmgr 2.查看启动编号 sudo efibootmgr 3.设置下一次启动 sudo efibootmgr -n XXXX 4.立即重启 就会进入设置的下一次启动的系统2.Windows使用第三方命令行工具: bootnext 安…

2026/8/29 21:32:58

第290篇 DETR——重新定义目标检测的 Transformer 架构

YOLO系列聊完了,这篇讲一个完全不同的目标检测范式——DETR。YOLO是CNN路线的极致优化,DETR则引入了Transformer,彻底改变了目标检测的设计思路。 DETR的全称是Detection Transformer,2020年由Facebook AI Research提出。它的核心…

2026/8/29 21:27:58

STM32 TrustZone实战:地址安全区与资源安全属性配置避坑指南

1. 为什么TrustZone项目总在"寄存器改对了但功能死活不对"上翻车做安全固件、密钥管理、安全OTA这类项目的工程师,基本都会遇到同一个状况:把TrustZone相关的寄存器按参考手册配了一遍,程序烧进去却要么直接HardFault,要…

2026/8/29 21:30:11

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/28 16:16:21

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 16:16:22

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/29 0:01:10

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:01:10

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:01:10

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…