Django Rest Framework中的用户注册端点

时间:2015-06-15 21:49:08

标签: django django-rest-framework

我正在使用Django休息框架。我已经编写了以下视图来向系统注册新用户。

@api_view(['POST'])
@csrf_exempt
@permission_classes((AllowAny, ))
def create_user(request):
    email = request.DATA['email']
    password = request.DATA['password']
    try:
        user = User.objects.get(email=email)
        false = False
        return HttpResponse(json.dumps({
            'success': False,
            'reason': 'User with this email already exists'
        }), content_type='application/json')
    except User.DoesNotExist:
        user = User(email=email, username=email)
        user.set_password(password)
        user.save()
        profile = UserProfile(user=user)
        profile.save()
        profile_serialized = UserProfileSerializer(profile)
        token = Token(user=user)
        token.save()
        return HttpResponse(json.dumps({
            'success': True,
            'key': token.key,
            'user_profile': profile_serialized.data
        }), content_type='application/json')

是否有更好,更安全的方法,在DRF中创建一个用户注册api,不会让端点对sql注入开放?

2 个答案:

答案 0 :(得分:2)

请原谅我一点点离题,但我不禁想知道,如果您创建了一个序列化程序并使用了基于类的视图,那么使用的代码可能会少得多。此外,如果您刚刚创建了电子邮件作为序列化程序的EmailField,它将自动保证电子邮件的验证。由于您使用的是orm接口,因此我认为sql注入的风险比原始查询要小得多。

示例代码: -

class UserList(CreateAPIView):

 serializer_class = UserSerializer


class UserSerializer(ModelSerializer):

  email = serializers.EmailField()
  raw_password = serializers.CharField()

这些方面有些东西,显然我无法编写完整的代码。

答案 1 :(得分:0)

您可以使用validate-email-address模块验证序列化程序中的电子邮件,如下所示:

from validate_email_address import validate_email
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    def validate_email(self, value):
        if not validate_email(value):
            raise serializers.ValidationError("Not a valid email.")
        return value

    class Meta:
        model = User
        fields = ('email', 'password')

此外,您可以考虑使用Djoser等打包的身份验证/注册解决方案。