سلام استاد وقت شما بخیر، من اگه بخام دقیقا از ساختار رجیستر شما استفاده بکنم اما بجای ایمیل از شماره تلفن کد رو ارسال کنم چطور میتونم مقدار کد تایید رو (در صورت تغییر به یک عدد 6 رقمی ) براش یک تاریخ انقضا در نظر بگیرم؟ و اینکه چه تغییراتی رو در کل باید در ساختار پروژه انجام بدم لطفا بنده رو راهنمایی کنین ممنون میشم.
سلام حالتون خوبه ؟
باید از پنل پیامکی استفاده بکنید برای ارسال پیامک
و میتونید یه دیت تایم فیلد در نظر بگیرید توی model و مقدار تایم اون رو + ۱۵ کنید
فکر میکنم باید از time__range استفاده کنید
موفق باشید :)
سلام دوست من
یک فیلد تاریخ در مدل کاربر ایجاد کنین به همراه شماره موبایل و کد تایید که هنگام ثبت نام ایجاد و ذخیره میشه
هنگام ثبت نام کلید و تاریخ رو ایجاد کنین. تاریخ همون تاریخ و زمان جاری به اضافه ی 2 دقیقه هستش
برای ارسال پیام میتونین از پنل های پیامکی مثل کاوه نگار استفاده کنین ( سورس رو داخل سایتش قرار داده )
صفحه ی دیگری باید ایجاد کنین که کاربر بتونه کدی که براش ارسال شده رو وارد کنه. هنگام وارد کرد کد ، چک میکنین که کدی که وارد شده برای این موبایل در دیتابیس وجود داره یا خیر. در صورت وجود داشتن کاربر رو لاگین کنین
تا 3 بار کاربر میتونه کد رو وارد کنه و بعد از اون به مدت 2 الی 5 ساعت حساب کاربری شخص قفل میشه
التبه فراموش نکنین که تاریخ انقضا رو هم در این بازه چک کنین
خیلی ممنونم مهندس فرمایشاتتون رو پیاده کردم، فقط چطور میتونیم تعداد درخواست یک کاربر برای لاگین رو کنترل کنیم که پس از چند بار تلاش برای زمانی خاص بن شه؟
یک جدول برای لاگ زدن در نظر بگیرین
بعد از هر بار تلاش برای ورود به سایت یا تلاش برای فعالسازی حساب کاربری یک لاگ درون جدول بزنین
زمانی که تعداد لاگ های یک کاربر در یک بازه ی زمانی بیشتر از تعداد مورد نظرتون بود ، دیگه اجازه ندین درخواست های اون شخص برای ورود به سایت یا فعالسازی حساب کاربری پردازش بشه
تشکر میکنم بابت اینکه یک راه حل ساده رو به بنده پیشنهاد دادین و ممنونم که اگر دوره عالی شما نبود بنده حاضر نمیشدم جنگو رو یاد بگیرم.
طرحی که گفتین رو پیاده کردم اما چون که اولین پروژه بنده هست ممنون میشم منطق صفحه لاگین من رو مشاهده بفرمایین و اگر باگی داشت راهنماییم کنین تا مدیون کارفرما نشم. کد هارو خدمتتون ارسال میکنم اگر فرصت کردین یه نگاهی واسم بندازین و اگرم فرصت نشد بازم ممنوننتونم.
views
import time
import jdatetime
import requests
from account_module.forms import LoginForm, VerificationForm
from account_module.models import User
from django.contrib import messages
from django.shortcuts import render, redirect
from django.urls import reverse
from django.utils.crypto import get_random_string
from django.utils.html import format_html
from django.views import View
from random import randint
from django.contrib.auth import login, logout, authenticate
import datetime
from django.views.generic.base import TemplateView
from messages.SMS import otp
class LoginView(View):
def get(self, request):
if request.user.is_authenticated:
return redirect(reverse("panel"))
else:
form = LoginForm()
return render(request, 'account_module/login.html', {'form': form})
def post(self, request):
if request.user.is_authenticated:
return redirect(reverse("panel"))
else:
form = LoginForm(request.POST)
if form.is_valid():
entered_phone_number = form.cleaned_data.get('phone_number')
user: bool = User.objects.filter(phone_number__iexact=entered_phone_number).exists()
if not user:
new_user = User(
phone_number=entered_phone_number,
phone_active_code=randint(100000, 999999),
is_active=False,
username=entered_phone_number,
expire_date=datetime.datetime.now() + datetime.timedelta(minutes=2)
)
new_user.login_try += 1
new_user.save()
code = new_user.phone_active_code
otp(entered_phone_number, code)
return redirect(reverse('account_verification'))
else:
user: User = User.objects.filter(phone_number__iexact=entered_phone_number).first()
user.phone_active_code = randint(100000, 999999)
user.expire_date = datetime.datetime.now() + datetime.timedelta(minutes=2)
user.login_try += 1
user.save()
if user.login_try >= 3:
user.ban_time = datetime.datetime.now() + datetime.timedelta(hours=4)
user.login_try = 0
user.save()
if user.ban_time == None:
pass
elif user.ban_time - datetime.datetime.now() >= datetime.timedelta(minutes=0):
user.login_try = 0
user.save()
elif user.ban_time - datetime.datetime.now() <= datetime.timedelta(minutes=0):
user.ban_time = None
user.save()
code = user.phone_active_code
if user.ban_time == None or user.ban_time - datetime.datetime.now() <= datetime.timedelta(
minutes=0):
otp(entered_phone_number, code)
return redirect(reverse('account_verification'))
elif user.ban_time - datetime.datetime.now() >= datetime.timedelta(minutes=0):
gregorian_ban_date = user.ban_time
jalali_ban_date = jdatetime.datetime.fromgregorian(datetime=gregorian_ban_date)
jalali_ban_date_string = jalali_ban_date.strftime('%Y/%m/%d')
jalali_ban_time_string = jalali_ban_date.strftime('%H:%M')
request.session['ban_date'] = jalali_ban_date_string
request.session['ban_time'] = jalali_ban_time_string
return redirect('ban_page')
return render(request, 'account_module/login.html', {'form': form})
class AccountVerifications(View):
def get(self, request):
verify_form = VerificationForm()
return render(request, 'account_module/verify.html', {'verify_form': verify_form})
def post(self, request):
verify_form = VerificationForm(request.POST)
if verify_form.is_valid():
join_code = (verify_form.cleaned_data.get('active_code_1') +
verify_form.cleaned_data.get('active_code_2') +
verify_form.cleaned_data.get('active_code_3') +
verify_form.cleaned_data.get('active_code_4') +
verify_form.cleaned_data.get('active_code_5') +
verify_form.cleaned_data.get('active_code_6'))
enterd_code = join_code
user: bool = User.objects.filter(phone_active_code=enterd_code).exists()
if user:
user: User = User.objects.filter(phone_active_code__iexact=enterd_code).first()
delta = user.expire_date - datetime.datetime.now()
if delta > datetime.timedelta(days=0):
user.phone_active_code = get_random_string(72)
user.is_active = True
user.save()
login(request, user)
return redirect(reverse('home_page'))
else:
user.phone_active_code = get_random_string(72)
user.save()
url = reverse('login')
message = format_html(
'رمز وارد شده منقضی می باشد، '
'لطفاً مجدداً <a href="{}">درخواست کد</a> کنید',
url
)
verify_form.add_error(None, message)
else:
verify_form.add_error(None, 'رمز وارد شده صحیح نمی باشد، لطفاً دوباره تلاش کنید')
else:
return redirect(reverse('login'))
return render(request, 'account_module/verify.html', {'verify_form': verify_form})
class BanView(TemplateView):
template_name = 'account_module/ban.html'
def get_context_data(self, **kwargs):
contex = super().get_context_data(**kwargs)
contex['ban_date'] = self.request.session.get('ban_date')
contex['ban_time'] = self.request.session.get('ban_time')
return contex
models
from django.contrib.auth.models import AbstractUser
from django.db import models
# Create your models here.
class User(AbstractUser):
phone_number = models.CharField(max_length=11, verbose_name='شماره تلفن', unique=True, default=0)
phone_active_code = models.CharField(max_length=100, verbose_name='کد فعالسازی', null=True)
expire_date = models.DateTimeField(verbose_name='تاریخ انقضا کد یک بار مصرف', null=True, blank=True)
ban_time = models.DateTimeField(verbose_name='زمان ممنوعیت ورود', null=True, blank=True)
login_try = models.IntegerField(verbose_name='دفعات تلاش برای ورود', default=0)
class Meta:
verbose_name = 'کاربر'
verbose_name_plural = 'کاربران'
from django import forms
from django.core import validators
from django.core.exceptions import ValidationError
class LoginForm(forms.Form):
phone_number = forms.CharField(
max_length=11,
min_length=11,
label='شماره تلفن',
validators=[
validators.MaxLengthValidator(11),
validators.MinLengthValidator(11)
],
widget=forms.TextInput(attrs={
"dir" : "ltr",
"spellcheck" : "false",
"placeholder" : "0912345178"
}
)
)
class VerificationForm(forms.Form):
active_code_1 = forms.CharField(
label='کد تایید',
validators=[
validators.MinLengthValidator(1),
validators.MaxLengthValidator(1)
],
widget=forms.NumberInput())
active_code_2 = forms.CharField(
label='کد تایید',
validators=[
validators.MinLengthValidator(1),
validators.MaxLengthValidator(1)
],
widget=forms.NumberInput()
)
active_code_3 = forms.CharField(
label='کد تایید',
validators=[
validators.MinLengthValidator(1),
validators.MaxLengthValidator(1)
],
widget=forms.NumberInput()
)
active_code_4 = forms.CharField(
label='کد تایید',
validators=[
validators.MinLengthValidator(1),
validators.MaxLengthValidator(1)
],
widget=forms.NumberInput()
)
active_code_5 = forms.CharField(
label='کد تایید',
validators=[
validators.MinLengthValidator(1),
validators.MaxLengthValidator(1)
],
widget=forms.NumberInput()
)
active_code_6 = forms.CharField(
label='کد تایید',
validators=[
validators.MinLengthValidator(1),
validators.MaxLengthValidator(1)
],
widget=forms.NumberInput()
)
چشم دوست من حتما در اولین فرصت بررسی میکنم
فقط حتما باید لاگ رو در جدول دیگه ای تنظیم کنین
چیزی که من توی دید اول باهاش مواجه شدم این بود که توی مدل User این لاگ رو پیاده سازی کردین که مقداری دردسر ساز میشه
نکته ی بعدی اینه که زمانی که کاربر لاگین میکنه باید لاگ های قبلی رو پاک کنین تا دفعه ی بعدی که لاگین میکنه مشکل ساز نشه و بتونه لاگین کنه
از نظر خودم که تمام جوانبشو در نظر گرفتم حالا انشاالله اگر فرصت کردین و خوندین نظر نهاییتون رو بفرمایین.
چشم دوست من