api-service.js
这是我的api代码。使用这段代码,用户可以登录并进行一些操作,如更新、创建和删除电影。所有功能都能正常使用,除了 注册用户.
export class API {
static loginUser(body) {
return fetch(`http://127.0.0.1:8000/auth/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify( body )
}).then( resp => resp.json())
}
static registerUser(body) {
return fetch(`http://127.0.0.1:8000/api/users/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify( body )
}).then( resp => resp.json())
}
static updateMovie(mov_id, body, token) {
return fetch(`http://127.0.0.1:8000/api/movies/${mov_id}/`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': `Token ${token}`
},
body: JSON.stringify( body )
}).then( resp => resp.json())
}
static createMovie(body, token) {
return fetch(`http://127.0.0.1:8000/api/movies/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Token ${token}`
},
body: JSON.stringify( body )
}).then( resp => resp.json())
}
static deleteMovie(mov_id, token) {
return fetch(`http://127.0.0.1:8000/api/movies/${mov_id}/`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': `Token ${token}`
}
})
}
}
auth.js
import React, { useState, useEffect } from 'react';
import { API } from '../api-service';
import { useCookies } from 'react-cookie';
function Auth(){
const [ username, setUsername ] = useState('');
const [ password, setPassword ] = useState('');
const [ isLoginView, setIsLoginView ] = useState(true);
const [token, setToken] = useCookies(['mr-token']);
useEffect( () => {
if (token['mr-token']) window.location.href = '/movies';
}, [token])
const loginClicked = () => {
API.loginUser({username, password})
.then( resp => setToken('mr-token', resp.token))
.catch( error => console.log(error))
}
const registerClicked = () => {
API.registerUser({username, password})
.then( () => loginClicked())
.catch( error => console.log(error))
}
return (
<div>
{isLoginView ? <h1>Login</h1> : <h1>Register</h1>}
<label htmlFor="username">Username</label><br/>
<input id="username" type="text" placeholder="username" value={username}
onChange = {evt => setUsername(evt.target.value)}
/><br/>
<label htmlFor="password">Password</label><br/>
<input id="password" type="password" placeholder="password" value={password}
onChange = {evt => setPassword(evt.target.value)} /><br/>
{ isLoginView ?
<button onClick={loginClicked} >Login</button> :
<button onClick={registerClicked} >Register</button>
}
{ isLoginView ?
<p onClick={() => setIsLoginView(false)}>You don't have an account? Register here!</p> :
<p onClick={() => setIsLoginView(true)}>You already have an account? Login here!</p>
}
</div>
)
}
export default Auth;
错误-截图
https:/i.imgur.compMul9rT.png。
我试图在django数据库中注册新用户,但我得到这个错误。请帮帮我。
错误:views.py
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated, AllowAny
from django.contrib.auth.models import User
from .models import Movie, Rating
from .serializers import MovieSerializer, RatingSerializer, UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)
@action(detail=True, methods=['POST'])
def rate_movie(self, request, pk=None):
if 'star' in request.data:
movie = Movie.objects.get(id=pk)
star = request.data['star']
user = request.user
try:
rating = Rating.objects.get(user=user.id, movie=movie.id)
rating.star = star
rating.save()
serializer = RatingSerializer(rating, many=False)
response = {'message': 'rating updated', 'result': serializer.data}
return Response(response, status=status.HTTP_200_OK)
except:
rating = Rating.objects.create(user=user, movie=movie, star=star)
serializer = RatingSerializer(rating, many=False)
response = {'message': 'rating created', 'result': serializer.data}
return Response(response, status=status.HTTP_200_OK)
else:
response = {'message': 'You need to provide stars'}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
class RatingViewSet(viewsets.ModelViewSet):
queryset = Rating.objects.all()
serializer_class = RatingSerializer
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)
def update(self, request, *args, **kwargs):
response = {'message': 'You cant update rating like that'}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
def create(self, request, *args, **kwargs):
response = {'message': 'You cant create rating like that'}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
正确: views.py
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated, AllowAny
from django.contrib.auth.models import User
from .models import Movie, Rating
from .serializers import MovieSerializer, RatingSerializer, UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (AllowAny,)
class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)
@action(detail=True, methods=['POST'])
def rate_movie(self, request, pk=None):
if 'star' in request.data:
movie = Movie.objects.get(id=pk)
star = request.data['star']
user = request.user
try:
rating = Rating.objects.get(user=user.id, movie=movie.id)
rating.star = star
rating.save()
serializer = RatingSerializer(rating, many=False)
response = {'message': 'rating updated', 'result': serializer.data}
return Response(response, status=status.HTTP_200_OK)
except:
rating = Rating.objects.create(user=user, movie=movie, star=star)
serializer = RatingSerializer(rating, many=False)
response = {'message': 'rating created', 'result': serializer.data}
return Response(response, status=status.HTTP_200_OK)
else:
response = {'message': 'You need to provide stars'}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
class RatingViewSet(viewsets.ModelViewSet):
queryset = Rating.objects.all()
serializer_class = RatingSerializer
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)
def update(self, request, *args, **kwargs):
response = {'message': 'You cant update rating like that'}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
def create(self, request, *args, **kwargs):
response = {'message': 'You cant create rating like that'}
return Response(response, status=status.HTTP_400_BAD_REQUEST)
答案:view.py在我的django views.py代码中,我只需要添加以下语句 permission_classes = (AllowAny,)
在类UserViewSet中。然后错误就消失了。
我要感谢@kaajavi,他告诉我,我的服务器端出现了错误。