On 18.9.2016 00:04, Tomáš Ehrlich wrote:
>> 17. 9. 2016 v 23:55, Vladimír Macek <ma...@sandbox.cz>:
>>
>> Zdar,
>>
>> jak řešíte nepříjemné dvojité POSTy, kdy uživatel poklepe na submit?
> Jestli je problém, je uživatel double clickne na submit, tak řešit přes JS? 
> OnClick -> Disable?

Ano, to bude první fáze řešení a určitě to zlepší UX, jak píšeš níže. Ale
nejde na to spoléhat.


>> V logu je něco takového:
>>
>> 2016-09-17T18:34:35+02:00 "POST /accounts/signup/ HTTP/1.1" 499 ...
>> 2016-09-17T18:34:36+02:00 "POST /accounts/signup/ HTTP/1.1" 500 ...
>>
>> Tj. na první POST Django stihne uživatele zaregistrovat, ale nginx zjistí,
>> že browser mezitím zavřel spojení (499) a čeká na spojení dalším. Tam ovšem
>> zařve postgres, že uživatel s tímto e-mailem už existuje.
>>
>> Pořádné webové aplikaci by se podle mě tohle nemělo stát a druhému POSTu by
>> měla vrátit to samé, co BY vrátila tomu prvnímu.
> To se mi moc nezdá. Musel bys nějak identifikovat, že oba requesty přišly od 
> stejného uživatele.

Ano, řešitelné. Zatím uvažuju o middleware, který po každém commitu POSTu
uloží do cache HttpResponse klíčovanou hashem request.POST dat + IP adresy
+ csrfcookie s timeoutem 2 sec. Na začátku POSTu by se do cache mrklo a
kdyžtak response hned vrátí.


> Dokončí Django první request, když nginx vrátí 499? Nebo ho nginx “utne”?

No to zatím jsem nevyřešil, proč druhý request skončí s IntegrityError a
nikoli se reg. formem s chybou "Uživatel už existuje".

Díval jsem se do logu postgresu a celý signup skrz django-allauth proběhne
v transakci. To je druhá záhada, když `ATOMIC_REQUESTS=False` a neobjevil
jsem v té cestě `transaction.atomic`. Django nějak samo začne transakci
před `SELECT` zjišťujícím, jestli už e-mail existuje a skončí jí až s
vytvořením po vytvoření všech objektů vázaných na uživatele, jak to máme v
aplikaci. Přitom normálně requesty do transakce nebalí.

Třeba někdo víte z hlavy.

Dík,

V.

-- 
-- 
E-mailová skupina django-cs@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
--- 
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs 
ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete 
e-mail na adresu django-cs+unsubscr...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte 
https://groups.google.com/d/msgid/django-cs/6bfbd599-50ae-7540-6aef-c0e7e194902b%40sandbox.cz.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

Reply via email to