此问题基于一个here。我正在为我的Web应用程序设置Django REST框架,并尝试设置用户帐户。基于REST文档,他们将所有帐户代码都放在示例中的主项目目录中,并且单独的应用程序中也是如此。这是我所拥有的:
urls.py
from django.contrib import admin
from django.urls import include, path
from django.conf.urls import url
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register('users', views.UserViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
url('', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
serializers.py
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
def create(self, validated_data):
user = User.objects.create(
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
class Meta:
model = User
# Tuple of serialized model fields (see link [2])
fields = ( "id", "username", "password", )
views.py
from rest_framework import viewsets, permissions
from rest_framework.generics import CreateAPIView
from django.contrib.auth.models import User
from .serializers import UserSerializer
# Create your views here.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
class CreateUserView(CreateAPIView):
model = User
permission_classes = [
permissions.AllowAny
]
serializer_class = UserSerializer
我曾尝试在Chrome中使用Boomerang REST客户端将数据发布到此API,但它始终返回403错误,提示“无效的用户名/密码。”具体来说,我要使用查询字符串和2个参数(用户名和密码)发布到http://127.0.0.1:8000/users/create/。我也尝试将其作为JSON发送,并且返回了相同的结果。任何帮助,将不胜感激。
urlpatterns = [
...
url(r'^users/create/', views.CreateUserView.as_view()),
]
也就是说,我建议您为extra action添加一个UserViewSet
:# Create your views here. class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer permission_classes = [permissions.IsAuthenticated @action(methods=['post'], detail=False, permission_classes=[permissions.AllowAny]) def register(self, request, *args, **kwargs): # This logic was taken from the `create` on `ModelViewSet`. Alter as needed. serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
然后您应该可以通过/users/register/
发布信息。您也可以在装饰器上单击specify your own url name and path。