Python 如何验证用户是否至少13岁?
我已经用Python创建了一个登录和注册应用程序,用于Django,并在几个不同的项目中使用了它。我在尝试将其应用于某些项目时遇到的唯一问题是,我无法确定如何确保用户只有在年满13岁时才能注册 这是我的models.py以及我为验证导入的内容Python 如何验证用户是否至少13岁?,python,django,validation,datetime,Python,Django,Validation,Datetime,我已经用Python创建了一个登录和注册应用程序,用于Django,并在几个不同的项目中使用了它。我在尝试将其应用于某些项目时遇到的唯一问题是,我无法确定如何确保用户只有在年满13岁时才能注册 这是我的models.py以及我为验证导入的内容 from django.db import models from datetime import date, datetime import re import bcrypt class User(models.Model): first_na
from django.db import models
from datetime import date, datetime
import re
import bcrypt
class User(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.CharField(max_length=150)
birthday = models.DateField()
password = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = UserManager()
这是迄今为止我在生日输入中进行的唯一验证。我还有其他验证,但这是唯一一个与生日相关的验证
def registration_validator(self, post_data):
errors = {}
user_birthday = datetime.strptime(post_data['birthday'], '%Y-%m-%d')
if user_birthday > datetime.today():
errors["release_date"] = "User birthday must be in the past!"
return errors_login
处理注册的My views.py
def process_registration(request):
errors = User.objects.registration_validator(request.POST)
if len(errors) > 0:
for key, value in errors.items():
messages.error(request, value, extra_tags='register')
return redirect('/')
else:
first_name = request.POST['first_name']
last_name = request.POST['last_name']
email = request.POST['email']
birthday = request.POST['birthday']
pw_hash = bcrypt.hashpw(request.POST['password'].encode(), bcrypt.gensalt()).decode()
User.objects.create(first_name=first_name, last_name=last_name, email=email, birthday=birthday, password=pw_hash)
return redirect(f'/success/{first_name}')
我知道如何将生日输入转换为可用的strTime,因为这是我唯一的验证,但我只是在尝试进一步确认用户至少为13岁时迷失了方向。您可以使用
dateutils
包中的relativedelta
来添加/减去今天的日期:
从dateutil.relativedelta导入relativedelta
def age_验证器(自身、post_数据):
错误={}
用户生日=datetime.strtime(发布日期['birth','%Y-%m-%d')
如果用户生日>datetime.today()-relativedelta(年=13):
错误[“发布日期”]=“用户必须至少为13”
在登录时返回错误
您可以向表单字段添加验证程序。然后将该表单集成到views.py函数中
有很多方法可以做到这一点,但这里有一种简单的实现类型(请注意,这也将密码哈希逻辑委托给forms.py类中的一个方法-应该仔细检查):
视图.py
从django.http导入HttpResponse
从django.views.decorators.csrf导入csrf_豁免
从users.forms导入UserForm
@豁免
def过程_注册(请求):
尝试:
form=UserForm(request.POST)
如果不是表单,则表单是否有效()
返回HttpResponse(f'bad:{form.errors}')
form.save()
返回HttpResponse('ok')
例外情况除外,如e:
返回HttpResponse(f'bad:{e}')
forms.py
来自django导入表单的
从django.core.exceptions导入ValidationError
从django.utils导入时区
从dateutil.relativedelta导入relativedelta
进口bcrypt
从users.models导入用户
def validate_早于_十三(值):
截止日期=时区.now().date()-relativedelta(年份=13)
如果值>截止日期:
raise ValidationError('日期在将来')
类UserForm(forms.ModelForm):
生日=forms.DateField(验证器=[validate\u早于\u十三])
def clean_密码(自身):
原始密码=自清理的密码数据['password']
返回bcrypt.hashpw(原始密码.encode(),bcrypt.gensalt()).decode()
类元:
模型=用户
字段='\uuuu所有\uuuu'
根据您的路线,这里有一个cURL来测试此逻辑:
curl --request POST \
--url http://127.0.0.1:8000/register/ \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data first_name=John \
--data last_name=Doe \
--data email=john@test.com \
--data password=s3kr1t \
--data birthday=2015-01-01
这就像做梦一样,谢谢!我唯一需要做的就是下载PythonDateUtils包,它就工作了。似乎是一个非常有用的软件包。