我在我的專案中使用 Django Postgres。我嘗試實作用戶注冊,但是當我嘗試發送帶有用戶名和密碼的表單時,出現資料庫錯誤
psycopg2.errors.StringDataRightTruncation: value too long for type character varying(32)
每個字串都作為密碼出現該錯誤,即使它的長度小于 32。我嘗試列印表單值,所以它們與我輸入的相同。value too long 錯誤的原因是什么?
模型.py
class Person(AbstractUser):
username = models.fields.CharField(max_length=50,unique=True)
password = models.fields.CharField(max_length=32)
表格.py
class RegisterForm(ModelForm):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=PasswordInput())
class Meta:
model = Person
fields = ["username", "password"]
視圖.py
def register(request):
context={}
if request.method == 'POST':
form = RegisterForm(data=request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
print('username: ' username)
print('password: ' password)
if len(Person.objects.filter(username=username))==0:
Person.objects.create_user(username=username, password=password)
else:
context['form_errors']=['Person with this username already exists']
else:
form = RegisterForm()
錯誤

uj5u.com熱心網友回復:
默認情況下,Django 將散列密碼作為安全措施,因此散列密碼長度超過 32 個字符。實際上,在檔案的Django 如何存盤密碼部分中,它顯示它將密碼存盤為:
<algorithm>$<iterations>$<salt>$<hash>
一個例子可以是:
pbkdf2_sha256$15000$Pjun1TMGEQnM$lShdzU33covbDNiqGVDffdHh/86VaECJlaaNXchT0ew=
無法重建原始密碼(假設哈希是安全哈希),只能檢查密碼是否匹配。如果有人設法訪問資料庫,該人仍然無法讀取真正的密碼。由于人們經常傾向于在多個站點上使用相同的密碼,這將是一個嚴重的安全風險。
因此,您需要更多空間來存盤散列密碼。Django 的標準用戶模型使用 128 個字符。因此,您將其實作為:
class Person(AbstractUser):
username = models.fields.CharField(max_length=50, unique=True)
password = models.fields.CharField(max_length=128)
您可以讓表單檢查 是否username是唯一的,因此可以使用:
class RegisterForm(ModelForm):
class Meta:
model = Person
fields = ['username', 'password']
widgets = {
'password': PasswordInput()
}
def save(self, *args, commit=True, **kwargs):
person = super().save(*args, commit=commit, **kwargs)
person.set_password(self.cleaned_data['password'])
if commit:
person.save()
return person
通過不手動指定表單欄位,Django 還將驗證用戶名的最大長度(50 個字符),并檢查其唯一性。
然后您可以用作視圖:
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('name-of-some-view')
else:
form = RegisterForm()
context = {'form': form}
# …
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465862.html
標籤:django PostgreSQL
