
1. Django模板语法深度解析1.1 模板引擎工作原理Django模板系统本质上是一个字符串处理器它通过特定的语法标记将动态数据嵌入静态HTML。当render()函数被调用时模板引擎会执行以下操作模板加载器根据TEMPLATES配置查找模板文件生成模板对象并建立上下文环境逐行解析模板中的特殊标记{% %}和{{ }}执行标签对应的Python代码或变量替换输出最终渲染完成的HTML字符串关键提示Django模板被设计为受限Python这种设计既保证了模板逻辑的简洁性又避免了业务逻辑过度渗入表现层。1.2 核心语法元素详解1.2.1 变量输出与过滤器变量输出使用双花括号语法p欢迎回来{{ user.name|title }}/p常用过滤器示例date:Y-m-d H:i日期格式化truncatechars:50截断字符串safe标记内容为安全HTMLdefault:暂无默认值设置我常用的自定义过滤器写法在app目录下创建templatetags/from django import template register template.Library() register.filter def highlight(text, keyword): return text.replace(keyword, fspan classhighlight{keyword}/span)1.2.2 逻辑控制标签条件判断示例{% if messages %} ul classmessages {% for message in messages %} li{% if message.tags %} class{{ message.tags }}{% endif %} {{ message }} /li {% endfor %} /ul {% endif %}循环中的特殊变量forloop.counter当前循环次数从1开始forloop.revcounter剩余循环次数forloop.first/last是否首/末次循环1.2.3 模板继承机制基础模板base.html!DOCTYPE html html head title{% block title %}默认标题{% endblock %}/title {% block css %}{% endblock %} /head body {% include header.html %} main{% block content %}{% endblock %}/main {% include footer.html %} /body /html子模板继承实现{% extends base.html %} {% block title %}用户中心 - 我的网站{% endblock %} {% block css %} {{ block.super }} link relstylesheet href/static/user.css {% endblock %} {% block content %} h1个人资料/h1 !-- 具体内容 -- {% endblock %}1.3 高级模板技巧1.3.1 自定义模板标签带参数的复杂标签示例register.simple_tag(takes_contextTrue) def current_time(context, format_string): timezone context[user].timezone now timezone.now().strftime(format_string) return fspan classtime{now}/span模板中使用{% current_time %Y-%m-%d %H:%M %}1.3.2 模板片段缓存性能优化实践{% load cache %} {% cache 300 article_header article.id %} div classarticle-header h1{{ article.title }}/h1 p作者{{ article.author.name }}/p /div {% endcache %}实测经验对频繁访问但变化少的区块使用缓存可使页面响应时间降低60%以上。但要注意缓存键的设计避免脏数据。2. 请求处理全流程剖析2.1 HTTP请求生命周期Django的请求处理流程中间件process_requestURL路由解析中间件process_view视图函数处理中间件process_response模板渲染如有返回HTTP响应调试技巧可以通过自定义中间件打印每个阶段的处理时间class TimingMiddleware: def __init__(self, get_response): self.get_response get_response def __call__(self, request): start time.time() print(fRequest started at {start}) response self.get_response(request) duration time.time() - start print(fRequest took {duration:.2f} seconds) return response2.2 请求对象深度使用2.2.1 常用属性解析request.method获取请求方法GET/POST等request.GET/POST类字典对象获取参数request.META包含各种HTTP头信息request.FILES上传文件处理request.user认证用户对象request.session会话数据存取处理表单上传的典型代码def upload_view(request): if request.method POST: form UploadForm(request.POST, request.FILES) if form.is_valid(): handle_uploaded_file(request.FILES[file]) return HttpResponseRedirect(/success/) else: form UploadForm() return render(request, upload.html, {form: form})2.2.2 请求头高级应用获取客户端设备信息def get_client_device(request): user_agent request.META.get(HTTP_USER_AGENT, ) if Mobile in user_agent: return mobile elif Tablet in user_agent: return tablet return desktop处理AJAX请求的识别def api_view(request): if request.headers.get(X-Requested-With) XMLHttpRequest: # 处理AJAX请求 return JsonResponse({data: ...}) # 普通请求处理2.3 请求安全处理2.3.1 CSRF防护机制模板中必须包含csrf_tokenform methodpost {% csrf_token %} !-- 表单字段 -- /formAPI请求的特殊处理基于DRFfrom rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response api_view([POST]) permission_classes([IsAuthenticated]) def secure_endpoint(request): # 视图逻辑 return Response({status: ok})2.3.2 参数安全校验使用Django Form进行严格验证class ContactForm(forms.Form): name forms.CharField(max_length100) email forms.EmailField() message forms.CharField(widgetforms.Textarea) def clean_message(self): message self.cleaned_data[message] if len(message) 10: raise forms.ValidationError(消息太短) return message3. 响应构建艺术3.1 响应类型大全3.1.1 基础响应类HttpResponse基础响应JsonResponseJSON格式响应StreamingHttpResponse流式响应FileResponse文件下载构建RESTful API响应示例from django.http import JsonResponse def api_example(request): data { status: success, code: 200, data: { user: request.user.username, timestamp: time.time() } } return JsonResponse(data)3.1.2 重定向响应临时重定向from django.shortcuts import redirect def old_view(request): return redirect(/new-url/, permanentFalse)永久重定向SEO优化def legacy_view(request): return redirect(new-view-name, permanentTrue)3.2 响应头高级控制3.2.1 缓存控制设置浏览器缓存response render(request, template.html) response[Cache-Control] max-age3600 return response禁止缓存response[Cache-Control] no-store, no-cache, must-revalidate response[Pragma] no-cache response[Expires] 03.2.2 内容安全策略设置CSP头防范XSSresponse[Content-Security-Policy] default-src self; script-src self cdn.example.com3.3 文件流式响应大文件下载优化from django.http import FileResponse import os def download_large_file(request): file_path /path/to/large/file.zip file_size os.path.getsize(file_path) response FileResponse(open(file_path, rb)) response[Content-Length] file_size response[Content-Disposition] attachment; filenamefile.zip return response视频流媒体实现def video_stream(request, video_id): video get_object_or_404(Video, pkvideo_id) range_header request.META.get(HTTP_RANGE, ).strip() # 处理范围请求206 Partial Content # ...省略具体实现... response FileResponse(video.file, content_typevideo/mp4) response[Accept-Ranges] bytes return response4. 实战技巧与性能优化4.1 模板渲染优化4.1.1 select_related与prefetch_related减少数据库查询# 不好的写法N1查询问题 articles Article.objects.all() # 模板中{% for article in articles %}{{ article.author.name }}{% endfor %} # 优化写法 articles Article.objects.select_related(author).all()多对多关系优化books Book.objects.prefetch_related(categories).all()4.1.2 模板片段加载优化使用include标签的最佳实践{# 不好的写法每次循环都加载模板 #} {% for item in items %} {% include item.html %} {% endfor %} {# 优化写法先聚合再渲染 #} {% include items_list.html with itemsitems %}4.2 请求处理优化4.2.1 异步任务处理使用Celery处理耗时操作from celery import shared_task shared_task def process_upload(file_id): # 处理文件上传 pass def upload_view(request): if request.method POST: file request.FILES[file] # 保存文件 file_id save_file(file) # 异步处理 process_upload.delay(file_id) return JsonResponse({status: processing})4.2.2 分页性能优化高效分页实现from django.core.paginator import Paginator def product_list(request): page request.GET.get(page, 1) per_page 25 # 使用count(*) OVER()避免二次查询 products Product.objects.annotate( total_countCount(id, overWindow()) ).order_by(name) paginator Paginator(products, per_page) page_obj paginator.get_page(page) return render(request, list.html, { page_obj: page_obj, total_count: products[0].total_count if products else 0 })4.3 调试与问题排查4.3.1 模板调试技巧显示所有可用变量pre{{ debug }}/pre自定义调试标签register.simple_tag(takes_contextTrue) def debug_context(context): return pprint.pformat({ values: context.get(view), request: str(context.get(request)), user: str(context.get(user)) })4.3.2 请求响应追踪使用Django Debug Toolbar安装配置pip install django-debug-toolbarsettings.py配置INSTALLED_APPS [ # ... debug_toolbar, ] MIDDLEWARE [ debug_toolbar.middleware.DebugToolbarMiddleware, # ... ] INTERNAL_IPS [127.0.0.1]URL配置if settings.DEBUG: import debug_toolbar urlpatterns [ path(__debug__/, include(debug_toolbar.urls)), ] urlpatterns踩坑记录曾经遇到模板渲染奇慢的问题通过Debug Toolbar发现是某个自定义标签进行了大量数据库查询。解决方法是为标签添加缓存性能提升20倍。