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泰拉。