道歉,如果这是一个非常基本的问题,但我对网络开发相对较新,并且在今天的大部分时间里一直坚持以下问题 - 非常感谢任何帮助。
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',
]
感谢您的帮助,
答案 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框架,也可能不适用于该框架。