Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何验证用户是否至少13岁?_Python_Django_Validation_Datetime - Fatal编程技术网

Python 如何验证用户是否至少13岁?

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

我已经用Python创建了一个登录和注册应用程序,用于Django,并在几个不同的项目中使用了它。我在尝试将其应用于某些项目时遇到的唯一问题是,我无法确定如何确保用户只有在年满13岁时才能注册

这是我的models.py以及我为验证导入的内容

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包,它就工作了。似乎是一个非常有用的软件包。