【问题标题】:how to be authorized to create an object using django rest framework and CreateAPIView?如何授权使用 django rest 框架和 CreateAPIView 创建对象?
【发布时间】:2019-08-14 12:07:18
【问题描述】:

当我想使用 CreateAPIView 创建对象时遇到问题,我收到以下消息: "detail": "未提供身份验证凭据。"。

我使用 rest-auth 和 rest-authtoken 应用程序。

这是我到目前为止所做的:

models.py

class CustomUser(AbstractUser):
    objects = CustomUserManager()
    is_normal_user = models.BooleanField(default=False)
    is_corporate_user = models.BooleanField(default=False)

class CompanyProfile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    corporate_name = models.CharField(max_length=30)

serializers.py

class CompanyProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = CompanyProfile
        fields = ['user', 'corporate_name',]
        read_only_fields = ('id',)

views.py

class Authorized_Company_User(permissions.BasePermission):
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_corporate_user)

class CompanyCreateProfileView(generics.CreateAPIView):
    #queryset = CompanyProfile.objects.all()
    serializer_class = CompanyProfileSerializer
    #authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated, Authorized_Company_User)

我想知道我是否需要定义create函数,并使用get方法来获取用户authtoken。

【问题讨论】:

  • 一般情况下,需要向api提供一些认证数据。它可以在 cookie 或特定标头中提供。有没有在客户端获取token并发送给api的机制,供后续请求使用?
  • 是的,我在我的网络浏览器上使用标题扩展。我应该依靠它来构建我的网络应用程序吗?

标签: django django-rest-framework django-rest-auth


【解决方案1】:

"detail": "未提供身份验证凭据。"

这条消息是由permission_classes = IsAuthenticated引起的

您需要提供一个 Token 才能创建。

从 rest_auth 应用添加这个 url:

re_path(r'^rest_auth/',include('rest_auth.urls'))

那么你就可以使用 postman 进行测试了

method :POST
url: http://127.0.0.1:8000/rest_auth/login/
body: {"username":"user", "password":"password"}
headers: Content-Type: Application/json

作为你得到的回应

`{"key":"here your token"}`

使用此令牌,您可以添加新用户

method :POST
url: http://127.0.0.1:8000/add_user_url/
body: {"corporate_name":"corporate"}
headers: Content-Type: Application/json
         Authorization: "Token ########here your token########"

您可以在 CreateAPIView 中分配用户:

class CompanyCreateProfileView(generics.CreateAPIView): 
    def perform_create(self, serializer):
            serializer.save(user=self.request.user)

【讨论】:

  • 我使用这个问题的答案解决了身份验证令牌:stackoverflow.com/questions/39695187/…
  • 只剩下一个问题,我希望用户只为自己创建个人资料,因为我让所有用户都可以从中选择。谢谢。
  • 是的,用户可以通过分配经过身份验证的用户来创建 companyProfile。 serializer.save(user=self.request.user)
  • 感谢您的帮助。我在序列化程序中添加了这一行: user = serializers.PrimaryKeyRelatedField( read_only=True, default=serializers.CurrentUserDefault() )
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2019-06-14
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多