【发布时间】:2020-12-12 18:10:23
【问题描述】:
项目的运作方式是在创建房间时应该给出一个随机代码(避免重复和猜测没有被占用的代码),并且主人应该创建自己的名字。
在文件中,我创建了房间并生成了一个在创建房间时应该给出的随机代码,但我收到了 HTTP 405 Method Not Allowed。我正在尝试发布而不是获取,所以我对为什么会发生这种情况感到困惑;并且其他参数(代码和主机)不显示。我假设代码和主机密钥会出现在 create 方法中,但事实并非如此。我还想补充一点,无论更改序列化程序以将 id、代码和主机添加到序列化程序,还是按照屏幕截图中的方式保留代码,我都会收到完整性错误。
models.py
from django.db import models
import random
import string
# Create your models here.
def code():
"""
function randomly creates room access code
"""
length = 7
while True:
code = ''.join(random.choices(string.ascii_uppercase + string.digits, k=length))
if Room.objects.filter(code=code).count() == 0:
break
return code
class Room(models.Model):
"""
sets up room requirements and stores it as a model
"""
code = models.CharField(max_length=10, default=code,
unique=True)
host = models.CharField(max_length=50, unique=True)
guest_can_pause = models.BooleanField(null=False, default=False)
votes_to_skip = models.IntegerField(null=False, default=1)
created_at = models.DateTimeField(auto_now_add=True)
序列化器.py
from rest_framework import serializers
from .models import Room
class RoomSerializer(serializers.ModelSerializer):
class Meta:
model = Room
fields = ('id', 'code', 'host', 'guest_can_pause',
'votes_to_skip', 'created_at')
class CreateRoomSerializer(serializers.ModelSerializer):
class Meta:
model = Room
fields = ('guest_can_pause', 'votes_to_skip')
views.py
from django.shortcuts import render
from .models import Room
from .serializers import RoomSerializer, CreateRoomSerializer, UpdateRoomSerializer
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import generics, status
# Create your views here.
class RoomView(generics.ListAPIView):
"""
collects all parameters from a serializer to show an existing room
"""
queryset = Room.objects.all()
serializer_class = RoomSerializer
class CreateRoomView(APIView):
"""
creates a room using the POST method and accesses the serializer for the
parameters
"""
serializer_class = CreateRoomSerializer
def post(self, request, format=None):
if not self.request.session.exists(self.request.session.session_key):
self.request.session.create()
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
guest_can_pause = serializer.data['guest_can_pause']
votes_to_skip = serializer.data['votes_to_skip']
host = self.request.session.session_key
queryset = Room.objects.filter(host=host)
if queryset.exists():
room = queryset[0]
room.guest_can_pause = guest_can_pause
room.votes_to_skip = votes_to_skip
room.save(update_fields=['guest_can_pause', 'votes_to_skip'])
return Response(RoomSerializer(room).data, status=status.HTTP_200_OK)
else:
room = Room(host=host, guest_can_pause=guest_can_pause,
votes_to_skip=votes_to_skip)
room.save()
return Response(RoomSerializer(room).data, status=status.HTTP_201_CREATED)
return Response({'Bad Request': 'Invalid data...'}, status=status.HTTP_400_BAD_REQUEST)
【问题讨论】:
-
你能把代码作为代码而不是截图吗?
-
使用邮递员,那么你不会得到任何错误,因为如果你在浏览器中传递 URL,它总是(GET)只是这样说
标签: python django rest django-rest-framework