validation 相关问题

验证用于检查数据,以确保它符合为其设置的任何所需规范。通常,验证用于检查输入数据,以及在存储之前验证数据。

在Python中,如何检查日期是否有效?

我正在构建一种日历网络应用程序 我已经在 HTML 中设置了以下表单 年份(“yyyy”): 月份(“mm”):... 我正在构建一种日历网络应用程序 我已经在 HTML 中设置了以下表单 <form action='/event' method='post'> Year ("yyyy"): <input type='text' name='year' /> Month ("mm"): <input type='text' name='month' /> Day ("dd"): <input type='text' name='day' /> Hour ("hh"): <input type='text' name='hour' /> Description: <input type='text' name='info' /> <input type='submit' name='submit' value='Submit'/> </form> 用户的输入随后被提交到cherrypy服务器中 我想知道,有没有办法检查用户输入的日期是否是有效日期? 显然我可以写很多 if 语句,但是有没有内置函数可以检查这个? 谢谢 你可以尝试做 import datetime datetime.datetime(year=year,month=month,day=day,hour=hour) 这将消除诸如月份> 12,小时> 23,不存在的闰日(月份= 2在非闰年最多为28天,否则为29天,其他月份最多为30或31天)(出错时抛出ValueError异常) 您也可以尝试将其与一些理智的上限/下限进行比较。 例如: datetime.date(year=2000, month=1,day=1) < datetime.datetime(year=year,month=month,day=day,hour=hour) <= datetime.datetime.now() 相关的理智上限和下限取决于您的需求。 编辑:请记住,这不会处理某些可能对您的应用程序无效的日期时间事物(最小生日、假期、营业时间以外的时间等) 您可以尝试使用日期时间并处理异常来决定有效/无效日期: 示例:http://codepad.org/XRSYeIJJ import datetime correctDate = None try: newDate = datetime.datetime(2008,11,42) correctDate = True except ValueError: correctDate = False print(str(correctDate)) 这个问题假设没有库的解决方案涉及“大量的 if 语句”,但事实并非如此: def is_valid_date(year, month, day): day_count_for_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if year%4==0 and (year%100 != 0 or year%400==0): day_count_for_month[2] = 29 return (1 <= month <= 12 and 1 <= day <= day_count_for_month[month]) 您可以尝试使用 dateutil.parser 模块来更轻松地进行日期解析: from dateutil.parser import parse, ParserError def is_valid_date(date): if not date: return False try: parse(date) return True except ParserError: return False 希望这有帮助。 使用datetime 例如。 >>> from datetime import datetime >>> print datetime(2008,12,2) 2008-12-02 00:00:00 >>> print datetime(2008,13,2) Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> print datetime(2008,13,2) ValueError: month must be in 1..12 您可以尝试使用日期时间并处理异常来决定有效/无效日期: import datetime def check_date(year, month, day): correctDate = None try: newDate = datetime.datetime(year, month, day) correctDate = True except ValueError: correctDate = False return correctDate #handles obvious problems print(str(check_date(2008,11,42))) #handles leap days print(str(check_date(2016,2,29))) print(str(check_date(2017,2,29))) #handles also standard month length print(str(check_date(2016,3,31))) print(str(check_date(2016,4,31))) 给予 False True False True False 这是 DhruvPathak 的答案的改进,作为编辑更有意义,但它被拒绝为“此编辑旨在向帖子的作者讲话,作为编辑没有任何意义。它应该写成评论或答案。” 这是一个利用时间的解决方案。 导入时间 def is_date_valid(年、月、日): this_date = '%d/%d/%d' %(月、日、年) 尝试: time.strptime(this_date, '%m/%d/%Y') 除了值错误: 返回错误 别的: 返回真 所以,这是我纠正所提供的无效日期的黑客解决方案。这假设用户从通用 html 表单提交,该表单提供第 1-31 天作为选项。主要问题是用户提供了当月不存在的某一天(9 月 31 日之前) def sane_date(year, month, day): # Calculate the last date of the given month nextmonth = datetime.date(year, month, 1) + datetime.timedelta(days=35) lastday = nextmonth.replace(day=1) - datetime.timedelta(days=1) return datetime.date(year, month, min(day, lastday.day)) class tests(unittest.TestCase): def test_sane_date(self): """ Test our sane_date() method""" self.assertEquals(sane_date(2000,9,31), datetime.date(2000,9,30)) self.assertEquals(sane_date(2000,2,31), datetime.date(2000,2,29)) self.assertEquals(sane_date(2000,1,15), datetime.date(2000,1,15)) y = int(input("Year: ")) m = int(input("Month: ")) d = int(input("Day: ")) if 0 <= y and 0 < m < 13 and 0 < d < 32: #Check whether date is under limit. if y % 4 == 0: # Every 4 year "Leap" year occures so checking... if m == 2: # In "Leap" year February has 29 days if d < 30: print("<Correct>") else: print("<Wrong>") elif m == 2: # But if it's not "Leap" year February will have 28 days if d < 29: print("<Correct>") else: print("<Wrong>") elif y % 4 != 0 and m != 2: # Otherwise print "Correct" print("<Correct>") else: print("<Wrong>") 基于@codehia答案,以下内容还允许检查日期的格式,并将字符串拆分为年,月,日 - 所有上述假设都已经有年,月,日。 from dateutil.parser import parse import string p=print space_punct_dict = dict((ord(punct), ' ') for punct in string.punctuation) def is_valid_date_p(date): if date: try: date = date.translate(space_punct_dict) new_date = str(parse(date))[:10] year = new_date[:4] month = new_date[5:7] day = new_date[8:] p(year, month, day) return True, year, month, day except: p('invalid:', date) return False return False year, month, day = 2021, 6, 1 is_valid_date_p(f'{month}/{day}/{year}') is_valid_date_p(f'{month}.{day}.{year}') is_valid_date_p(f'{month},{day},{year}') is_valid_date_p(f'{month}/{day}/{year}') is_valid_date_p(f'{month}-{day}-{year}') is_valid_date_p(f'{month} {day} {year}') p() is_valid_date_p('12/1/20') is_valid_date_p('12/31/20') p() is_valid_date_p('31/12/20') is_valid_date_p('30/6/2020') is_valid_date_p('2020/30/6') 输出: 2021 06 01 2021 06 01 2021 06 01 2021 06 01 2021 06 01 2021 06 01 2020年12月01日 2020年12月31日 2020年12月31日 2020年06月30日 无效:2020年30月6日 就个人而言,我主要使用deteutil.parser,它可以在解析日期时简化代码。通过此代码片段,您还可以捕获无效日期: import dateutil.parser input_date = '2022-06-30' try: result_date = dateutil.parser.parse(input_date, dayfirst=True).strftime('%Y-%m-%d') except dateutil.parser._parser.ParserError as ex: print(ex) # handle the exception from here on 其中 strftime('%Y-%m-%d') 部分固定输出格式。如果没有该方法,即仅 result_date = dateutil.parser.parse(input_date, dayfirst=True),它会返回一个日期时间对象。可选的 dayfirst=True 会省略像 3/6/2022 这样不明确的日期,将被解析为 6 月 3 日(而不是 3 月 6 日)。 让我们尝试一些不同格式的输入,甚至添加一些垃圾: multiple_inputs = ['2022-06-30', '30/6/2022', '30 06 2022', '3/6/2022', '2022-06-31', '2022-15-30', '', 'garbage'] for input_date in multiple_inputs: try: result_date = dateutil.parser.parse(input_date, dayfirst=True).strftime('%Y-%m-%d') print(f'Valid date: {result_date}') except dateutil.parser._parser.ParserError as ex: print(ex) 这给出了: Valid date: 2022-06-30 Valid date: 2022-06-30 Valid date: 2022-06-30 Valid date: 2022-06-03 day is out of range for month: 2022-06-31 month must be in 1..12: 2022-15-30 String does not contain a date: Unknown string format: garbage

