• 1402/03/18

کد تایید موقت :

سلام استاد وقت شما بخیر، من اگه بخام دقیقا از ساختار رجیستر شما استفاده بکنم اما بجای ایمیل از شماره تلفن کد رو ارسال کنم چطور میتونم مقدار کد تایید رو  (در صورت تغییر به یک عدد 6 رقمی ) براش یک تاریخ انقضا در نظر بگیرم؟ و اینکه چه تغییراتی رو در کل باید در ساختار پروژه انجام بدم لطفا بنده رو راهنمایی کنین ممنون میشم.

  • 1402/03/18
  • ساعت 18:06

سلام حالتون خوبه ؟

باید از پنل پیامکی استفاده بکنید برای ارسال پیامک

و میتونید یه دیت تایم فیلد در نظر بگیرید توی model و مقدار تایم اون رو + ۱۵ کنید

فکر میکنم باید از time__range استفاده کنید

موفق باشید :)


  • 1402/03/19
  • ساعت 12:32

سلام دوست من

یک فیلد تاریخ در مدل کاربر ایجاد کنین به همراه شماره موبایل و کد تایید که هنگام ثبت نام ایجاد و ذخیره میشه

هنگام ثبت نام کلید و تاریخ رو ایجاد کنین. تاریخ همون تاریخ و زمان جاری به اضافه ی 2 دقیقه هستش

برای ارسال پیام میتونین از پنل های پیامکی مثل کاوه نگار استفاده کنین ( سورس رو داخل سایتش قرار داده )

صفحه ی دیگری باید ایجاد کنین که کاربر بتونه کدی که براش ارسال شده رو وارد کنه. هنگام وارد کرد کد ، چک میکنین که کدی که وارد شده برای این موبایل در دیتابیس وجود داره یا خیر. در صورت وجود داشتن کاربر رو لاگین کنین

تا 3 بار کاربر میتونه کد رو وارد کنه و بعد از اون به مدت 2 الی 5 ساعت حساب کاربری شخص قفل میشه

التبه فراموش نکنین که تاریخ انقضا رو هم در این بازه چک کنین


  • 1402/03/20
  • ساعت 06:13

خیلی ممنونم مهندس فرمایشاتتون رو پیاده کردم، فقط چطور میتونیم تعداد درخواست یک کاربر برای لاگین رو کنترل کنیم که پس از چند بار تلاش برای زمانی خاص بن شه؟


  • 1402/03/21
  • ساعت 19:35

یک جدول برای لاگ زدن در نظر بگیرین

بعد از هر بار تلاش برای ورود به سایت یا تلاش برای فعالسازی حساب کاربری یک لاگ درون جدول بزنین

زمانی که تعداد لاگ های یک کاربر در یک بازه ی زمانی بیشتر از تعداد مورد نظرتون بود ، دیگه اجازه ندین درخواست های اون شخص برای ورود به سایت یا فعالسازی حساب کاربری پردازش بشه


  • 1402/03/23
  • ساعت 19:44

تشکر میکنم بابت اینکه یک راه حل ساده رو به بنده پیشنهاد دادین و ممنونم که اگر دوره عالی شما نبود بنده حاضر نمیشدم جنگو رو یاد بگیرم.
 طرحی که گفتین رو پیاده کردم اما چون که اولین پروژه بنده هست ممنون میشم منطق صفحه لاگین من رو مشاهده بفرمایین و اگر باگی داشت راهنماییم کنین تا مدیون کارفرما نشم. کد هارو خدمتتون ارسال میکنم اگر فرصت کردین یه نگاهی واسم بندازین و اگرم فرصت نشد بازم ممنوننتونم.

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()
    )

  • 1402/03/25
  • ساعت 22:06

چشم دوست من حتما در اولین فرصت بررسی میکنم

فقط حتما باید لاگ رو در جدول دیگه ای تنظیم کنین

چیزی که من توی دید اول باهاش مواجه شدم این بود که توی مدل User این لاگ رو پیاده سازی کردین که مقداری دردسر ساز میشه

نکته ی بعدی اینه که زمانی که کاربر لاگین میکنه باید لاگ های قبلی رو پاک کنین تا دفعه ی بعدی که لاگین میکنه مشکل ساز نشه و بتونه لاگین کنه


  • 1402/03/25
  • ساعت 22:39

از نظر خودم که تمام جوانبشو در نظر گرفتم حالا انشاالله اگر فرصت کردین و خوندین نظر نهاییتون رو بفرمایین.


  • 1402/03/27
  • ساعت 09:05

چشم دوست من