@csrf_exempt 类的视图跨域

本文介绍了如何在Django中为基于类的视图设置@csrf_exempt注解,使其能够跨域访问。通常有两种方法实现这一目标:一种是在类的dispatch方法上使用@csrf_exempt注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问。

那么对于基于类的视图,我们应该怎么办呢?

简单来说可以有两种访问来解决

方法一:在类的 dispatch 方法上使用 @csrf_exempt


转载:https://blog.youkuaiyun.com/kongxx/article/details/77322657

from django.http import HttpRequest, HttpResponse,JsonResponse from django.shortcuts import render # 加载model from gaode.models import T_info # JsonResponse # Create your views here. from django.views.decorators.csrf import csrf_exempt def index(request): return render(request, 'index.html') # 增加数据api @csrf_exempt def add_data(request): print(request.POST) # 获取前端传递的数据 city = request.POST.get('city') name = request.POST.get('name') lat = request.POST.get('lat') lng = request.POST.get('lng') desc = request.POST.get('desc') # 创建model对象 t_info = T_info() # 将前端传递的数据赋值给model对象 t_info.city = city t_info.name = name t_info.lat = lat t_info.lng = lng t_info.desc = desc t_info.save() return JsonResponse({'code': 0, 'msg': 'success'}) # 查询 @csrf_exempt def query_data(request): # 判断是否有查询条件 if request.GET.get('id'): print(request.GET.get('id')) # 根据id查询数据 t_info = T_info.objects.get(id=request.GET.get('id')) # 返回数据 return JsonResponse({'code': 0, 'msg': 'success', 'data': { 'id': t_info.id, 'city': t_info.city, 'name': t_info.name, 'lat': t_info.lat, 'lng': t_info.lng, 'desc': t_info.desc }}) else: # 查询数据 t_info_list = T_info.objects.all() # 将查询结果转换为json t_info_list_json = [] for t_info in t_info_list: t_info_list_json.append({ 'id': t_info.id, 'city': t_info.city, 'name': t_info.name, 'lat': t_info.lat, 'lng': t_info.lng, 'desc': t_info.desc }) return JsonResponse({'code': 0, 'msg': 'success', 'data': t_info_list_json}) # 删除 def delete_data(request): # 获取前端传递的id id = request.GET.get('id') # 根据id删除数据 T_info.objects.filter(id=id).delete() return JsonResponse({'code': 0, 'msg': 'success'}) # 更新 @csrf_exempt def update_data(request): # 获取前端传递的数据 id = request.POST.get('id') city = request.POST.get('city') name = request.POST.get('name') lat = request.POST.get('lat') lng = request.POST.get('lng') desc = request.POST.get('desc') # 根据id查询数据 t_info = T_info.objects.get(id=id) # 将前端传递的数据赋值给model对象 t_info.city = city t_info.name = name t_info.lat = lat t_info.lng = lng t_info.desc = desc t_info.save() return JsonResponse({'code': 0, 'msg': 'success'}) @csrf_exempt def get_data(request): #遍历url中的参数 print(11) for k,v in request.GET.items(): print(k,v) # 查询 if(k=='city'): # 模糊查询 t_info_list = T_info.objects.filter(city__contains=v) elif(k=='name'): t_info_list = T_info.objects.filter(name__contains=v) # t_info_list = T_info.objects.filter(k=v) # 将查询结果转换为json t_info_list_json = [] for t_info in t_info_list: t_info_list_json.append({ 'id': t_info.id, 'city': t_info.city, 'name': t_info.name, 'lat': t_info.lat, 'lng': t_info.lng, 'desc': t_info.desc }) return JsonResponse({'code': 0, 'msg': 'success', 'data': t_info_list_json})需要导入什么库
最新发布
06-18
from django.contrib.auth.models import User from django.contrib.auth import authenticate from django.http import HttpResponse from django.shortcuts import render from django.views.decorators.csrf import csrf_exempt from rest_framework import status from rest_framework.templatetags.rest_framework import data from rest_framework.views import APIView from rest_framework.response import Response from app.scripts.mysql import Mysql from django.contrib.auth.hashers import make_password from rest_framework import serializers from rest_framework_simplejwt.tokens import RefreshToken from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt import json from rest_framework.authentication import SessionAuthentication, BasicAuthentication from rest_framework.permissions import AllowAny from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .models import LoginSerializer#UserProfileSerializer #def index(request): # import json #return HttpResponse("链接成功"), #Create your views here. class LoginView(APIView): authentication_classes = [SessionAuthentication] # 按需选择认证方式 permission_classes = [AllowAny] def post(self,request,*args,**kwargs): serializer = LoginSerializer(data=request.data) if not serializer.is_valid(): return Response({ 'code': 400, 'message': '参数错误', 'errors': serializer.errors }, status=status.HTTP_400_BAD_REQUEST) user = authenticate( username=serializer.validated_data['username'], password=serializer.validated_data['password'] ) if not user: return Response({ 'code': 401, 'message': '用户名或密码错误' }, status=status.HTTP_401_UNAUTHORIZED) refresh = RefreshToken.for_user(user) return Response({ 'code': 200, 'message': '登录成功', # 'data': { # 'user': UserProfileSerializer(user).data, #'access': str(refresh.access_token), # 'refresh': str(refresh) # } }) @csrf_exempt # 临时禁用CSRF验证(生产环境需替换为安全方案) def index(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') #打印到PyCharm控制台 print(f"接收到的数据:用户名={username}, 密码={password}") return JsonResponse({'status': 'success'}) return JsonResponse({'status': 'invalid method'}, status=400)这为上面报错的视图代码,结合上面的问题,看问题可能出在哪里
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值