Django简单身份验证应用程序

时间:2015-11-14 14:12:32

标签: python django django-authentication

我需要一个项目一个简单的后端,具有以下功能(所有必须通过API完成,因为这将由另一个程序访问):

  1. 如果用户未经过身份验证,则无法执行任何操作
  2. 为了获得身份验证,用户知道“DEFAULT USER”凭据

    2.1用户尝试使用“DEFAULT USER”凭据登录

    2.2应用程序使用随机传递和用户名(或令牌)创建一个新用户并将其返回给用户,以便他以后可以使用这些新凭据对服务器进行身份验证

  3. 经过身份验证的用户只能在数据库中创建1个条目或更新由他们创建的条目。
  4. 过去几天我一直在尝试这样做,但是我设法为DJANGO-REST-FRAMEWORK找到的所有django教程都没有帮助我。

    目前这就是我所得到的:

    urls.py

    from django.conf.urls import url
    from rest_framework.urlpatterns import format_suffix_patterns
    from api import views
    from api.serializers import UserSerializer
    
    urlpatterns = [
      url(r'^api-classes/$', views.UserStatisticsList.as_view()),
      url(r'^api/$', views.userStatistics_list),
      url(r'^users/$', views.UserList.as_view()),
    ]
    
    urlpatterns = format_suffix_patterns(urlpatterns)
    

    serializers.py:

    from rest_framework import serializers
    from api.models import UserStatistics
    from django.contrib.auth.models import User
    
    
    class UserStatisticsSerializer(serializers.ModelSerializer):
        user = serializers.ReadOnlyField(source='user.username')
    
        class Meta:
            model = UserStatistics
            fields = ('id','user', 'last_modified', 'statistics_json',)
    
    
        def create(self, validated_data):
            """
            Create and return a new `UserStatistics` instance, given the validated data.
            """
            return UserStatistics.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            """
            Update and return an existing `UserStatistics` instance, given the validated data.
            """
            instance.last_modified = validated_data.get('last_modified', instance.last_modified)
            instance.statistics_json = validated_data.get('statistics_json', instance.statistics_json)
    
            instance.save()
            return instance
    
    class UserSerializer(serializers.ModelSerializer):
        # userStat = serializers.PrimaryKeyRelatedField(many=False, queryset=UserStatistics.objects.all())
    
        class Meta:
            model = User
            fields = ('id', 'username',)
            # fields = ('id', 'username', 'userStat')
    

    views.py:

    from rest_framework import status
    from rest_framework.decorators import api_view
    from rest_framework.response import Response
    from api.models import UserStatistics
    from api.serializers import UserStatisticsSerializer, UserSerializer
    from rest_framework import permissions
    
    @api_view(['GET', 'POST'])
    def userStatistics_list(request, format=None):
        """
        List all code snippets, or create a new snippet.
        """
        if request.method == 'GET':
            userStat = UserStatistics.objects.all()
            serializer = UserStatisticsSerializer(userStat, many=True)
            return Response(serializer.data)
    
        elif request.method == 'POST':
            serializer = UserStatisticsSerializer(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)
    
    
    from rest_framework import mixins
    from rest_framework import generics
    
    class UserStatisticsList(
                      mixins.ListModelMixin,
                      mixins.CreateModelMixin,
                      generics.GenericAPIView):
        """
        List all UserStatistics, or create a new UserStatistics.
        """
        queryset = UserStatistics.objects.all()
        serializer_class = UserStatisticsSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
        def perform_create(self, serializer):
            serializer.save(user=self.request.user)
    
        # def get(self, request, format=None):
        #     userStat = UserStatistics.objects.all()
        #     serializer = UserStatisticsSerializer(userStat, many=True)
        #     return Response(serializer.data)
    
        # def post(self, request, format=None):
        #     serializer = UserStatisticsSerializer(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)
    
    from django.contrib.auth.models import User
    
    class UserList(generics.ListAPIView):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    

    models.py: 来自django.db导入模型     来自jsonfield导入JSONField     来自django.contrib.auth.models导入用户

    # Create your models here.
    class UserStatistics(models.Model):
        last_modified = models.DateTimeField(auto_now_add=True)
        statistics_json = JSONField()
    
        user = models.OneToOneField(User, related_name="creator")
    
        class Meta:
            ordering = ('last_modified','statistics_json',)
    

    我还试图实现一个自定义的Authenticator,在我的理解中,当用户想要进行身份验证时会调用它...:

    import string
    import random
    from django.contrib.auth.models import User, check_password, ModelBackend
    
    
    class SettingsBackend(ModelBackend):
        """
        Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
    
        Use the login name, and a hash of the password. For example:
    
        ADMIN_LOGIN = 'admin'
        ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
        """
    
        ANDROID_LOGIN_USERNAME = "android"
        ANDROID_LOGIN_PASSWORD = "android"
    
        def authenticate(self, username=None, password=None):
            login_valid = (ANDROID_LOGIN_USERNAME == username)
            pwd_valid = check_password(password, ANDROID_LOGIN_PASSWORD)
            if login_valid and pwd_valid:
                # try:
                #     user = User.objects.get(username=username)
                # except User.DoesNotExist:
                #     return None
                    # Create a new user. Note that we can set password
                    # to anything, because it won't be checked; the password
                    # from settings.py will.
                user = User(username=random_string_generator(), password=random_string_generator())
                user.save()
                return user
            return None
    
        def random_string_generator(size=6, chars=string.ascii_uppercase + string.digits):
            return ''.join(random.choice(chars) for _ in range(size))
    
        def has_perm(self, user_obj, perm, obj=None):
            if user_obj.username == settings.ANDROID_LOGIN_USERNAME:
                return True
            else:
                return False
    
        def get_user(self, user_id):
            try:
                return User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return None
    

    有人可以指出下一步该做什么吗?

    谢谢

0 个答案:

没有答案