Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中禁用注册授权?_Python_Django_Python 3.x_Django Models_Django Rest Framework - Fatal编程技术网

Python 如何在Django中禁用注册授权?

Python 如何在Django中禁用注册授权?,python,django,python-3.x,django-models,django-rest-framework,Python,Django,Python 3.x,Django Models,Django Rest Framework,我正在使用此身份验证: from rest_framework.authtoken import views as rest_auth_views url(r'^login/', rest_auth_views.obtain_auth_token) 一切都很好,但为了创建新的帐户,我必须发送令牌在标题什么是错误的。我正在使用以下视图创建新帐户: @api_view(['GET', 'POST']) def UserList(request): """ List all sni

我正在使用此身份验证:

from rest_framework.authtoken import views as rest_auth_views

url(r'^login/', rest_auth_views.obtain_auth_token)
一切都很好,但为了创建新的帐户,我必须发送令牌在标题什么是错误的。我正在使用以下视图创建新帐户:

@api_view(['GET', 'POST'])
def UserList(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = UserSerializer(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 permissions

class CustomPermission(permissions.BasePermission):

    def has_permission(self, request, view):
        if request.method =='POST' or (request.user and request.user.is_authenticated() and request.user.is_superuser):
            return True
        return False

@api_view(['GET', 'POST'])
@permission_classes([CustomPermission])
def UserList(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = UserSerializer(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)

您可以导入
AllowAny
权限并将类添加到视图中

from rest_framework.permissions import AllowAny
from rest_framework.decorators import permisson_classes

@api_view(['GET', 'POST'])
@permission_classes([AllowAny])
def UserList(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)
或者使用基于类的视图

from rest_framwork.views import APIView

class UserListView(APIView):
    permission_classes = (AllowAny,)

    def get(self, request, *args, **kwargs):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request, *args, **kwargs):
        serializer = UserSerializer(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)            
正如@Andre Terra所提到的,上述方法可能会损害某些行为,因为任何人都可以使用GET请求检索用户列表

为了克服同样的问题,我建议为视图编写一个自定义权限。大概是这样的,

class CustomPermission(BasePermission):

    def has_permission(self, request, view):
        if request.method =='POST' or (request.user and request.user.is_authenticated() and request.user.is_superuser): 
            return True 
        return False

现在,只有超级用户才能获得用户列表。

您可以导入
AllowAny
权限并将类添加到视图中

from rest_framework.permissions import AllowAny
from rest_framework.decorators import permisson_classes

@api_view(['GET', 'POST'])
@permission_classes([AllowAny])
def UserList(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)
或者使用基于类的视图

from rest_framwork.views import APIView

class UserListView(APIView):
    permission_classes = (AllowAny,)

    def get(self, request, *args, **kwargs):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request, *args, **kwargs):
        serializer = UserSerializer(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)            
正如@Andre Terra所提到的,上述方法可能会损害某些行为,因为任何人都可以使用GET请求检索用户列表

为了克服同样的问题,我建议为视图编写一个自定义权限。大概是这样的,

class CustomPermission(BasePermission):

    def has_permission(self, request, view):
        if request.method =='POST' or (request.user and request.user.is_authenticated() and request.user.is_superuser): 
            return True 
        return False

现在,只有超级用户才能获得用户列表。

您能从一开始就显示整个视图吗?i、 e.从
def
line@AndreTerra我已经更新了我的帖子。你能从一开始就展示你的整个视图吗?i、 e.从
def
line@AndreTerra我已经更新了我的帖子。感谢你的支持,兄弟@Wahtdbogh这将允许未经身份验证的用户使用GET列出每个用户,这可能超出了您允许此类用户创建其帐户的原始意图。我个人将UserList和UserCreate分开,因为它们涉及不同的内容(每个用户与一个用户),在不久的将来,我将添加权限,因此,例如,只有管理员才能使用GET列出每个用户。但也许即使这样,还是把这两件事分开比较好?答案似乎是肯定的,因为在我看来,管理员应该有权列出所有用户,但是每个用户都应该有可能在没有管理员权限的情况下创建帐户。当他们引用不同的资源或操作时,你应该分开视图,当权限不同时不会这样做,因为权限始终可以按方法而不是按视图定义。至少这是我的看法。话虽如此,@FazilZaid的解决方案效果很好,所以也许现在就这么做吧,我完全同意you@Andre谢谢你的支持,兄弟@Wahtdbogh这将允许未经身份验证的用户使用GET列出每个用户,这可能超出了您允许此类用户创建其帐户的原始意图。我个人将UserList和UserCreate分开,因为它们涉及不同的内容(每个用户与一个用户),在不久的将来,我将添加权限,因此,例如,只有管理员才能使用GET列出每个用户。但也许即使这样,还是把这两件事分开比较好?答案似乎是肯定的,因为在我看来,管理员应该有权列出所有用户,但是每个用户都应该有可能在没有管理员权限的情况下创建帐户。当他们引用不同的资源或操作时,你应该分开视图,当权限不同时不会这样做,因为权限始终可以按方法而不是按视图定义。至少这是我的看法。话虽如此,@FazilZaid的解决方案效果很好,所以也许现在就这么做吧,我完全同意you@Andre泰拉。