Django核心知识点全景解析

引言

本文深入剖析Django核心组件,涵盖数据交换、异步交互、状态管理及安全认证,附完整代码示例和避坑指南!

目录

引言

一、JSON:轻量级数据交换标准

[1. 核心特性](#1. 核心特性)

[2. 标准格式](#2. 标准格式)

[3. 各语言处理方法](#3. 各语言处理方法)

[4. 常见错误示例](#4. 常见错误示例)

二、AJAX:异步通信核心技术

[1. 核心优势](#1. 核心优势)

[2. 原生JS实现](#2. 原生JS实现)

[3. jQuery简化实现](#3. jQuery简化实现)

[4. 安全防护(CSRF Token)](#4. 安全防护(CSRF Token))

[5. 文件上传实战](#5. 文件上传实战)

三、Cookie:客户端状态管理

[1. 核心原理](#1. 核心原理)

[2. Django操作API](#2. Django操作API)

[3. 关键参数](#3. 关键参数)

四、Session:服务端会话管理

[1. Session配置方案](#1. Session配置方案)

[2. 核心操作方法](#2. 核心操作方法)

[3. 存储引擎对比](#3. 存储引擎对比)

五、分页:Paginator组件

[1. 基础用法](#1. 基础用法)

[2. 核心API说明](#2. 核心API说明)

Paginator对象

Page对象

六、Form:表单处理利器

[1. 字段类型大全](#1. 字段类型大全)

[2. 自定义验证规则](#2. 自定义验证规则)

[3. 动态Choice技巧](#3. 动态Choice技巧)

总结与最佳实践


一、JSON:轻量级数据交换标准

1. 核心特性

  • 跨语言:独立于编程语言

  • 自描述性:键值对结构清晰易读

  • 轻量化:比XML节省30%以上带宽

2. 标准格式

复制代码
// 对象格式
{
  "name": "rose",
  "age": 20,
  "hobby": ["reading", "travel"]
}

// 数组格式
["jack", 18, "man"]

3. 各语言处理方法

语言 序列化方法 反序列化方法
JavaScript JSON.stringify() JSON.parse()
Python json.dumps() json.loads()

4. 常见错误示例

复制代码
// 错误1:属性名未用双引号
{ name: "张三" }  

// 错误2:使用十六进制值
[0xFFF]         

// 错误3:包含函数
{ "getData": function() {...} }

JSON vs XML:JSON结构更简洁,相同数据量下字符数减少40%,解析速度提升2倍+

二、AJAX:异步通信核心技术

1. 核心优势

  • 局部刷新:不重载整个页面

  • 异步交互:无需等待响应即可发送新请求

  • 带宽优化:仅传输必要数据

2. 原生JS实现

复制代码
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", "/ajax_test/", true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send("username=q1mi&password=123456");
xmlHttp.onreadystatechange = function() {
  if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
    alert(xmlHttp.responseText);
  }
};

3. jQuery简化实现

复制代码
<script>
$('#btn').click(function() {
  $.ajax({
    url: '/api/data/',
    type: 'post',
    data: { 
      param1: $('#input1').val(),
      param2: $('#input2').val()
    },
    success: function(res) {
      $('#result').val(res.data);
    }
  });
});
</script>

4. 安全防护(CSRF Token)

复制代码
$.ajax({
  type: "POST",
  data: {
    "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
    // 其他数据...
  }
});

5. 文件上传实战

复制代码
var formData = new FormData();
formData.append("file", $("#fileInput")[0].files[0]);
formData.append("csrfmiddlewaretoken", token);

$.ajax({
  url: "/upload/",
  type: "POST",
  processData: false,  // 禁止处理数据
  contentType: false,  // 不设置Content-Type
  data: formData
});

应用场景:搜索提示、用户名实时校验、无刷新分页

三、Cookie:客户端状态管理

1. 核心原理

复制代码
graph LR
A[服务器] -->|Set-Cookie| B[浏览器]
B -->|携带Cookie| A

2. Django操作API

复制代码
# 设置Cookie(加密)
response.set_signed_cookie('user', 'john', salt='secret', max_age=3600)

# 读取Cookie
request.get_signed_cookie('user', default='guest', salt='secret')

# 删除Cookie
response.delete_cookie('user')

3. 关键参数

参数 说明 示例值
max_age 过期时间(秒) 3600 (1小时)
path 生效路径 "/admin"
domain 生效域名 .example.com
httponly 禁止JS访问 True
secure 仅HTTPS传输 True

四、Session:服务端会话管理

1. Session配置方案

复制代码
# settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  # 缓存+数据库
SESSION_COOKIE_AGE = 1209600  # 默认2周
SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 关闭浏览器即失效

2. 核心操作方法

复制代码
# 存取数据
request.session['user_id'] = 42 
user_id = request.session.get('user_id')

# 会话管理
session_key = request.session.session_key  # 获取会话ID
request.session.flush()  # 删除会话及Cookie
request.session.set_expiry(300)  # 5分钟后过期

3. 存储引擎对比

引擎类型 优点 适用场景
数据库 持久化存储 高安全性需求
缓存 高速读写 高并发场景
文件系统 无需额外服务 小型应用
签名Cookie 无需服务器存储 无状态架构

五、分页:Paginator组件

1. 基础用法

复制代码
from django.core.paginator import Paginator

def article_list(request):
    queryset = Article.objects.all()
    paginator = Paginator(queryset, 10)  # 每页10条
    
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    return render(request, 'list.html', {'page_obj': page_obj})

2. 核心API说明

Paginator对象

  • num_pages:总页数

  • page_range:页码范围(如range(1, 5)

Page对象

  • object_list:当前页数据

  • has_previous():是否有上一页

  • previous_page_number():上一页页码

  • has_next():是否有下一页

  • next_page_number():下一页页码

六、Form:表单处理利器

1. 字段类型大全

字段类型 说明 示例
CharField 文本输入 name = forms.CharField()
EmailField 邮箱验证 自动验证@格式
ChoiceField 下拉单选 widget=forms.Select()
ModelChoiceField 模型下拉 queryset=User.objects.all()
DateTimeField 日期时间 input_formats=['%Y-%m-%d %H:%M']
FileField 文件上传 需设置enctype="multipart/form-data"

2. 自定义验证规则

复制代码
class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        error_messages={
            "required": "用户名不能为空",
            "min_length": "长度不能少于8个字符"
        }
    )
    password = forms.CharField(
        widget=forms.PasswordInput,
        validators=[custom_password_validator]  # 自定义验证器
    )

3. 动态Choice技巧

复制代码
# 方式1:在__init__中动态赋值
class DynamicForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['city'].choices = City.objects.values_list('id', 'name')

# 方式2:使用ModelChoiceField
authors = forms.ModelChoiceField(queryset=Author.objects.filter(active=True))

总结与最佳实践

数据交换:优先使用JSON替代XML

异步通信:AJAX实现局部刷新,提升用户体验

状态管理

  • 小型数据用Cookie(最大4KB)

  • 敏感数据用Session

表单处理

  • 基础表单用Form

  • 模型关联用ModelForm

相关推荐
大米2H3 小时前
Jupyter lab 配置两个python环境
ide·python·jupyter
猎嘤一号4 小时前
使用 PyTorch 和 TensorBoard 实时可视化模型训练
人工智能·pytorch·python
Takina~5 小时前
python打卡day49
python
Frankabcdefgh5 小时前
Python基础数据类型与运算符全面解析
开发语言·数据结构·python·面试
是梦终空5 小时前
Python毕业设计226—基于python+爬虫+html的豆瓣影视数据可视化系统(源代码+数据库+万字论文)
爬虫·python·html·毕业设计·毕业论文·源代码·豆瓣影视数据可视化
kaiaaaa5 小时前
算法训练第十五天
开发语言·python·算法
小玺玺6 小时前
[RDK X5] MJPG编解码开发实战:从官方API到OpenWanderary库的C++/Python实现
c++·python·opencv·rdk x5
zhuiQiuMX6 小时前
力扣LFU460
python·leetcode
noravinsc6 小时前
django 获取当前时间 格式 YYYY-MM-DD HH:Mm:ss
python·django·sqlite
大千AI助手6 小时前
django中如何解析content-type=application/json的请求
django·sqlite·json