基于类的视图,响应头和CORS

时间:2014-01-04 14:15:07

标签: django cors django-rest-framework

道歉,如果这是一个非常基本的问题,但我对网络开发相对较新,并且在今天的大部分时间里一直坚持以下问题 - 非常感谢任何帮助。

1。基于通用类的视图

我真的只是在这里阅读教程并根据自己的基本需求对其进行修改,并最终得到如下基本视图:

class EList(generics.ListCreateAPIView):
    model = trax 
    #permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    serializer_class = TraxSerializer

将向此api发布的是我正在构建的外部服务,这意味着我遇到了跨域资源共享问题(CORS)。理想情况下,我需要将标头设置为类似["Access-Control-Allow-Origin"] = "*"的内容,但即使在搜索之后,我也不确定如何使用这些基于通用类的视图执行此操作。这可能吗,我刚刚找错了地方?

我找到了this post,Tom已经提到过这是可能的,但似乎无法在我上面的视图中使用,这导致我进入下一步

2.。)基于类的视图

为了尝试在设置标题方面获得更多灵活性并尝试我在CORS上发布的内容,我决定恢复到基于标准类的视图,如下所示:

class EList(APIView):
    """
    List all snippets, or create a new snippet.
    """
    def get(self, request, format=None):
        trax = trax.objects.all()
        serializer = TraxSerializer(trax, many=True)
        return Response(serializer.data)
    def post(self, request, format=None):  
        serializer = TraxSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

但是我收到以下错误:

  

无法在没有的视图上应用DjangoModelPermissions   .model.queryset属性。

有没有解决方法,所以我可以尝试在这里设置响应标头?这也是我目前的权限:

'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    ]

感谢您的帮助,

2 个答案:

答案 0 :(得分:1)

要使其工作,您需要允许外部Web服务进行跨源请求。最简单的方法是安装django-cors-headers软件包并在settings.py中添加服务主机名,如下所示:

CORS_ORIGIN_WHITELIST = (
    'myservice.com',
)

其中myservice.com是进行ajax调用的外部服务。另请记住遵循these setup instructions

答案 1 :(得分:0)

对于Django Framework本身,您可以执行以下操作:

您可以放置​​通配符“ *”或任何其他URL来代替URL“ https://origin.com”。

class PriceListTableView(TemplateView):
    template_name = "pages/price_list_table.html"

    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)
        response['Access-Control-Allow-Origin'] = 'https://origin.com'
        return response

可能适用于Django REST框架,也可能不适用于该框架。