Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证

1. JSON数据格式详解

1.1 什么是JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下特点:

  • 独立于语言,几乎所有编程语言都支持

  • 易于人阅读和编写

  • 易于机器解析和生成

  • 基于文本,比XML更简洁

1.2 JSON基本格式

对象格式
复制代码
{
    "name": "rose",
    "age": 20
}
  • 使用大括号{}包裹

  • 键值对形式,键必须用双引号包裹

  • 多个键值对用逗号分隔

数组格式
复制代码
["jack", 18, "man"]
  • 使用中括号[]包裹

  • 元素可以是任意类型

  • 元素间用逗号分隔

1.3 复杂JSON示例

复制代码
{
    "name": "jack",
    "age": 29,
    "hobby": ["reading", "travel", "photography"],
    "school": {
        "name": "Merrimack College",
        "location": "North Andover, MA"
    }
}

1.4 JSON与XML对比

XML示例

复制代码
<?xml version="1.0" encoding="utf-8"?>
<country>
    <name>中国</name>
    <province>
        <name>黑龙江</name>
        <cities>
            <city>哈尔滨</city>
            <city>大庆</city>
        </cities>
    </province>
</country>

JSON等效

复制代码
{
    "name": "中国",
    "province": [{
        "name": "黑龙江",
        "cities": ["哈尔滨", "大庆"]
    }]
}

JSON优势

  1. 更简洁,减少传输数据量

  2. 更易读

  3. 直接对应JavaScript对象

  4. 解析速度更快

1.5 JSON在各语言中的处理

语言 序列化 反序列化
JavaScript JSON.stringify() JSON.parse()
Python json.dumps() json.loads()
Java ObjectMapper.writeValueAsString() ObjectMapper.readValue()

2. AJAX技术详解

2.1 什么是AJAX?

AJAX(Asynchronous JavaScript and XML)是一种创建交互式网页应用的技术,特点:

  • 异步:不阻塞页面其他操作

  • 局部刷新:只更新部分页面内容

  • 数据量小:减少不必要的数据传输

2.2 AJAX工作原理

复制代码
 浏览器->>服务器: 发送AJAX请求
 服务器->>浏览器: 返回数据(JSON/XML)
 浏览器->>DOM: 更新页面局部内容

2.3 jQuery实现AJAX

GET请求

复制代码
$.get('/api/data', {param1: 'value'}, function(data) {
    console.log(data);
});

POST请求

复制代码
$.ajax({
    url: '/api/save',
    type: 'POST',
    data: {
        name: '张三',
        age: 25
    },
    success: function(res) {
        alert('保存成功');
    }
});

2.4 处理CSRF Token

Django中防止CSRF攻击的解决方案:

复制代码
$.ajax({
    url: "/submit/",
    type: "POST",
    data: {
        "data": "value",
        "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val()
    }
});

2.5 文件上传示例

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

$.ajax({
    url: '/upload/',
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false,
    success: function(data) {
        console.log("上传成功");
    }
});

3. Cookie机制详解

3.1 Cookie是什么?

  • 服务器发送到浏览器的小段数据(键值对)

  • 浏览器会存储并在后续请求中自动携带

  • 典型应用:登录状态保持、用户偏好设置

3.2 Django中操作Cookie

设置Cookie

复制代码
response = HttpResponse()
response.set_cookie(
    'username', 
    '张三',
    max_age=3600,  # 1小时过期
    path='/',      # 全站有效
    secure=True,   # 仅HTTPS传输
    httponly=True  # 防止XSS攻击
)

读取Cookie

复制代码
username = request.COOKIES.get('username', '默认值')

删除Cookie

复制代码
response = HttpResponse()
response.delete_cookie('username')

3.3 Cookie登录校验示例

复制代码
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if valid_user(username, password):  # 自定义验证函数
            response = redirect('/home/')
            response.set_cookie('is_login', True)
            return response
    return render(request, 'login.html')

