使用@login_required时Django的getFields视图返回302状态码问题
问题原因及解决办法
核心问题:前端请求的关键参数拼写错误
你前端fetch代码里的credentails是拼写错误,正确写法是credentials。这个参数的作用是让浏览器在请求时携带登录状态对应的Session Cookie,拼写错误导致浏览器没把Sessionid传给后端,Django的@login_required装饰器自然检测不到用户已登录。
其他需要修正的问题
- GET请求解析request.body不合理:你的视图里写了
POST = json.loads(request.body),但GET请求本身没有请求体,这行代码不仅没用,还可能抛出异常(比如当request.body为空时),建议直接删除。 - Content-Type头拼写错误:请求头里的
application-json应该写成application/json,虽然这不会直接影响登录验证,但规范的写法能避免其他潜在问题。
修正后的代码示例
前端代码:
try{ const response = await fetch(`http://127.0.0.1:8000/getFields`,{ method:'GET', headers:{ 'Content-Type': 'application/json', 'X-CSRFToken': Cookies.get('csrftoken'), }, credentials: 'include' // 修正拼写错误 }) // 补充后续的响应处理逻辑 } catch(error) { console.error('请求失败:', error) }
后端视图代码(优化冗余部分):
@login_required def getFields(request): try: fields = Field.objects.all() # 用列表推导式简化代码 field_list = [field.to_dict() for field in fields] print(field_list) return JsonResponse({ 'status': 200, 'fields': field_list }) except ObjectDoesNotExist: return JsonResponse({ 'status': 404 })
内容的提问来源于stack exchange,提问作者codeouz
相关产品推荐
相关产品推荐

