【问题标题】:AngularJS + django REST apiAngularJS + Django REST API
【发布时间】:2016-02-11 08:32:35
【问题描述】:

我正在尝试使用 DRF 构建一个 api。

Client 是一个由 AngularJS 支持的 cordova 应用程序。

当我尝试使用 $resource 发布一些用户对象时,我收到了来自 django 的 403 禁止响应。

以下是我认为与该问题相关的一些代码:

API 调用:

$rootScope.user = 
        User.get({id: response.id}).$promise.then(angular.noop, function (e) {
                                if (e.status == 404) { //If not found, register the user.
                                    $rootScope.user = new User();
                                    Object.keys(response).forEach(function (key) {
                                        $rootScope.user[key] = response[key];
                                    });
                                    $rootScope.user.$save(); //Fails here! 403.
                                }
                                else
                                    console.log(JSON.stringify(e.msg));
                            });

用户工厂:

.factory('User', function ($resource, serverConstants) {
        return $resource(serverConstants.serverUrl + '/users/:id');
    })

django 视图:

# Users
class UserSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.CharField(max_length=100,required=True)
    email = serializers.EmailField(required=False,allow_blank=True)
    joined = serializers.DateField(required=False,default=datetime.date.today)
    class Meta:
        model = models.User
        fields = ('joined', 'id', 'email')

    def get_validation_exclusions(self):
        exclusions = super(UserSerializer, self).get_validation_exclusions()
        return exclusions + ['owner']

class UserViewSet(viewsets.ModelViewSet):
    queryset = models.User.objects.all()
    serializer_class = UserSerializer

PS:我已将 Angular 配置为使用 CSRF cookie 和 django 以允许 CORS

提前致谢!

【问题讨论】:

  • 除了 403 之外,您还有其他关于响应的信息吗?内容是什么?
  • 我不确定,但我认为这是回复:{"detail":"Authentication credentials were not provided."}

标签: angularjs django cordova


【解决方案1】:

您的/user/:id 端点需要authenticated requests

您需要使用上一个链接中指定的方法之一对客户的请求进行身份验证。

鉴于您的应用在 WebView 中运行,然后具有内置的 cookie 处理,SessionAuthentication 更容易实现。

如果您希望端点不需要身份验证,您可以像这样设置其permission_classes 属性:

from rest_framework.permissions import AllowAny


class UserViewSet(viewsets.ModelViewSet):
    queryset = models.User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (AllowAny, )

【讨论】:

  • 如何将 POST 公开为公开的未经身份验证的请求?有可能吗?
  • 能否在问题中添加 Django 视图的代码?
【解决方案2】:

我猜 DRF 是指 django-rest-framework。

如果是,请看这里:

http://www.django-rest-framework.org/api-guide/authentication/

您可以使用 AllowAny 将视图设为公开。

from rest_framework.permissions import AllowAny
from rest_framework import generics

restapi_permission_classes = (AllowAny,)


class MyListView(generics.ListCreateAPIView):
    serializer_class = MyObjectSerializer
    permission_classes = restapi_permission_classes
    queryset = MyObject.objects.all()

但是,我建议您在完成测试后使用正确的身份验证。我一直在使用令牌身份验证。

查看这篇文章了解更多详情:

Django Rest Framework Token Authentication

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多