如何解决django RecursionError:调用Python对象时超出最大递归深度
我已经通过在django rest框架中构建自定义用户模型来实现成员资格。顺便说一句,当您编写代码并运行服务器时,会发生以下错误。
RecursionError:调用a时超出了最大递归深度 Python对象
这里是完整的追溯
Traceback (most recent call last): File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\django\core\handlers\exception.py",line 34,in inner
response = get_response(request) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\django\core\handlers\base.py",line 115,in _get_response
response = self.process_exception_by_middleware(e,request) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\django\core\handlers\base.py",line 113,in _get_response
response = wrapped_callback(request,*callback_args,**callback_kwargs) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\django\views\decorators\csrf.py",line 54,in wrapped_view
return view_func(*args,**kwargs) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\django\views\generic\base.py",line 71,in view
return self.dispatch(request,*args,**kwargs) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\rest_framework\views.py",line 505,in dispatch
response = self.handle_exception(exc) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\rest_framework\views.py",line 465,in handle_exception
self.raise_uncaught_exception(exc) File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\rest_framework\views.py",line 476,in raise_uncaught_exception
raise exc File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\rest_framework\views.py",line 502,in dispatch
response = handler(request,**kwargs) File "D:\school\대회 및 프로젝트\CoCo\api\views.py",line 16,in post
serializer.save() File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\rest_framework\serializers.py",line 212,in save
self.instance = self.create(validated_data) File "D:\school\대회 및 프로젝트\CoCo\api\serializers.py",line 61,in create
return User.objects.create_user(**validate_data) File "D:\school\대회 및 프로젝트\CoCo\api\models.py",line 29,in create_user
user = self.create_user( File "D:\school\대회 및 프로젝트\CoCo\api\models.py",in create_user
user = self.create_user( [PrevIoUs line repeated 951 more times] File "D:\school\대회 및 프로젝트\CoCo\api\models.py",line 31,in create_user
email=self.normalize_email(email),File "D:\school\대회 및 프로젝트\CoCo\venv\lib\site-packages\django\contrib\auth\base_user.py",line 25,in normalize_email
email_name,domain_part = email.strip().rsplit('@',1) RecursionError: maximum recursion depth exceeded while calling a Python object [20/Aug/2020 09:55:57] "POST /auth/signUp HTTP/1.1" 500 3947748
models.py
from django.contrib.auth.models import (BaseUserManager,AbstractBaseUser,PermissionsMixin)
from django.db import models
from django.utils import timezone
class UserManager (BaseUserManager) :
def create_user (self,username,email,profile,password=None) :
if username is None :
raise TypeError('Users should have a username')
if email is None :
raise TypeError('Users should have a email')
user = self.model(
username=username,email=self.normalize_email(email),profile=profile,)
user.set_password(password)
user.save()
return user
def create_user (self,password=None) :
if password is None :
raise TypeError('Password should not be none')
user = self.create_user(
username=username,password=password
)
user.create_user(username,password)
user.is_superuser = True
user.is_staff = True
user.save()
return user
class User (AbstractBaseUser,PermissionsMixin) :
username = models.CharField(max_length=255,unique=True,db_index=True)
email = models.CharField(max_length=255,db_index=True)
profile = models.ImageField(default='media\default_image.jpeg')
is_verified = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_Now_add=True)
updated_at = models.DateTimeField(auto_Now=True)
USERNAME_FIELD = 'email'
required_FIELDS = ['username','profile']
objects = UserManager()
def __str__ (self) :
return self.email
serializers.py
from .models import User
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairserializer,TokenRefreshSerializer
from rest_framework_simplejwt.tokens import RefreshToken
from allauth.account import app_settings as allauth_settings
from allauth.utils import email_address_exists
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
from django.utils.translation import ugettext_lazy as _
from datetime import datetime,timedelta
class Base64ImageField (serializers.ImageField) :
def to_internal_value (self,data) :
from django.core.files.base import ContentFile
import base64
import six
import uuid
if isinstance(data,six.string_types):
if 'data:' in data and ';base64,' in data:
header,data = data.split(';base64,')
try:
decoded_file = base64.b64decode(data)
except TypeError:
self.fail('invalid_image')
file_name = str(uuid.uuid4())[:12]
file_extension = self.get_file_extension(file_name,decoded_file)
complete_file_name = "%s.%s" % (file_name,file_extension,)
data = ContentFile(decoded_file,name=complete_file_name)
return super(Base64ImageField,self).to_internal_value(data)
def get_file_extension (self,file_name,decoded_file) :
import imghdr
extension = imghdr.what(file_name,decoded_file)
extension = "jpg" if extension == "jpeg" else extension
return extension
class customregisterSerializer (serializers.ModelSerializer) :
password = serializers.CharField(max_length=68,min_length=6,write_only=True)
profile = Base64ImageField(use_url=True)
class Meta :
model = User
fields = ['email','username','profile','password']
def validate (self,attrs) :
email = attrs.get('email','')
username = attrs.get('username','')
profile = attrs.get('profile','')
return attrs
def create (self,validate_data) :
return User.objects.create_user(**validate_data)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。