【问题标题】:updating user profile using django rest framework api使用 django rest framework api 更新用户配置文件
【发布时间】:2016-11-20 22:17:26
【问题描述】:

我想创建一个 API,用户可以在其中更新他们的个人资料。就我而言,用户可以更新他/她的用户名和密码。要更改他/她的个人资料,API 链接应为/api/change/usernameOfThatUser。当我在链接中使用不存在的用户名时,我仍然得到 userProfileChange API 页面,并且输入框没有填充以前的数据。我该如何解决这个问题?

serializers.py

User = get_user_model()

class UserProfileChangeSerializer(ModelSerializer):
    username = CharField(required=False, allow_blank=True, initial="current username")
    class Meta:
        model = User
        fields = [
            'username',
            'password',
        ]

    def update(self, instance, validated_data):
        instance.username = validated_data.get('username',instance.username)
        print('instance of username',instance.username)
        return instance 

views.py

class UserProfileChangeAPIView(UpdateAPIView):
    serializer_class = UserProfileChangeSerializer
    lookup_field = 'username'

urls.py

  url(r'^change/(?P<username>[\w-]+)$', UserProfileChangeAPIView.as_view(), name='changeProfile'),

【问题讨论】:

  • 当您在链接中使用不存在的用户名时,您希望发生什么?
  • 你的问题没有意义。 “我该如何解决这个问题?”
  • 假设我的用户名是 michael 那么我想要的是如果我想更改我的用户名然后我会做 /api/users/michael 并且页面将显示用户名字段和密码字段。在用户名字段中,我的名字将已经填写,然后我将对其进行编辑并保存。

标签: python django api django-rest-framework


【解决方案1】:

也许尝试在您的 views.py 中执行类似的操作?

from rest_framework import generics, mixins, permissions

User = get_user_model()

class UserIsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.id == request.user.id

class UserProfileChangeAPIView(generics.RetrieveAPIView,
                               mixins.DestroyModelMixin,
                               mixins.UpdateModelMixin):
    permission_classes = (
        permissions.IsAuthenticated,
        UserIsOwnerOrReadOnly,
    )
    serializer_class = UserProfileChangeSerializer
    parser_classes = (MultiPartParser, FormParser,)

    def get_object(self):
        username = self.kwargs["username"]
        obj = get_object_or_404(User, username=username)
        return obj

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

这将根据 url 中传递的用户名为您提供用户的所有现有数据。如果用户名不存在,则会引发 404 错误。您还可以更新或删除对象。

【讨论】:

  • 密码以 sha256$24000$ 形式显示。如何仅显示密码的空框?任何经过身份验证的用户都可以打开其他用户的个人资料编辑页面。那么你能启发我解决这个问题的概念吗?
  • @pri 如果您现在查看代码,它将确保用户只能编辑自己的个人资料。这是一个权限更改。我将为密码更改功能创建一个单独的函数。你也需要这方面的帮助吗?
  • @pri 你可以看看这个对密码进行哈希处理:stackoverflow.com/questions/27586095/…
  • 谢谢,我会看看散列密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多