【问题标题】:TypeError: Password must be a string or bytes, got BoundFieldTypeError: Password must be a string or bytes, got BoundField
【发布时间】:2021-06-25 03:14:15
【问题描述】:

我正在创建一个登录页面。我想在后端接收 json 格式,其中包含字符串格式的用户名和密码字段。但是当我尝试验证用户名和密码时(在views.py中)。我收到以下错误:

TypeError: Password must be a string or bytes, got BoundField.

views.py

from .serializers import event_serializer, student_serializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth import authenticate, login, logout
from django.db import IntegrityError

@api_view(['POST', 'GET'])
def login_view(request):
    if request.method == "POST":
        serializer = student_login_serializer(data=request.data)
        if serializer.is_valid():
            print("serializer is valid")
            username_pwd = serializer
            username = username_pwd["username"]
            password = username_pwd["password"]
            student = authenticate(request, username=username, password=password)
            if student is not None:
                login(request, student)
                events = Event.objects.all()
                serializer = event_serializer(events, many=True)
                return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
            else:
                return Response(serializer.data, status=status.HTTP_401_UNAUTHORIZED)
        return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)
    elif request.method == "GET":
        users = Student.objects.all()
        serializer = student_serializer(users, many=True)
        return Response(serializer.data)

serializers.py

from rest_framework import serializers
from .models import Student, Club, member_request, Event, Comment
from django import forms

class student_login_serializer(forms.Form):
    username = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Username'}))
    password = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Password'}))
    fields = ['username', 'password']

models.py

from django.contrib.auth.models import AbstractUser
from django.db import models

class Student(AbstractUser):
    pass

请随时向我询问有关此问题的更多详细信息,并提前致谢。

【问题讨论】:

    标签: python json django django-rest-framework


    【解决方案1】:

    是的,这是真的,因为您的序列化程序返回 html 元素。 所以,authenticate 函数没有正常工作。

    在你的情况下 serializer 返回:

    > <tr><th><label for="id_username">Username:</label></th><td><input
    > type="text" name="username" value="pradip" placeholder="Username"
    > required id="id_username"></td></tr> <tr><th><label
    > for="id_password">Password:</label></th><td><input type="text"
    > name="password" value="admin123@" placeholder="Password" required
    > id="id_password"></td></tr>
    

    试试这个:

     @api_view(['POST', 'GET'])
        def login_view(请求):
            如果 request.method == "POST":
                serializer = student_login_serializer(data=request.data)
                如果 serializer.is_valid():
                    print("序列化程序有效")
                    student = authenticate(username=request.data.get('username'),password=request.data.get('password'))
                    如果学生不是无:
                        登录(请求,学生)
                        事件 = Event.objects.all()
                        序列化器 = event_serializer(事件,许多 = True)
                        返回响应(serializer.data,状态=状态。HTTP_202_ACCEPTED)
                    别的:
                        返回响应(serializer.data,状态=状态。HTTP_401_UNAUTHORIZED)
                返回响应(serializer.errors,状态=状态。HTTP_401_UNAUTHORIZED)
            elif request.method == "GET":
                用户 = Student.objects.all()
                序列化器=学生序列化器(用户,许多=真)
                返回响应(serializer.data)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 2022-11-11
      • 1970-01-01
      • 2018-12-23
      • 2022-07-27
      • 1970-01-01
      • 2019-09-10
      相关资源
      最近更新 更多