Django核心知识点全景解析
引言
本文深入剖析Django核心组件,涵盖数据交换、异步交互、状态管理及安全认证,附完整代码示例和避坑指南!
目录
引言
一、JSON:轻量级数据交换标准
1. 核心特性
2. 标准格式
3. 各语言处理方法
4. 常见错误示例
二、AJAX:异步通信核心技术
1. 核心优势
2. 原生JS实现
3. jQuery简化实现
4. 安全防护(CSRF Token)
5. 文件上传实战
三、Cookie:客户端状态管理
1. 核心原理
2. Django操作API
3. 关键参数
四、Session:服务端会话管理
1. Session配置方案
2. 核心操作方法
3. 存储引擎对比
五、分页:Paginator组件
1. 基础用法
2. 核心API说明
Paginator对象
Page对象
六、Form:表单处理利器
1. 字段类型大全
2. 自定义验证规则
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-Typedata: 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 Paginatordef 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