ورود و ثبت نام با شماره تلفن در django (بخش اول)

خب یک روش که این روزا خیلی داغه برای ورود به ثبت نام به وب سایت ها ورود با شماره تلفن همراههاین که برای وب سایت یا اپلیکیشنتون باید از چه روش ورود و ثبت نامی استفاده کنید موضوع بحث ما نیست و بر می گرده به مباحث ux و … ولی این روزا خیلی از وب سایت های ایرانی دارن از روش ورود و ثبت نام با شماره تلفن همراه استفاده می کنند و بسیار مرسوم هست این نوع ورود و ثبت نام و ممکنه از شما به عنوان برنامه نویس بخوان که این روش رو پیاده سازی کنیدخب منم مثل هرکس دیگه ای که یه روشی رو بلد نیست شروع کردم به سرچ کردن روش های این کار ولی روش خیلی خوبی برای این کار پیدا نکردم و یک کتابخونه هم برای این کار وجود داشت که از یک سرویس دهنده مطرح پیام کوتاه استفاده می کرد که گویا خیلی معروفه ولی متاسفانه ما رو تحریم کرده و در نتیجه امکان استفاده ازش وجود نداره پس رفتم سراغ اینکه این کار رو خودم انجام بدم (شاید بهتر بود ابتدا کد اون سرویس دهنده رو می خوندم ولی این کارو نکردم ! )این روشی هم که توضیح میدم هنوز کامل نیست و ممکنه باگ های داشته باشه ولی کار می کنه و فعلا با همین میریم جلو بعدا بر می گردیم درستش می کنیم ( از اون بعدا های که هیچوقت نمیاد !!!!)خب ابتدا یک توضیح کوچیکی بدم که چه چیزی پیش رو داریم۱- ثبت نام:در این مرحله دو تا فرم داریم یکیش فرم ثبت نام هست که اطلاعاتی مانند شماره تلفن, نام , ایمیل , رمزعبور یا هرچیز دیگه ای که ما بخوایم رو وارد می کنه و بعد یک فرم تایید شماره تلفن همراه داریم که توی اون کاربر باید کدی رو که بهش پیامک کردیم وارد کنه و درصورت درست بودن کد وارد بشه ( بعضی سایتا بعد از ثبت نام وارد نمیشه و شما باز باید نام کاربری و رمزعبور رو وارد کنید که به نظرم خوب نیست و بهتره تا جای ممکن مراحل سریع تر باشه, من خیلی از تجربه کاربری نمی دونم ولی برای خودم یه قانون دارم که اگه خودم از چیزی خوشم نمیاد و به نظرم اضافس برای دیگران هم این رو قرار ندم و تا جای ممکن ساده باشه)۲-ورود:در اینجا یک فرم ورود داریم که کاربر با شماره تلفن همراه و رمز عبور وارد سیستم میشه۳-بازیابی رمز عبور:در این جا هم ابتدا یک فرم داریم که کاربر شمارشو وارد می کنه اگر درست بود وارد مرحله بعد که تایید شماره تلفن هست میشه و در صورت صحیح بودن کد وارد شده به یک فرم دیگه که باید پسورد جدید رو وارد کنه میشه۴-تغییر شماره تلفن:این مرحله هم باید وجود داشته باشه که اگه کاربر یه روز شمارش تغییر کرد و به شماره قبلی دسترسی نداشت بتونه وارد اکانتش بشه ولی خب فعلا اینو ننوشتم و از اون بخش های هست که باید برگردم کاملش کنم ولی خب خیلی بخش مهمی هم نیست و شما افرادی که ممکن هست بخوان این کارو بکنن خیلی کمه و اگه الان کسی بخواد این کارو بکنه براش دستی باید انجام بدیم و در لیست کار ها نوشتم که بعدا این رو هم بنویسمخب اول با ثبت نام شروع می کنیم :در ابتدا یک فرم ثبت نام می خوایم که براش یه template ایجاد می کنیم بهتره مواردی که مربوط به ثبت نام میشه رو داخل یه پوشه مجزا بریزید تا با بقیه قالب ها قاطی نشه من یه پوشه ایجاد کردم به نام registration و هرچی مربوط به فرایند ورود وثبت نام هست رو اونجا می ریزمبرای اون فیلد تلفن همراه هم از این کتابخونه استفاده کردم که یک کتابخونه js هست که امکان انتخاب تلفن همراه رو بهتون میده و یکسری امکانات دیگه که استفاده ازش می تونه کارتونو سریع تر کنه ولی بدون اون هم میشه نوشتش چیز زیاد پیچده ای نیستو بعد باید در فایلی مثل forms.py باید فرم ثبت نام رو تعریف کنید مثل کد زیرclass SignUpForm(UserCreationForm): first_name = forms.CharField(max_length=30, required=True, help_text=”, label=’نام’) classMeta: model = User fields = (‘username’,’first_name’ ,’password1′ ) def__init__(self, *args, **kwargs): super().__init__(*args, **kwargs) delself.fields[‘password2’] پیش فرض اینه که کار با فرم ها رو بلدین و اگه بلد نیستین پیشنهاد میشه برین داکیومنتشو یه نگاه بندازین من فقط اندازه فرم نام رو تایین کردم و دربخش پایین مشخص می کنم که یه یوزر می خوام بسازم و فیلد هاش رو مشخص می کنم فیلد های ضرورری نام کاربری و دوتا روز عبور هستو دربخش اخر من پسورد دوم رو هم پاک کردم که ثبت نام ساده تر باشه چرا واقعا باید دو بار رمز بزنه؟اگه یادش رفت باید راحت بتونه بازیابی کنه دیگهحالا باید در فایل urls.py یک مسیر به صفحه ثبت نام بدین مثلا /register یا sign-up یا هرچیز دیگه که دوست دارین و اون رو به یک ویو مرتبط کنیدکار خیلی سادس باید اطلاعات کاربر رو بگیریم یک یوزر ایجاد کنیم ولی غیر فعالش کنیم تا وقتی که شمارشو تایید کنهبعد یه درخواست به سرویس دهنده پیام کوتاهتون بزنید و شماره کاربر و یک عدد رندوم (مثلا پنج رقمی رو براش ارسال کنید یا پیام رو کامل درست کنید و ارسال کنید بستگی به سرویس دهنده پیامک داره) من از کاوه نگار استفاده می کنم که کتابخونه پایتون هم داره و راحت می تونید ازش استفاه کنید ولی شما می تونید از سرویس دهنده دیگه ای هم استفاده کنید فرق زیادی نداره اگه کتابخونه مرتبط نداشته باشه کافیه یه ریکوست بزنین و متغییر ها رو به روش post یا get براش بفرستینdef sign_up(request): if request.user.is_authenticated: return redirect(‘/dashboard/’) else: if request.method ==’POST’: form = SignUpForm(request.POST) if form.is_valid(): template=’verify’ user = form.save() user.refresh_from_db() # load the profile instance created by the signal user.is_active=False code=randint(10000, 99999) user.save() new_phone=form.cleaned_data.get(‘username’) profile=Profile.objects.create(user=user,phone=new_phone,verify_code=code) user.save() raw_password = form.cleaned_data.get(‘password1’) sent=verify_sms(new_phone,code,template) return render(request,’registration/activation.html’,{‘number’:new_phone}) else: form = SignUpForm() return render(request,’registration/register.html’,{‘form’:form}) کد سادس بخونید فقط فکر کنم مشکل دندونه (فاصله ها داشته باشه در زمان کپی کردن) در صورتی که کاربر وارد نشده باشه و یه درخواست post اومده باشه یه یوزر می سازیم و غیر فعالش می کنیم و شماره و کد پنج رقمی تصادفی رو پاس میدیم به یه تابع دیگه که بره اس ام اس بفرسته من برای هر کاربر یک پروفایل هم درست می کنم که خب کاربردیه و بعدا خیلی ازش استفاده می کنیم اینجا هم کدی رو که فرستادیم ذخیره می کنیم که بعدا استفاده کنیم (بهتر بود زمان ارسال و تعداد دفعات ارسال رو هم مشخص می کردم که بعدا به مشکل نخوریم ولی چه میشه کرد بریم جلو ببینیم چی میشه )این داستان ادامه دارد….