<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Otp on Kuldeep Pisda</title><link>https://kdpisda.in/tag/otp/</link><description>Recent content in Otp on Kuldeep Pisda</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 20 Mar 2026 10:00:00 +0530</lastBuildDate><atom:link href="https://kdpisda.in/tag/otp/index.xml" rel="self" type="application/rss+xml"/><item><title>OTP Phone Authentication for Indian Consumer Apps in Django</title><link>https://kdpisda.in/otp-phone-auth-django-drf/</link><pubDate>Fri, 20 Mar 2026 10:00:00 +0530</pubDate><guid>https://kdpisda.in/otp-phone-auth-django-drf/</guid><description>&lt;p&gt;The first real product decision I made on this veterinary clinic-management
platform — one I built solo for the Indian market back in 2019 — had nothing to do with
clinics. It was this: &lt;strong&gt;the login is a phone number and a six-digit code, not an
email and a password.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That sounds obvious now. It wasn&amp;rsquo;t the default I reached for. Django hands you
&lt;code&gt;username&lt;/code&gt; + &lt;code&gt;password&lt;/code&gt; out of the box, &lt;code&gt;djangorestframework-simplejwt&lt;/code&gt; assumes the
same, and every tutorial I&amp;rsquo;d read wired auth that way. But the users were pet owners
in Indian towns. A lot of them don&amp;rsquo;t have an email they check. All of them have a
phone number, and they already expect &amp;ldquo;enter your number, get an OTP&amp;rdquo; because that&amp;rsquo;s
how every app they use — payments, food, ride-hailing — logs them in. Phone &lt;em&gt;is&lt;/em&gt; the
identity here. Building email auth and bolting phone on later would have been solving
the wrong problem first.&lt;/p&gt;</description></item><item><title>Splitting Celery Workers by Queue, Not by Scale</title><link>https://kdpisda.in/splitting-celery-workers-by-queue-not-scale/</link><pubDate>Sun, 15 Mar 2026 10:00:00 +0530</pubDate><guid>https://kdpisda.in/splitting-celery-workers-by-queue-not-scale/</guid><description>&lt;p&gt;Here is the bug that never happened, which is the whole point.&lt;/p&gt;
&lt;p&gt;A user opens the app, taps &amp;ldquo;log in&amp;rdquo;, and waits for a six-digit code to land on their
phone. At the same moment, a clinic receptionist somewhere else hits &amp;ldquo;export&amp;rdquo; on a
year of billing history — a fat Excel file that takes a while to build. On a naive
Celery setup, those two tasks go into the same queue and get picked up by the same
pool of workers. If the export grabbed a worker first, the OTP sits behind it. The
user stares at a blank code field. To them, login is broken. Nothing threw an
exception. The export was doing exactly what it was told.&lt;/p&gt;</description></item></channel></rss>