🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

第4章 第30.1课

同学们!作为一个踩过无数坑的Django实践者,今天我用大学生活和日常工作的案例,带大家拆解Django的MTV模式和核心模块。没有花哨的术语堆砌,只有真实场景的代码演示 ( •̀ ω •́ )✧


一、MTV模式:食堂三层架构

想象学校食堂:

  • Model(食材仓库):定义数据结构(就像食材清单)
  • Template(打菜窗口):数据展示(阿姨给你盛菜的盘子)
  • View(厨师):业务逻辑处理(炒菜的过程)
# models.py (食材仓库)
class CafeteriaDish(models.Model):# 定义菜品模型
name = models.CharField(max_length=50)# 菜名
price = models.DecimalField(max_digits=5, decimal_places=2)# 价格
is_spicy = models.BooleanField(default=False)# 是否辣

# views.py (厨师)
def dish_menu(request):
dishes = CafeteriaDish.objects.filter(price__lte=10)# 处理逻辑:筛选10元以下的菜
return render(request, 'menu.html', {'dishes': dishes})# 把处理好的菜交给窗口

# menu.html (打菜窗口)
{% for dish in dishes %}
<div>{{ dish.name }} - {{ dish.price }}元
{% if dish.is_spicy %}🌶️{% endif %}
</div>
{% endfor %}

二、ORM实战:查寝点名系统

用ORM操作数据库就像宿管阿姨查寝:

# 创建学生模型(定义寝室名单)
class Student(models.Model):
name = models.CharField(max_length=20)
dorm_num = models.CharField(max_length=10)# 寝室号
check_in_time = models.DateTimeField(auto_now_add=True)# 入住时间

# 操作示例
# 1. 新增学生(新生入住)
Student.objects.create(name="张三", dorm_num="3-205")

# 2. 查询晚归学生(23点后回寝)
from django.utils import timezone
late_students = Student.objects.filter(
check_in_time__gt=timezone.make_aware(timezone.datetime(2023,6,1,23,0))
)

# 3. 更新寝室号(调换宿舍)
Student.objects.filter(name="李四").update(dorm_num="5-312")

# 4. 删除毕业学生
Student.objects.filter(graduated=True).delete()

三、核心组件:社团管理系统

1. URL路由 - 社团活动报名入口

# urls.py (活动入口指引)
from . import views

urlpatterns = [
path('club/join/', views.join_club),# 报名页
path('club/<int:club_id>/', views.club_detail),# 社团详情页
]

# 访问示例:/club/5/ 自动把5传给club_detail视图

2. 视图函数 - 报名处理中心

# views.py (社团部干事)
def join_club(request):
if request.method == "POST":
form = ClubForm(request.POST)# 接收报名表
if form.is_valid():
form.save()# 保存数据
return HttpResponseRedirect("/success/")# 跳转成功页
else:
form = ClubForm()# 空白报名表
return render(request, "join_form.html", {"form": form})

3. 模板继承 - 活动页面统一风格

<!-- base.html (社团统一海报模板) -->
<html>
<head><title>{% block title %}默认标题{% endblock %}</title></head>
<body>
<div class="header">社团联合会</div>
{% block content %}{% endblock %} <!-- 内容填充区 -->
</body>
</html>

<!-- basketball.html -->
{% extends "base.html" %}
{% block title %}篮球社招新{% endblock %}
{% block content %}
<h2>报名要求:身高180+</h2>
<!-- 具体内容 -->
{% endblock %}

4. Admin后台 - 社团管理神器

# admin.py (老师管理后台)
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
list_display = ('name', 'dorm_num')# 列表显示字段
search_fields = ('name',)# 搜索功能
list_filter = ('dorm_num',)# 按寝室号过滤

四、安全防护:选课系统攻防战

1. SQL注入防护(ORM自动防御)

# 危险操作(原生SQL拼接)
raw_sql = "SELECT * FROM student WHERE name = '%s'" % request.GET['name']
# 攻击者输入 ' OR 1=1 -- 就能获取全部数据

# ORM安全写法(自动转义)
Student.objects.filter(name=request.GET['name'])

2. CSRF防护 - 选课提交验证

<!-- 选课表单必须加csrf_token -->
<form action="/select-course/" method="post">
{% csrf_token %} <!-- 生成隐藏token -->
<input type="checkbox" name="course" value="1">
<button>提交</button>
</form>

3. XSS防护 - 课程评论过滤

<!-- 模板自动转义 -->
<div>{{ comment.content }}</div>
<!-- 若用户输入<script>alert(1)</script>会被转义成普通文本 -->

<!-- 需要富文本时用safe -->
<div>{{ comment.content|safe }}</div> <!-- 慎用! -->

五、高级模块:校园二手市场

1. 中间件 - 交易请求拦截

# middleware.py (市场管理员)
class TradeSecurityMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
# 在视图执行前(检查黑名单用户)
if request.user in blacklist:
return HttpResponse("账号已被冻结", status=403)

response = self.get_response(request)

# 在视图执行后(记录交易日志)
log_trade(request.user)
return response

2. 信号 - 商品状态更新

# signals.py (系统通知)
@receiver(post_save, sender=Goods)
def notify_buyer(sender, instance, **kwargs):
if instance.status == "SOLD":
send_email(
to=instance.buyer.email,
subject=f"您购买的{instance.name}已发货"
)

3. 缓存 - 热门商品展示

# views.py
from django.core.cache import cache

def hot_goods(request):
# 先尝试从缓存读取
goods = cache.get('hot_goods')
if not goods:
goods = Goods.objects.filter(views__gt=1000)[:10]
cache.set('hot_goods', goods, timeout=300)# 缓存5分钟
return render(request, 'hot.html', {'goods': goods})

六、设计模式本质:MVC vs MTV

举个课程管理的例子:

模式 课程管理场景 Django对应
Model 课程数据库表定义 models.py
View 显示课程列表/详情的HTML页面 templates/
Controller 处理选课/退课逻辑 views.py

MTV的精髓
views.py 实际上承担了Controller的职责,而Template是特殊的View层。这种重命名让开发者更关注数据展示与业务逻辑的分离


总结一下重点:

  1. MTV分离:Model管数据、Template管展示、View管逻辑
  2. ORM优势:用Python语法操作数据库,自带安全防护
  3. 组件协作:URL路由 → 视图处理 → 模板渲染
  4. 安全优先:CSRF/XSS/SQL注入防护必须开启
  5. 进阶工具:中间件做拦截、信号做触发、缓存提性能

最后送大家一句话:"不要重复造轮子,但要懂轮子怎么转"。Django的强大在于合理使用这些模块,而不是死记硬背理论 ( ̄▽ ̄)~* 下期见!

posted on 2025-08-04 12:31  鱼油YOU  阅读(8)  评论(0)    收藏  举报