4. Session机制详解

4.1 为什么需要Session?

  • Cookie大小限制(4KB)

  • 敏感信息不宜存储在客户端

  • 需要存储更多用户状态信息

4.2 Session工作原理

复制代码
A[浏览器] -->|携带Session ID| B[服务器]
B -->|查找| C[Session存储]
C -->|返回用户数据| B
B -->|响应| A

4.3 Django中Session操作

基本操作

复制代码
# 设置
request.session['user'] = {'id': 1, 'name': '张三'}

# 获取
user = request.session.get('user')

# 删除
del request.session['user']

高级操作

复制代码
# 获取所有键
keys = request.session.keys()

# 设置过期时间(秒)
request.session.set_expiry(3600) 

# 清除所有Session
request.session.flush()

4.4 Session配置

复制代码
# settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 数据库存储
SESSION_COOKIE_AGE = 1209600  # 2周过期(默认)
SESSION_SAVE_EVERY_REQUEST = True  # 每次请求都保存

5. Django用户认证系统

5.1 内置功能

  • 用户注册、登录、注销

  • 密码修改、重置

  • 权限管理

  • 用户组管理

5.2 核心方法

用户认证

复制代码
from django.contrib.auth import authenticate

user = authenticate(
    request,
    username='admin',
    password='123456'
)
if user is not None:
    login(request, user)  # 登录用户

创建用户

复制代码
from django.contrib.auth.models import User

# 普通用户
User.objects.create_user(
    username='user1',
    password='mypassword'
)

# 超级用户
User.objects.create_superuser(
    username='admin',
    password='admin123',
    email='admin@example.com'
)

5.3 视图保护

复制代码
from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')
def profile(request):
    return render(request, 'profile.html')

5.4 扩展用户模型

复制代码
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone = models.CharField(max_length=11, unique=True)
    avatar = models.ImageField(upload_to='avatars/')

# settings.py
AUTH_USER_MODEL = 'app.CustomUser'

6. 实用技巧与最佳实践

6.1 安全建议

  1. 始终使用HTTPS传输Cookie

  2. 敏感操作使用CSRF保护

  3. 密码必须哈希存储

  4. Session设置合理过期时间

6.2 性能优化

  1. 频繁访问的Session数据使用缓存后端

  2. 大型文件不要通过Session存储

  3. 合理设置Cookie的domain和path

6.3 常见问题解决

问题1:AJAX请求403 Forbidden

  • 确保携带了CSRF Token

  • 检查视图的权限设置

问题2:Session不持久

  • 检查SESSION_COOKIE_AGE设置

  • 确保浏览器没有禁用Cookie

问题3:用户认证失败

  • 检查用户是否is_active=True

  • 验证密码是否正确:user.check_password('123')

7. 总结

本文详细介绍了Django开发中的核心知识点:

  1. JSON:现代Web开发的标准数据格式

  2. AJAX:实现无刷新交互的关键技术

  3. Cookie:客户端状态存储的基本方式

  4. Session:服务端用户状态管理方案

  5. 用户认证:快速构建安全系统的利器

相关推荐
打酱油的;1 小时前
爬虫-request处理get
爬虫·python·django
面朝大海,春不暖,花不开4 小时前
结构化数据格式解析:JSON 与 XML 的技术应用与实践
xml·json
小王子10248 小时前
Django+DRF 实战:自定义异常处理流程
后端·django·web开发
-凌凌漆-9 小时前
【Qt】Qt QML json处理
开发语言·qt·json
程序设计实验室13 小时前
在 django-ninja 中实现类似腾讯阿里云的应用鉴权机制
django·djangostarter
racerun1 天前
UniApp中的pages.json 和 tabBar
uni-app·json
我命由我123451 天前
前端开发问题:SyntaxError: “undefined“ is not valid JSON
开发语言·前端·javascript·vue.js·json·ecmascript·js
Code季风1 天前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul