Python中如何在Django views中设置cookie并同时返回JSON数据?

目前代码是这样的,想加上 cookie return HttpResponse(json.dumps(data), content_type="application/json")


Python中如何在Django views中设置cookie并同时返回JSON数据?
4 回复

resp = HttpResponse()
resp.set_cookie 这样设置了的话,json 那就是不是要改,该怎么样改呢,请教一下


在Django视图中同时设置cookie和返回JSON数据,你可以使用HttpResponse的子类JsonResponse,并在返回前设置cookie。关键点在于HttpResponse对象有一个set_cookie方法。

这里是一个完整的示例:

from django.http import JsonResponse

def my_view(request):
    # 你的业务逻辑
    data = {'status': 'success', 'message': '操作完成'}

    # 创建JsonResponse对象
    response = JsonResponse(data)

    # 设置cookie
    response.set_cookie(
        'my_cookie_name',        # Cookie的键
        'my_cookie_value',       # Cookie的值
        max_age=3600,            # 过期时间(秒),这里设置1小时
        httponly=True,           # 防止客户端JavaScript访问(增强安全性)
        samesite='Lax'           # 现代浏览器推荐的CSRF防护设置
    )
    
    # 你可以设置多个cookie
    # response.set_cookie('another_cookie', 'another_value', max_age=86400)

    return response

核心原理: Django的JsonResponse继承自HttpResponse,所以它完全具备set_cookie的能力。你需要先创建响应对象,配置好cookie,最后再返回它。顺序很重要:先实例化JsonResponse,然后调用set_cookie,最后return

一个更贴近真实场景的例子(比如用户登录后设置session标识):

from django.http import JsonResponse
import json

def login_api(request):
    if request.method == 'POST':
        try:
            req_data = json.loads(request.body)
            username = req_data.get('username')
            # ... 这里进行用户名和密码验证 ...
            
            # 验证通过,准备响应数据
            response_data = {'code': 0, 'msg': '登录成功'}
            response = JsonResponse(response_data)

            # 设置一个登录令牌cookie
            response.set_cookie(
                'auth_token',
                'generated_token_here',  # 这里应该是你生成的安全令牌
                max_age=7*24*3600,       # 有效期7天
                httponly=True,
                samesite='Lax',
                secure=True              # 如果使用HTTPS,建议设置为True
            )
            return response
        except Exception as e:
            return JsonResponse({'code': 1, 'msg': '请求解析失败'}, status=400)

一句话总结:先创建JsonResponse对象,然后用它的set_cookie方法设置cookie,最后返回这个对象。

response = HttpResponse(json.dumps(data), content_type=“application/json”)
response.set_cookie(xxx,xxx)
return response


resp = HttpResponse(content_type=“application/json”)
resp.set_cookie
resp.content = json.dumps(data)
恩,我这样改了

回到顶部