回答 11 投票 0

Yii2 验证图像帖子作为数据 url

我需要验证作为数据网址上传的图像,其格式为: {配置文件:“数据:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAA ...McAAAAAASUVORK5CYII =”} 我的配置文件模型有以下规则: ...

回答 1 投票 0

无效架构或缺少命名空间 - 通过 notepad++ 进行 XML 验证

我正在尝试通过 notepad++ 验证 XML 文件,但出现以下错误: 架构无效或缺少命名空间 当我通过另一个 XML 验证器进一步调查时,我收到以下错误: ...

回答 1 投票 0

Angular 嵌套表单验证

我想指出的是,我已经处理这个问题1个月了。我愿意接受任何建议。 我有从用户接收输入数据的表单页面。这些页面包含一个组件

回答 1 投票 0

Python 中的参数验证

我有一个函数接受一些需要验证的参数。例如: def foo(a: int, b: float, c: str) -> 无: 如果一个 <= 0: raise ValueError(f"'a' must pe po...

回答 2 投票 0

Laravel 10.45 - 枚举验证 - 无法设置自定义消息

我无法为枚举规则添加自定义验证消息。 我的规则定义为: 'components.*.component_type' => ['必需', Rule::enum(BlueprintComponentType::class)] 定制我...

回答 1 投票 0

Ruby on Rails 测试 – 重置/刷新验证器?

我正在为 RoR Gem 编写测试,该测试具有依赖于配置变量的验证: 我的模型类 < ApplicationRecord validates_length_of :field_name, minimum: GemName.

回答 1 投票 0

Laravel 5.3,当验证失败时会话不闪烁任何内容

您好,我有以下表格: {{ csrf_field() }} 嗨,我有以下表格: <form action="{{ route('postCustomerInfo') }}" method="post" class="shipping-form"> {{ csrf_field() }} <input type="hidden" name="note" value="hidden_note_field"> <input type="hidden" name="country_id" value="1"> <div class="form-checkout"> <div class="form-fields"> @if($errors->has('name'))<div class="input-box error" data-error="{{ $errors->first('name') }}"> @else<div class="input-box"> @endif <input type="text" name="name" value={{ old('name') }}> <label for="">name</label> </div> @if($errors->has('phone'))<div class="input-box error" data-error="{{ $errors->first('phone') }}"> @else <div class="input-box"> @endif <input type="text" name="phone" value={{ old('phone') }} onkeypress='return event.charCode >= 48 && event.charCode <= 57'> <label for="">phone</label> </div> @if($errors->has('email'))<div class="input-box error" data-error="{{ $errors->first('email') }}"> @else <div class="input-box"> @endif <input type="text" name="email" value="{{ old('email') }}"> <label for="">email</label> </div> <div class="row"> <div class="col-xs-5 col-sm-5 col-md-6"> @if($errors->has('city'))<div class="input-box error" data-error="{{ $errors->first('city') }}"> @else<div class="input-box"> @endif <input type="text" name="city" value="{{ old('city') }}"> <label for="">city</label> </div> </div> <div class="col-xs-7 col-sm-7 col-md-6"> @if($errors->has('postal_code'))<div class="input-box error" data-error="{{ $errors->first('postal_code') }}"> @else<div class="input-box error" data-error="{{ $errors->first('postal_code') }}"> @endif <input type="text" name="postal_code" value="{{ old('postal_code') }}"> <label for="">postal code</label> </div> </div> </div> @if($errors->has('address_line'))<div class="input-box error" data-error="{{ $errors->first('address_line') }}"> @else<div class="input-box error" data-error="{{ $errors->first('address_line') }}"> @endif <input type="text" name="address_line" value={{ old('address_line') }}> <label for="">address</label> </div> </div> </div> </form> <a href="" class="btn action">Go to <span>shipping</span></a> 我通过jquery提交表单 $(document).ready(function () { $('.btn.action').on('click','',function (e) { e.preventDefault(); var $form = $('form.shipping-form'); $form.submit(); }); }); 我的 FormRequest 类是: class CustomerInformationRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required|min:5|max:50', 'email' => 'required|email|min:5|max:50', 'phone' => 'required|min:3|max:20', 'country_id' => 'required', 'city' => 'required|min:3', 'postal_code' => 'required|digits:4', 'address_line' => 'required|min:5|max:50', 'note' => '' ]; } } 我在 StackOverflow 中读到了这个帖子:Laravel 5 输入旧为空但我不认为这实际上是我的问题。而且我的 {{ old('values') }} 仍然是空的,我不知道为什么?有什么想法吗? /** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, ]; /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\BeforeAutoTrimmer::class ], 'api' => [ 'throttle:60,1', 'bindings', ], ]; /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'setCurrency'=>\App\Http\Middleware\SetCurrency::class, 'checkout'=>\App\Http\Middleware\Checkout::class, ];}`. 我补充了 \App\Http\Middleware\BeforeAutoTrimmer::class 谁关心修剪我所有的表格: public function handle($request, Closure $next) { $request->merge(array_map('trim', $request->all())); return $next($request); } , 这 'setCurrency'=>\App\Http\Middleware\SetCurrency::class 谁关心从数据库到会话设置货币: `公共函数句柄($request, 闭包$next) { if(!Session::has('货币')) { $currency = 设置::where('setting_name', 'currency')->select('setting_value as code')->first(); $currencyData = 货币::where('code', $currency->code)->select('symbol_position', 'symbol', 'code')->first(); Session::put('currency', $currencyData); Session::save(); return $next($request); } return $next($request);}` 和'checkout'=>\App\Http\Middleware\Checkout::class,如果会话中的购物车是空的,谁愿意重定向我: `公共函数句柄($request, Closure $next) { if(!Session::has('cart')){ return redirect()->route('home'); } return $next($request); }` 但其余的我认为它们是 laravel 的默认设置,我没有碰它们

回答 1 投票 0

验证动态填充的选择字段

我有两个选择字段,一个取决于另一个。 构建表单时,依赖字段得到一个空的选项数组。 然后,我在 JavaScript 中填写此字段,请求来自...的一些数据

回答 1 投票 0

如何在react组件中使用formik进行验证

我尝试在注册组件中使用formik,但是在验证中我遇到了问题。 我已经对每个字段(例如姓名、电子邮件、密码)进行了验证,但我看不到。 我该如何解决这个问题?

回答 1 投票 0

双向绑定在 Blazor 组件中不起作用

我正在 .NET 8 中开发 ASP.NET Blazor 应用程序。模型类SubjectName 与此SubjectForm.razor blazor 组件绑定。 @inject ISubjectNameRepo 仓库 @if(主题不为空) { 我正在 .NET 8 中开发 ASP.NET Blazor 应用程序。模型类 SubjectName 与此 SubjectForm.razor blazor 组件绑定。 @inject ISubjectNameRepo Repo @if(Subject is not null) { <div class="row justify-content-center"> <div class="col-6"> <EditForm Enhance="true" method="post" FormName="SubjectForm" Model="Subject" OnValidSubmit="AddOrEditSubject" OnInvalidSubmit="InvSubmit" autocomplete="off"> <DataAnnotationsValidator/> <h3>@Title</h3> @if (IsEditMode) { <input type="hidden" name="Subject.Id" value="@Subject.Id"/> } <div class="mb-3"> <label for="subname" class="form-label"> Subject Name </label> <InputText id="subname" @bind-Value="Subject.SubName" class="form-control shadow-none" /> </div> <div class="mb-3"> <button type="submit" class="btn btn-primary shadow-none"> Submit </button> <a href="/subjects/list" class="btn btn-secondary shadow-none ms-3"> Back to List </a> </div> <ValidationSummary /> </EditForm> </div> </div> } else { <div> The subject is null ghere </div> } @code { [Parameter] public bool IsEditMode { get; set; } = false; [Parameter] public int Id { get; set; } [SupplyParameterFromForm] public SubjectName? Subject { get; set; } public string Title => IsEditMode ? $"Edit Subject {Id}" : "Add New Subject"; [Parameter] public EventCallback<SubjectName> OnValidSubjectNameSubmit { get; set; } protected override async Task OnInitializedAsync() { if (IsEditMode) { Subject ??= await Repo.GetByIdAsync(Id); } else { Subject ??= new(); } } private async Task AddOrEditSubject() { await OnValidSubjectNameSubmit.InvokeAsync(Subject); } private async Task InvSubmit() { } } 下面是SubjectName模型类的代码 public class SubjectName { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] [StringLength(50)] [Display(Name = "Subject Name")] public string? SubName { get; set; } public virtual ICollection<EvaluationTweak>? EvaluationTweaks { get; set; } } 当我运行这个应用程序时,导航到此页面,输入数据,然后单击“提交”按钮,然后InputText的内容消失并显示一条消息Subject Name field is required 我无法理解那里出了什么问题? 奇怪。我知道解决方案,但它只是一个解决方案。真正的原因对我来说仍然是隐藏的。 问题的外层是提交表单时Subject属性为空。它应该具有表单中的值。表格已正确提交。 我只展示相关部分: 您要绑定到表单的模型: public class SubjectName { public string? SubName { get; set; } public virtual ICollection<EvaluationTweak>? EvaluationTweaks { get; set; } } 这里的问题是EvaluationTweaks,如果删除它们,一切都会按预期进行。现在来说说原因。检查EvaluationTweak类: public class EvaluationTweak { [Required] public virtual SubjectName Subject { get; set; } = new(); } 当您删除 Subject 属性时,它也将起作用...请注意,您可以将其替换为 int SubjectId,以便将引用保留在那里。另请注意,从 Subject 中删除 EvaluationTweak 属性不会更改数据库架构。 但是为什么这是一个问题呢?我不知道,我的猜测是 - 它在序列化方面存在某种问题?也许它被认为是循环引用? 如果能进一步调查就好了。

回答 1 投票 0

类实例化的验证

全部 我有一个关于 python 中的类实例化的问题。 所以我有一堆不同类型的数据存储在同一个目录中,我只想使用 python 类处理其中一种类型...

回答 3 投票 0

验证多列的唯一性

是否有一种铁路方式来验证实际记录是唯一的而不仅仅是一列?例如,友谊模型/表不应具有多个相同的记录,例如: 使用...

回答 3 投票 0

Laravel 数组:密钥验证

我的 Laravel 后端接收 JSON 转换的 Javascript 数组并将其解码为以下 php 数组: dd($cart) 编辑键已更改 数组:4 [▼ “人数”=> 2 “人1...

回答 2 投票 0

在 C++ 中验证用户输入的整数[重复]

我的程序要求用户输入年龄,但我必须验证年龄,如果有一些字符输入以 int Age 形式输入,那么我必须抛出异常并要求用户再次输入年龄...... ...

回答 1 投票 0

Angular 5:通过求和值验证多个输入字段

我想通过总结多个数字输入字段的值来验证它们,并为 Angular 创建一个自定义验证器。 每个输入看起来像这样: ...

回答 4 投票 0

使用数组类型时,ajv 模式验证失败

我正在使用 ajv 使用相当简单的模式来验证 JSON 实例,但在数组类型上失败并显示以下消息: “这必须等于允许的值之一”

回答 1 投票 0

yii2 更新验证规则

我有一个模型和验证规则: User 类扩展 ActiveRecord 实现 IdentityInterface { ... 公共函数规则() { 返回 [ [['用户名','密码','电子邮件'],'

回答 1 投票 0

无效数据类型输入的自定义验证消息 |春季验证

我正在一个简单的 Web 应用程序中使用 sprinboot,我使用 spring 验证框架来验证我的字段约束。 当我输入

回答 1 投票 0

JSON 模式验证器。验证数字中的最大位数

有什么方法可以验证 JSON 模式验证器中的数字位数(https://mvnrepository.com/artifact/com.networknt/json-schema-validator)。 我的号码最多应有 5 位数字,并且不能...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.