引言
本文深入剖析Django核心组件,涵盖数据交换、异步交互、状态管理及安全认证,附完整代码示例和避坑指南!
目录
一、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