ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π»ΠΎΠ³ΠΈΠ½Π°: ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π»ΠΎΠ³ΠΈΠ½ΠΎΠ²

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ login_hint | ΠšΡ€ΠΈΠΏΡ‚ΠΎΠŸΡ€ΠΎ DSS

Часто клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π½Π°Π΅Ρ‚ Π»ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ сразу ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠ½Π° Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π’ качСствС Ρ‚Π°ΠΊΠΎΠΉ подсказки спСцификация OpenID Connect 1.0 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ login_hint.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ прСдставляСт собой подсказку для Π¦Π΅Π½Ρ‚Ρ€Π° Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π° страницС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Если ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с Ρ‚Π°ΠΊΠΈΠΌ Π»ΠΎΠ³ΠΈΠ½ΠΎΠΌ зарСгистрирован ΠΈ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² DSS, Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ использовано Π² качСствС Π»ΠΎΠ³ΠΈΠ½Π°, Ρ‚Π΅ΠΌ самым ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ввСсти свой ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Если ΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с Ρ‚Π°ΠΊΠΈΠΌ Π»ΠΎΠ³ΠΈΠ½ΠΎΠΌ Π½Π΅Ρ‚ ΠΈΠ»ΠΈ Π΅Π³ΠΎ учётная запись Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π°, Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ login_hint ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ для Π΄Π²ΡƒΡ… сцСнариСв: с использованиСм ΠΊΠΎΠ΄Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ с нСявным Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ (см. Authorization Code Flow ΠΈ Implicit Flow).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ запросов

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ запроса, содСрТащСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ login_hint

(пСрСносы строк Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ для наглядности):

GET /authorize?
    client_id=eea2fd3f-5c70-4d74-a594-f1e7bf81b4d7
    &resource=https:%2f%2fdss. cryptopro.ru%2fSignServer%2frest%2fapi
    &redirect_uri=http:%2f%2f127.0.0.1:9158%2f
    &response_type=code
    &login_hint=sga HTTP/1.1
Host: dss.cryptopro.ru

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· id_token

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· id_token. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ содСрТимого id_token:

{
  "unique_name": "sga",
  "dss_iss": "realsts",
  "dss_uuid": "49pDZfxUwFjeHhYSsrSX2LvdSxA=",
  "role": "Users",
  "dss_group": "Default",
  "at_hash": "yQAbEebC9sgmXrjonanKPQ",
  "iss": "realsts",
  "aud": "cryptopro.cloud.csp",
  "exp": 1527844466,
  "nbf": 1527844166
}

Π’ id_token Π»ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ содСрТится Π² ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ unique_name. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это sga. Однако клиСнтскому ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого утвСрТдСния, Π½ΠΎ ΠΈ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ утвСрТдСния dss_iss. Π’ Π½Ρ‘ΠΌ содСрТится ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π¦Π΅Π½Ρ‚Ρ€Π° Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ unique_name Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° login_hint

ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, Ссли dss_iss Ρ€Π°Π²Π΅Π½ realsts. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ realsts Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² unique_name находится Π»ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ЦИ DSS, Π° Π½Π΅ Π»ΠΎΠ³ΠΈΠ½ ΠΈΠ· стороннСго ЦИ. НапримСр, unique_name ΠΈΠ· Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСльзя:

{
  "unique_name": "[email protected]",
  "dss_iss": "adfs",
  "dss_uuid": "49pDZfxUwFjeHhYSsrSX2LvdSxA=",
  "role": "Users",
  "dss_group": "Default",
  "at_hash": "yQAbEebC9sgmXrjonanKPQ",
  "iss": "realsts",
  "aud": "cryptopro.cloud.csp",
  "exp": 1527844466,
  "nbf": 1527844166
}

Руководство Django Π§Π°ΡΡ‚ΡŒ 8: АутСнтификация ΠΈ авторизация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ — Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

Π’ Π΄Π°Π½Π½ΠΎΠΌ руководствС ΠΌΡ‹ продСмонстрируСм Π²Π°ΠΌ систСму Π²Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° Π²Π°ΡˆΒ ΡΠ°ΠΉΡ‚Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ собствСнный Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ  ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π·Π°Π»ΠΎΠ³ΠΈΠ½Π΅Π½ ΠΎΠ½, ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€Π°Π² доступа 

(permissions). Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС это, ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ LocalLibrary, Π΄ΠΎΠ±Π°Π²ΠΈΠ² страницы для Π²Ρ…ΠΎΠ΄Π°/Π²Ρ‹Ρ…ΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ страницы просмотра/рСдактирования ΠΊΠ½ΠΈΠ³, спСцифичСскиС для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ пСрсонала.

ВрСбования:Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ‚Π΅ΠΌ руководства, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Руководство Django Π§Π°ΡΡ‚ΡŒ 7: Π Π°Π±ΠΎΡ‚Π° с сСссиями.
ЦСль:ΠŸΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΡ€Π°Π² доступа.

Django прСдоставляСт систСму Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈΒ («permission») ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° основС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСссиями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ рассматривали Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ части. БистСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ позволяСт Π²Π°ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ дСйствия ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя встроСнныС ΠΌΠΎΠ΄Π΅Π»ΠΈ для ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π“Ρ€ΡƒΠΏΠΏ (основной способ примСнСния ΠΏΡ€Π°Π² доступа для Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ), нСпосрСдствСнно саму систСму ΠΏΡ€Π°Π² доступа (permissions)/Ρ„Π»Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, с ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Ρƒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ доступом.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ соотвСтствии с ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Django систСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ являСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ прСдоставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах Π²Π΅Π±-Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. РСшСниями Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ сторонних Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΠΏΠΎΠ΄Π±ΠΎΡ€Π° пароля (Ρ‡Π΅Ρ€Π΅Π· ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡŽΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ OAuth).

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ руководства ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²Π°ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° сайтС LocalLibrary, созданиС страниц Π²Ρ…ΠΎΠ΄Π°/Π²Ρ‹Ρ…ΠΎΠ΄Π°, добавлСния разграничСния доступа (permissions) ΠΊ вашим модСлям, Π° Ρ‚Π°ΠΊΠΆΠ΅ продСмонстрируСм ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° доступом ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ страницам. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ/Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ для ΠΏΠΎΠΊΠ°Π·Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈ сотрудникам Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, списков ΠΊΠ½ΠΈΠ³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ взяты Π½Π° ΠΏΡ€ΠΎΠΊΠ°Ρ‚.

БистСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ являСтся ΠΎΡ‡Π΅Π½ΡŒ Π³ΠΈΠ±ΠΊΠΎΠΉΒ ΠΈ позволяСт Π²Π°ΠΌ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои собствСнныС URL-адрСса, Ρ„ΠΎΡ€ΠΌΡ‹, отобраТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ страниц, Ссли Π²Ρ‹ ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ‚Π΅, с нуля,Β Ρ‡Π΅Ρ€Π΅Π· простой Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ API для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈΒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹Π΅» Π² Django ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ„ΠΎΡ€ΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ построСния страниц Π²Ρ…ΠΎΠ΄Π° ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π°. Нам всС Π΅Ρ‰Ρ‘ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ страниц, Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ достаточно нСслоТно.

ΠœΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²Π°ΠΌ ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа (permissions), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ статусов авторизации и прав доступа, Π² отобраТСниях, ΠΈ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… страниц.

АутСнтификация Π±Ρ‹Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° автоматичСски ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создали скСлСт сайта (Π² части 2), Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: НСобходимыС настройки Π±Ρ‹Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ для нас, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создали ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

django-admin startproject. Π’Π°Π±Π»ΠΈΡ†Ρ‹ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ созданы, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ python manage.py migrate.

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ настройки сдСланы Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… INSTALLED_APPS ΠΈ MIDDLEWARE Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (locallibrary/locallibrary/settings. py), ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

INSTALLED_APPS = [
    ...
    'django.contrib.auth',  
    'django.contrib.contenttypes',  
    ....

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',  
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',  
    ....

Π’Ρ‹ ΡƒΠΆΠ΅ создали своСго ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассматривали Административная панСль сайта Django Π² части 4 (это Π±Ρ‹Π» ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, созданный ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ python manage.py createsuperuser). Наш ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΆΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ функциям, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ тСстового ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сайта. Π’ качСствС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ быстрого способа, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ панСль сайта для создания ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π³Ρ€ΡƒΠΏΠΏ ΠΈ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² locallibrary.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. НапримСр, Π²Π°ΠΌ ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ способ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… собствСнныС Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹ (Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ доступ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΊ административной ΠΏΠ°Π½Π΅Π»ΠΈ вашСго сайта).

from django.contrib.auth.models import User


user = User.objects.create_user('myusername', '[email protected]', 'mypassword')


user.first_name = 'John'
user.last_name = 'Citizen'
user.save()

НиТС ΠΌΡ‹ создадим Π³Ρ€ΡƒΠΏΠΏΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ…Β  Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для добавлСния ΠΊ нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Ρ‡Π»Π΅Π½ΠΎΠ², Ссли ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΊ ΡƒΠΆΠ΅ созданной Π³Ρ€ΡƒΠΏΠΏΠ΅, с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ.

ЗапуститС сСрвСр Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ административной ΠΏΠ°Π½Π΅Π»ΠΈ вашСго сайта (http://127.0.0.1:8000/admin/). Π—Π°Π»ΠΎΠ³ΠΈΠ½ΡŒΡ‚Π΅ΡΡŒ Π½Π° сайтС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ пароля) Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Бамая «Π²Π΅Ρ€Ρ…няя» страница ΠΏΠ°Π½Π΅Π»ΠΈ Администратора ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС наши ΠΌΠΎΠ΄Π΅Π»ΠΈ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ записи Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Authentication and Authorisation Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ссылку

Users, ΠΈΠ»ΠΈ Groups.

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π² качСствС Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° нашСго сайта, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Π½ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ.

  1. НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Add (Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ) (рядом с Group) ΠΈ создайтС Π½ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ; для Π΄Π°Π½Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Name (Имя) «Library Members».
  2. Для Π΄Π°Π½Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, поэтому ΠΌΡ‹ просто Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ SAVE (Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ) (Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘Ρ‚Π΅ ΠΊ списку Π³Ρ€ΡƒΠΏΠΏ).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

  1. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° домашнюю страницу административной ΠΏΠ°Π½Π΅Π»ΠΈ
  2. Для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³Ρƒ добавлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Add, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ строкС Users (ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ).
  3. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Username (имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ) ΠΈ Password/Password confirmation (ΠΏΠ°Ρ€ΠΎΠ»ΡŒ/ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ пароля) для вашСго тСстового ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  4. НаТмитС SAVE для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

    Административная Ρ‡Π°ΡΡ‚ΡŒ сайта создаст Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ вас Π½Π° страницу Change user (ИзмСнСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ) Π³Π΄Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅, соотвСтствСнно, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ваш username, Π° ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ User. Π­Ρ‚ΠΈ поля Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ„Π°ΠΌΠΈΠ»ΠΈΡŽ, адрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹, статус ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ доступа (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π»Π°Π³Β  Active). НиТС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ доступа, Π° ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Π°ΠΆΠ½Ρ‹Π΅ Π΄Π°Ρ‚Ρ‹, относящиСся ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ (Π΄Π°Ρ‚Ρƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сайту ΠΈ Π΄Π°Ρ‚Ρƒ послСднСго Π²Ρ…ΠΎΠ΄Π°).

  5. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Groups, ΠΈΠ· списка ДоступныС Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π³Ρ€ΡƒΠΏΠΏΡƒ Library Member, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСмСститС Π΅Ρ‘ Π² Π±Π»ΠΎΠΊ «Π’Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹» (Π½Π°ΠΆΠΌΠΈΡ‚Π΅ стрСлку-«Π½Π°ΠΏΡ€Π°Π²ΠΎ», Π½Π°Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ).
  6. Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ здСсь Π½Π΅Ρ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, просто Π½Π°ΠΆΠΌΠΈΡ‚Π΅ «Save»(Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ), ΠΈ Π²Ρ‹ Π²Π΅Ρ€Π½Ρ‘Ρ‚Π΅ΡΡŒ ΠΊ списку созданных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’ΠΎΡ‚ ΠΈ всС! Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΅ΡΡ‚ΡŒ учётная запись Β«ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ‡Π»Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для тСстирования (ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ страницы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΎΠΉΡ‚ΠΈ Π² систСму).

Note: ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ «Π‘иблиотСкаря». Π’Π°ΠΊ ΠΆΠ΅ создайтС Π³Ρ€ΡƒΠΏΠΏΡƒ «Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€Π΅ΠΉ» ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚ΡƒΠ΄Π° своСго Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданного библиотСкаря

Django прСдоставляСт ΠΏΠΎΡ‡Ρ‚ΠΈ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для создания страниц Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π°, Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы и управлСния паролями ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ. Π­Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя url-адрСса, прСдставлСния (views) ΠΈ Ρ„ΠΎΡ€ΠΌΡ‹,Π½ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ β€” ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой собствСнный шаблон!

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСму ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π‘Π°ΠΉΡ‚ LocalLibrary ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹.Β  ΠœΡ‹ помСстим ΠΈΡ… Π² основныС URL ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄, Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π΄Π΅Π»Π°Π΅Ρ‚ Π²Π΅Ρ‰ΠΈ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅. Π’Π°ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка потрСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΠΎΡ€ΠΌΡ‹, Ссли Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ свою модСль ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (слоТная Ρ‚Π΅ΠΌΠ°!) Π½ΠΎ Π΄Π°ΠΆΠ΅ Π² этом случаС Π²Ρ‹ всё Ρ€Π°Π²Π½ΠΎ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ просмотра запасов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:Β Π’ этом случаС ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ страницы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ URL-адрСса ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, Π² нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Однако, Ссли Π±Ρ‹ Ρƒ нас Π±Ρ‹Π»ΠΎ нСсколько ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ это ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π° Π² систСму ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΅Π³ΠΎ доступным Π½Π° всСм сайтС, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ здСсь!

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ URLs

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° urls.py Ρ„Π°ΠΉΠ»Β (locallibrary/locallibrary/urls.py) Ρ„Π°ΠΉΠ»:


urlpatterns += [
    path('accounts/', include('django.contrib.auth.urls')),
]

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΒ http://127.0.0.1:8000/accounts/ URL (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΡΡƒΡŽ Ρ‡Π΅Ρ€Ρ‚Ρƒ!),Β Django ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ смог Π½Π°ΠΉΡ‚ΠΈ этот URL, ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС URL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ пытался ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ. Из этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ URL-адрСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. ИспользованиС Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° добавляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ URL-адрСса с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния сопоставлСний URL-адрСсов. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Ρ‘ — ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ сопоставлСниС URL-адрСсов автоматичСски ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ URL-адрСса.

accounts/ login/ [name='login']
accounts/ logout/ [name='logout']
accounts/ password_change/ [name='password_change']
accounts/ password_change/done/ [name='password_change_done']
accounts/ password_reset/ [name='password_reset']
accounts/ password_reset/done/ [name='password_reset_done']
accounts/ reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/ reset/done/ [name='password_reset_complete']

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ URL-адрСсу Π²Ρ…ΠΎΠ΄Π° (http://127.0.0.1:8000/accounts/login/). Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ сбою снова, Π½ΠΎ с ошибкой, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ шаблона (registration / login.html) Π² ΠΏΡƒΡ‚ΠΈ поиска шаблона. Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки, пСрСчислСнныС Π² ΠΆΡ‘Π»Ρ‚ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Π²Π΅Ρ€Ρ…Ρƒ:

Exception Type:    TemplateDoesNotExist
Exception Value:    registration/login.html

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг — ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ рСгистрации Π² ΠΏΡƒΡ‚ΠΈ поиска, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» login. html.

ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ шаблонов

URL-адрСса (ΠΈ нСявныС прСдставлСния), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ Π½Π°ΠΉΡ‚ΠΈ связанныС с Π½ΠΈΠΌΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ / рСгистрации / Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΏΡƒΡ‚ΠΈ поиска шаблонов.

Для этого сайта ΠΌΡ‹ размСстим наши HTML-страницы Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ templates / registration /. Π­Ρ‚ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ ΠΏΠ°ΠΏΠΊΠ°Ρ… locallibrary). Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ эти ΠΏΠ°ΠΏΠΊΠΈ сСйчас.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ваша структура ΠΏΠ°ΠΏΠΎΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Π½ΠΈΠ·Ρƒ:
locallibrary (django project folder)
Β  Β |_catalog
Β  Β |_locallibrary
Β  Β |_templates (new)
Β  Β  Β  Β  Β  Β  Β  Β  |_registration

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° шаблонов Β  (Ρ‚. Π΅. ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² ΠΏΡƒΡ‚ΡŒ поиска шаблона) ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ настройки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (/locallibrary/locallibrary/settings.py), ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π² сСкции TEMPLATES строку 'DIRS' ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...

Π¨Π°Π±Π»ΠΎΠ½ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Π’Π°ΠΆΠ½ΠΎ: Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, прСдставлСнныС Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ простой / слСгка ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠΉ вСрсиСй шаблонов Π»ΠΎΠ³ΠΈΠ½Π° дСмонстрации Django. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ придётся Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΡ… для собствСнного использования!

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ HTML Ρ„Π°ΠΉΠ», Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ /locallibrary/templates/registration/login.html. Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

{% extends "base_generic.html" %}

{% block content %}

{% if form.errors %}
  <p>Your username and password didn't match. Please try again.</p>
{% endif %}

{% if next %}
  {% if user.is_authenticated %}
    <p>Your account doesn't have access to this page. To proceed,
    please login with an account that has access.</p>
  {% else %}
    <p>Please login to see this page.</p>
  {% endif %}
{% endif %}

<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>

<tr>
  <td>{{ form. username.label_tag }}</td>
  <td>{{ form.username }}</td>
</tr>

<tr>
  <td>{{ form.password.label_tag }}</td>
  <td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>

{# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url 'password_reset' %}">Lost password?</a></p>

{% endblock %}

Π­Ρ‚ΠΎΡ‚ шаблон ΠΈΠΌΠ΅Π΅Ρ‚ сходство с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ — ΠΎΠ½ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ наш Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон ΠΈ пСрСопрСдСляСт Π±Π»ΠΎΠΊ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° — это довольно стандартный ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡƒΡ‡Π΅Π±Π½ΠΎΠΌ пособии. ВсС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, это ΠΏΠΎΠΊΠ°Π· Ρ„ΠΎΡ€ΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ввСсти своё имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π° Ссли Π²Ρ‹ Π²Π²Π΅Π΄Ρ‘Ρ‚Π΅ нСдопустимыС значСния, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ввСсти ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ значСния, ΠΊΠΎΠ³Π΄Π° страница обновится.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° страницу Π²Ρ…ΠΎΠ΄Π° (http://127. 0.0.1:8000/accounts/login/) ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ сохранитС свой шаблон, ΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ этого:

Если ваша ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²ΠΎΠΉΡ‚ΠΈ Π² систСму Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ,Β  Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ страницу (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это Π±ΡƒΠ΄Π΅Ρ‚ http://127.0.0.1:8000/accounts/profile/). ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Django ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ послС Π²Ρ…ΠΎΠ΄Π° Π² систСму Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° страницу профиля, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ эту страницу, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ ΠΎΡˆΠΈΠ±ΠΊΡƒ!

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ настройки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (/locallibrary/locallibrary/settings.py) ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ тСкст Π½ΠΈΠΆΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π² систСму, Π²Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½Π° домашнюю страницу сайта.

Π¨Π°Π±Π»ΠΎΠ½ Π²Ρ‹Ρ…ΠΎΠ΄Π°

Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘Ρ‚Π΅ ΠΏΠΎ URL-адрСсу Π²Ρ‹Ρ…ΠΎΠ΄Π° (http://127.0.0.1:8000/accounts/logout/), Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ странноС повСдСниС — ваш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ навСрняка Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· систСмы, Π½ΠΎ Π²Ρ‹ ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚Π΅ Π½Π° страницу Π²Ρ‹Ρ…ΠΎΠ΄Π° администратора. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, хотя Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ссылка для Π²Ρ…ΠΎΠ΄Π° Π½Π° этой страницС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ вас ΠΊ экрану Π²Ρ…ΠΎΠ΄Π° Π² систСму администратора. (ΠΈ это доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ is_staff).

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ /locallibrary/templates/registration/logged_out.html. БкопируйтС тСкст Π½ΠΈΠΆΠ΅:

{% extends "base_generic.html" %}

{% block content %}
<p>Logged out!</p>

<a href="{% url 'login'%}">Click here to login again.</a>
{% endblock %}

Π­Ρ‚ΠΎΡ‚ шаблон ΠΎΡ‡Π΅Π½ΡŒ прост. Он просто ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ сообщСниС, ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ вас ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²Ρ‹ΡˆΠ»ΠΈ ΠΈΠ· систСмы, ΠΈ прСдоставляСт ссылку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π½Π° экран Π²Ρ…ΠΎΠ΄Π° Π² систСму. Если Π²Ρ‹ снова ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘Ρ‚Π΅ Π½Π° страницу Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ эту страницу:

Π¨Π°Π±Π»ΠΎΠ½ сброса пароля

БистСма сброса пароля ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΏΠΎΡ‡Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ссылку Π½Π° сброс. Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ элСктронноС письмо, Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠΌ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° вСсь процСсс Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½.

Π’ качСствС ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹.

Π€ΠΎΡ€ΠΌΠ° сброса пароля

Π­Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для получСния адрСса элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ пароля для сброса пароля). Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ /locallibrary/templates/registration/password_reset_form.html ΠΈ Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

{% extends "base_generic.html" %}
{% block content %}

<form action="" method="post">{% csrf_token %}
    {% if form.email.errors %} {{ form.email.errors }} {% endif %}
        <p>{{ form.email }}</p>
    <input type="submit" value="Reset password" />
</form>

{% endblock %}
Бброс пароля

Π­Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠ° отобраТаСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ваш адрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ собран. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅Β /locallibrary/templates/registration/password_reset_done.html, ΠΈ Π΄Π°ΠΉΡ‚Π΅Β Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

{% extends "base_generic.html" %}
{% block content %}
<p>We've emailed you instructions for setting your password.  If they haven't arrived in a few minutes, check your spam folder.</p>
{% endblock %}
Бброс пароля ΠΏΠΎ email

Π­Ρ‚ΠΎΡ‚ шаблон прСдоставляСт тСкст элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ HTML, содСрТащий ссылку Π½Π° сброс, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ /locallibrary/templates/registration/password_reset_email.html ΠΈ Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

Someone asked for password reset for email {{ email }}. Follow the link below:
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ на сброс пароля

На этой страницС Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ послС наТатия ссылки Π² элСктронном письмС с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ пароля. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ /locallibrary/templates/registration/password_reset_confirm.html ΠΈ Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

{% extends "base_generic.html" %}

{% block content %}

    {% if validlink %}
        <p>Please enter (and confirm) your new password.</p>
        <form action="" method="post">
            {% csrf_token %}
            <table>
                <tr>
                    <td>{{ form. new_password1.errors }}
                        <label for="id_new_password1">New password:</label></td>
                    <td>{{ form.new_password1 }}</td>
                </tr>
                <tr>
                    <td>{{ form.new_password2.errors }}
                        <label for="id_new_password2">Confirm password:</label></td>
                    <td>{{ form.new_password2 }}</td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" value="Change my password" /></td>
                </tr>
            </table>
        </form>
    {% else %}
        <h2>Password reset failed</h2>
        <p>The password reset link was invalid, possibly because it has already been used. Please request a new password reset.</p>
    {% endif %}

{% endblock %}
Бброс пароля Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½

Π­Ρ‚ΠΎ послСдний шаблон сброса пароля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отобраТаСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ вас ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ сброса пароля. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ /locallibrary/templates/registration/password_reset_complete.html ΠΈ Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

{% extends "base_generic.html" %}
{% block content %}

<h2>The password has been changed!</h2>
<p><a href="{% url 'login' %}">log in again?</a></p>

{% endblock %}

ВСстированиС Π½ΠΎΠ²Ρ‹Ρ… страниц Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ URL ΠΈ создали всС эти ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ страницы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ! Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ страницы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΠΏΡ‹Ρ‚Π°Π²ΡˆΠΈΡΡŒ Π²ΠΎΠΉΡ‚ΠΈ Π² систСму, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈΠ· ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записи ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти URL-адрСса:

Π’Ρ‹ смоТСтС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сброса пароля ΠΏΠΎ ссылкС Π½Π° страницС Π²Ρ…ΠΎΠ΄Π°. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Django отправляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сбросныС элСктронныС письма Π½Π° адрСса (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ хранятся Π² Π΅Π³ΠΎ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…!

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: БистСма сброса пароля Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш сайт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΏΠΎΡ‡Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ, поэтому эта Ρ‡Π°ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ тСстированиС, помСститС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π° settings.py.Β Π­Ρ‚ΠΎ рСгистрируСт Π»ΡŽΠ±Ρ‹Π΅ письма, ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π½Π° консоль (Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ссылку Π½Π° сброс пароля с консоли).

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ см.Β ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° email (Django docs).

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ видят ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π½Π° основС Ρ‚ΠΎΠ³ΠΎ, вошли Π»ΠΈ ΠΎΠ½ΠΈ Π² систСму ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

ВСстированиС Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ зарСгистрированном ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ шаблона {{user}} (это добавляСтся Π² контСкст шаблона ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ настройкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠ°ΠΊ ΠΈ Π² нашСм скСлСтС).

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ сначала провСряСтС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ шаблона {{user.is_authenticated}}, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€Π°Π²ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π½Π°ΡˆΡƒ Π±ΠΎΠΊΠΎΠ²ΡƒΡŽ панСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ссылку Β«Π’Ρ…ΠΎΠ΄Β», Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹ΡˆΠ΅Π» ΠΈΠ· систСмы, ΠΈ ссылку Β«Π’Ρ‹Ρ…ΠΎΠ΄Β», Ссли ΠΎΠ½Β Π²ΠΎΡˆΡ‘Π»Β Π² систСму.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон (/locallibrary/catalog/templates/base_generic.html) ΠΈ скопируйтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст Π²Β sidebar Π±Π»ΠΎΠΊ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅Π³ΠΎΠΌ шаблона endblock.

  <ul>

    ...

   {% if user.is_authenticated %}
     <li>User: {{ user.get_username }}</li>
     <li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li>
   {% else %}
     <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>
   {% endif %} 
  </ul>

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Π΅Π³ΠΈ шаблона if-else-endif для условного отобраТСния тСкста Π½Π° основС Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ {{user.is_authenticated}} истинным. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, поэтому ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ {{user.get_username}}, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΡ… имя.

ΠœΡ‹ создаём URL-адрСс для Π²Ρ…ΠΎΠ΄Π° ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅Π³ шаблона URL-адрСса ΠΈ ΠΈΠΌΠ΅Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ URLs. Β Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈΒ ?next={{request.path}} Π² ΠΊΠΎΠ½Π΅Ρ† URLs. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ URL-адрСс содСрТит адрСс (URL) Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ страницы, Π² ΠΊΠΎΠ½Ρ†Π΅ связанного URL-адрСса. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π²Ρ…ΠΎΠ΄ Π² систСму, прСдставлСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ «next» Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° страницу, Π³Π΄Π΅ ΠΎΠ½ΠΈ сначала Π½Π°ΠΆΠ°Π»ΠΈ ссылку Π²Ρ…ΠΎΠ΄Π° / Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅! Если Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ страницС ΠΈ Π²Ρ‹ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚Π΅ Β«Π’Ρ…ΠΎΠ΄ / Π’Ρ‹Ρ…ΠΎΠ΄Β» Π½Π° Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ, Ρ‚ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π½Π° Ρ‚Ρƒ ΠΆΠ΅ страницу.

ВСстированиС Π² прСдставлСниях

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ прСдставлСния, самым простым способом ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ вашим функциям являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ login_required Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΊ вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ просмотра, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΎΡˆΡ‘Π» Π² систСму, ваш ΠΊΠΎΠ΄ просмотра Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²ΠΎΡˆΡ‘Π» Π² систСму, это ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ URL-адрСс Π²Ρ…ΠΎΠ΄Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² настройках ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. (settings.LOGIN_URL), ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Β Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π² качСствС nextΒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° URL. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ удастся Π²ΠΎΠΉΡ‚ΠΈ Π² систСму, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ Π½Π° эту страницу, Π½ΠΎ Π½Π° этот Ρ€Π°Π· Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:Β Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΏΡƒΡ‚Ρ‘ΠΌ тСстирования request.user.is_authenticated, Π½ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅!

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, самый простой способ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ зарСгистрированным ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π² Π²Π°ΡˆΠΈΡ… прСдставлСниях Π½Π° основС классов — это ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅Β ΠΎΡ‚Β LoginRequiredMixin. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ этот mixin сначала Π² спискС супСркласса, ΠΏΠ΅Ρ€Π΅Π΄ классом основного прСдставлСния.

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    ...

Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ пСрСадрСсации, Ρ‡Ρ‚ΠΎ ΠΈΒ  login_required Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€. Β Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ мСстополоТСниС для пСрСнаправлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ссли ΠΎΠ½ Π½Π΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½ (login_url), ΠΈ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° URL вмСсто «next» , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ (redirect_field_name).

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с  Django docs here.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ страницу ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, создайтС прСдставлСниС ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ заимствовал Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

К соТалСнию, Ρƒ нас ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ возмоТности ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ!Β ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ список ΠΊΠ½ΠΈΠ³, ΠΌΡ‹ сначала Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌΒ BookInstance модСль для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ заимствования ΠΈ использования прилоТСния Django Admin для заимствования ряда ΠΊΠ½ΠΈΠ³ Π½Π°ΡˆΠ΅ΠΌΡƒ тСстовому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

МодСли

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΡ€Π΅Π΄ΠΈΡ‚Π° Π½Π°Β BookInstance (Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ status ΠΈΒ due_back Π΄Π°Ρ‚Π°,Β Π½ΠΎ Ρƒ нас ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ связи ΠΌΠ΅ΠΆΠ΄Ρƒ этой модСлью ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. ΠœΡ‹ создадим Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поля ForeignKeyΒ (ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ). Нам Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ΅Π½ простой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, просрочСна Π»ΠΈ заёмная ΠΊΠ½ΠΈΠ³Π°.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅Β catalog/models.py, ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ модСль User ΠΈΠ·Β django.contrib.auth.models (Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ это Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ строки ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части Ρ„Π°ΠΉΠ»Π°, Ρ‚Π°ΠΊΒ User доступСн для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ):

from django.contrib.auth.models import User

Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠΎΠ»Π΅ borrower Π² модСль BookInstance:

borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

Пока ΠΌΡ‹ здСсь, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΠ· Π½Π°ΡˆΠΈΡ… шаблонов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, просрочСн Π»ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ экзСмпляр ΠΊΠ½ΠΈΠ³ΠΈ. Π₯отя ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ это Π² самом шаблонС, использованиС свойства, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивным. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ это Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части Ρ„Π°ΠΉΠ»Π°:

from datetime import date

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ свойства Π²Π½ΡƒΡ‚Ρ€ΠΈ класса BookInstance:

@property
def is_overdue(self):
    if self. due_back and date.today() > self.due_back:
        return True
    return False

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, являСтся Π»ΠΈΒ due_back пустым, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ сравнСниС. ΠŸΡƒΡΡ‚ΠΎΠ΅ ΠΏΠΎΠ»Π΅Β due_back заставило Django Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π° Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ страницу: пустыС значСния Π½Π΅ сопоставимы. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наши ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ испытывали!

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ наши ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ внСсти Π½ΠΎΠ²Ρ‹Π΅ измСнСния Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ:

python3 manage.py makemigrations
python3 manage.py migrate

Admin

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ catalog/admin.py,Β ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠΎΠ»Π΅Β borrowerΒ Π² класс BookInstanceAdminΒ , ΠΊΠ°ΠΊ Π² list_displayΒ , Ρ‚Π°ΠΊ ΠΈ Π² полях fieldsetsΒ ,Β ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.Β Π­Ρ‚ΠΎ сдСлаСт ΠΏΠΎΠ»Π΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅Β Admin, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈ нСобходимости Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ UserΒ Π²Β BookInstance.

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book', 'status', 'borrower', 'due_back', 'id')
    list_filter = ('status', 'due_back')

    fieldsets = (
        (None, {
            'fields': ('book','imprint', 'id')
        }),
        ('Availability', {
            'fields': ('status', 'due_back','borrower')
        }),
    )

Π—Π°ΠΉΠΌΠΈΡ‚Π΅ нСсколько ΠΊΠ½ΠΈΠ³

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΡ€Π΅Π΄ΠΈΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…Β Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π²Β BookInstance. УстановитС borrowed ΠΏΠΎΠ»Π΅ Π²Π°ΡˆΠ΅ΠΌΡƒ тСстовому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, сдСлайтС statusΒ Β«Π’ Π·Π°ΠΉΠΌΠ΅Β» ΠΈ установитС сроки ΠΎΠΏΠ»Π°Ρ‚Ρ‹ ΠΊΠ°ΠΊ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Ρ‚Π°ΠΊ ΠΈ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:Β ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ процСсс, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Admin сайт!

Π—Π°ΠΉΠΌ Π² прСдставлСнии

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ прСдставлСниС для получСния списка всСх ΠΊΠ½ΠΈΠ³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ прСдоставлСны Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±Ρ‰ΠΈΠΉ класс, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ·Β  LoginRequiredMixin, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΡˆΠ΅Π΄ΡˆΠΈΠΉΒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΒ ΡΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ это прСдставлСниС. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒΒ  template_name, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… списков записСй BookInstance, с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ прСдставлСниями ΠΈ шаблонами.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Β catalog/views.py:

from django.contrib.auth.mixins import LoginRequiredMixin

class LoanedBooksByUserListView(LoginRequiredMixin,generic.ListView):
    """
    Generic class-based view listing books on loan to current user.
    """
    model = BookInstance
    template_name ='catalog/bookinstance_list_borrowed_user.html'
    paginate_by = 10

    def get_queryset(self):
        return BookInstance.objects.filter(borrower=self.request.user).filter(status__exact='o').order_by('due_back')

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ наш запрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ BookInstance для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ get_queryset(),Β ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅. mybooks/$’, views.LoanedBooksByUserListView.as_view(), name=’my-borrowed’), ]

Π¨Π°Π±Π»ΠΎΠ½ для Π·Π°Ρ‘ΠΌΠ½Ρ‹Ρ… ΠΊΠ½ΠΈΠ³

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для этой страницы, — это Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ шаблон. Π‘Π½Π°Ρ‡Π°Π»Π° создайтС Ρ„Π°ΠΉΠ» шаблона /catalog/templates/catalog/bookinstance_list_borrowed_user.htmlΒ ΠΈ Π΄Π°ΠΉΡ‚Π΅ Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТаниС:

{% extends "base_generic.html" %}

{% block content %}
    <h2>Borrowed books</h2>

    {% if bookinstance_list %}
    <ul>

      {% for bookinst in bookinstance_list %}
      <li>
        <a href="{% url 'book-detail' bookinst.book.pk %}">{{bookinst.book.title}}</a> ({{ bookinst.due_back }})
      </li>
      {% endfor %}
    </ul>

    {% else %}
      <p>There are no books borrowed.</p>
    {% endif %}
{% endblock %}

Π­Ρ‚ΠΎΡ‚ шаблон ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создали Ρ€Π°Π½Π΅Π΅ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Book ΠΈ Author. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ Β«Π½ΠΎΠ²ΠΎΠ΅Β» здСсь, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ провСряСм ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² модСль (bookinst. is_overdue) с Ρ†Π΅Π»ΡŒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для измСнСния Ρ†Π²Π΅Ρ‚Π° просрочСнных ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ².

Когда сСрвСр Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ список для зарСгистрированного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² своём Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΠΎ адрСсу  http://127.0.0.1:8000/catalog/mybooks/. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ это, ΠΊΠΎΠ³Π΄Π° ваш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² систСму ΠΈ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· систСмы (Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° страницу Π²Ρ…ΠΎΠ΄Π° Π² систСму).

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ список Π½Π° Π±ΠΎΠΊΠΎΠ²ΡƒΡŽΒ ΠΏΠ°Π½Π΅Π»ΡŒ

ПослСдний шаг — Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ссылку Π½Π° эту Π½ΠΎΠ²ΡƒΡŽ страницу Π² sidebar. ΠœΡ‹ помСстим это Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π°Π·Π΄Π΅Π», Π³Π΄Π΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для зарСгистрированного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон (/locallibrary/catalog/templates/base_generic.html) ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ строку ΠΈΠ· sidebar, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС.

 <ul>
   {% if user.is_authenticated %}
   <li>User: {{ user.get_username }}</li>
   <li><a href="{% url 'my-borrowed' %}">My Borrowed</a></li>
   <li><a href="{% url 'logout'%}?next={{request. path}}">Logout</a></li>
   {% else %}
   <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>
   {% endif %}
 </ul>

На Ρ‡Ρ‚ΠΎ это ΠΏΠΎΡ…ΠΎΠΆΠ΅?

Когда любой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² систСму, ΠΎΠ½Β Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ссылку «Мной позаимствовано (My Borrowed)» в боковой ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅, ΠΈ список ΠΊΠ½ΠΈΠ³, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ (пСрвая ΠΊΠ½ΠΈΠ³Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ установлСнной Π΄Π°Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎ являСтся ошибкой, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ надССмся ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌ ΡƒΡ€ΠΎΠΊΠ΅!).

ΠŸΡ€Π°Π²Π° доступа связаны с модСлями ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° экзСмплярС ΠΌΠΎΠ΄Π΅Π»ΠΈ самим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Django автоматичСски Π΄Π°Ρ‘Ρ‚Β Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρƒ всСх ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ с ΠΏΡ€Π°Π²ΠΎΠΌ доступа Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ связанныС дСйствия Ρ‡Π΅Ρ€Π΅Π· администратора сайта. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ свои собствСнныС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, связанныС с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ экзСмплярами ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. ВСстированиС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² прСдставлСниях ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° тСстированиС ΠΏΠΎ статусу Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (фактичСски, тСстированиС ΠΏΡ€Π°Π² доступа такТС провСряСт Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ).

МодСли

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ выполняСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ «class Meta» , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ permissions ΠΏΠΎΠ»Π΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ опрСдСляСтся Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅, содСрТащСм имя Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΈΠ³Π° Π±Ρ‹Π»Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ здСсь:

class BookInstance(models.Model):
    ...
    class Meta:
        ...
        permissions = (("can_mark_returned", "Set book as returned"),)   

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΠ΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΡŒΒ» (Librarian) Π½Π° сайтС администратора.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ catalog/models.py, ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ (Π²Ρ‹Π·Π²Π°Π²Β python3 manage.py makemigrations ΠΈ python3 manage.py migrate) для Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ обновлСния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Π¨Π°Π±Π»ΠΎΠ½Ρ‹

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ хранятся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ шаблона, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉΒ  {{Β permsΒ }}. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Β«DjangoΒ» — Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, {{ perms.catalog.can_mark_returned }} Π±ΡƒΠ΄Π΅Ρ‚ True Ссли Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅ΡΡ‚ΡŒ это Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π° FalseΒ — Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ провСряСм Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с использованиСм шаблона {%Β ifΒ %}, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²:

{% if perms.catalog.can_mark_returned %}
    <!-- We can mark a BookInstance as returned. -->
    <!-- Perhaps add code to link to a "book return" view here. -->
{% endif %}

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π² прСдставлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡΒ  permission_required Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ Π² прСдставлСнии Π½Π° основС классов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PermissionRequiredMixin. шаблон ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму, хотя, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Ѐункция Π² прСдставлСнии с Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ:

from django.contrib.auth.decorators import permission_required

@permission_required('catalog.can_mark_returned')
@permission_required('catalog.can_edit')
def my_view(request):
    ...

ВрСбуСтся Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ mixin для прСдставлСний Π½Π° основС классов.

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin, View):
    permission_required = 'catalog.can_mark_returned'
    
    permission_required = ('catalog.can_mark_returned', 'catalog.can_edit')
    
    

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ LocalLibrary здСсь; Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡƒΡ€ΠΎΠΊΠ΅!

Β Π Π°Π½Π΅Π΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ страницу для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСчислСны ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ заимствовали. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π΄Π°Ρ‡Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ страницу, которая Π²ΠΈΠ΄Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€Π΅ΠΉ, которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚Β  всС ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ заимствованы, ΠΈ которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ имя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°Ρ‘ΠΌΡ‰ΠΈΠΊΠ°.

Β Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΉ ΠΆΠ΅ схСмС, Ρ‡Ρ‚ΠΎ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ прСдставлСния. Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ прСдставлСниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ библиотСкарями. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π° основС Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сотрудником (Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:Β  staff_member_required, пСрСмСнная шаблона: user.is_staff) Π½ΠΎ ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π²Π°ΠΌ вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ  can_mark_returned Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΒ PermissionRequiredMixin, ΠΊΠ°ΠΊ описано Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π’Π°ΠΆΠ½ΠΎ: НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вашСго ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΒ Π΄Π»Ρ тСстирования Π½Π° основС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ true для ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π΄Π°ΠΆΠ΅ Ссли Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ!). ВмСсто этого создайтС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ-библиотСкаря ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ возмоТности.

 Когда Π²Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚Π΅, ваша страница Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ,Β ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π½ΠΈΠΆΠ΅.

Β ΠžΡ‚Π»ΠΈΡ‡Π½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° — Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ создали Π²Π΅Π±-сайт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ участники Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² систСму ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ собствСнный ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, ΠΈΒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΠΈ (с ΠΏΡ€Π°Π²ΠΎΠΌ доступа) ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΒ Π²ΡΠ΅Β Π·Π°Ρ‘ΠΌΠ½Ρ‹Π΅Β ΠΊΠ½ΠΈΠ³ΠΈ с их читатСлями. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ всС Π΅Ρ‰Ρ‘ просто просматриваСм ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, Π½ΠΎ Ρ‚Π΅ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

Β Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡ‹ Django для сбора ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡Π½Ρ‘ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΡˆΠΈΡ… сохранённых Π΄Π°Π½Π½Ρ‹Ρ….

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Flask-Login

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ возмоТности Π²Π²ΠΎΠ΄Π° ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для Π²Ρ…ΠΎΠ΄Π° β€” ΠΎΠ΄Π½Π° ΠΈΠ· самых распространСнных возмоТностСй, добавляСмых Π² Π²Π΅Π±-прилоТСния. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ расскаТСм, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Flask с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Flask-Login.

ΠœΡ‹ построим нСсколько ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² страниц рСгистрации ΠΈ Π²Ρ…ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ страницы, Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ²ΡˆΠΈΡ… Π²Ρ…ΠΎΠ΄. ΠœΡ‹ собСрСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° Π½Π°ΡˆΠΈΡ… Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… страницах ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ профиля.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π·Π°Ρ‚Ρ€ΠΎΠ½Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  • ИспользованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Flask-Login для управлСния сСансами
  • ИспользованиС встроСнной ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Flask для Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… страниц для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ²ΡˆΠΈΡ… Π²Ρ…ΠΎΠ΄
  • ИспользованиС Flask-SQLAlchemy для создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ
  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌ рСгистрации ΠΈ Π²Ρ…ΠΎΠ΄Π° для создания ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Ρ… записСй ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π²Ρ…ΠΎΠ΄Π°
  • Π’Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ
  • ИспользованиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для отобраТСния Π½Π° страницС профиля

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° доступСн Π½Π° GitHub.

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трСбования

Для этого ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ модуля Π²Π°ΠΌ потрСбуСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Flask с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π£ нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° всС связанноС с Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ, ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ страницу Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ профиля. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ описанноС здСсь Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для этого ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ модуля.

Π—Π΄Π΅ΡΡŒ имССтся схСма, которая ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ структура Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ прохоТдСния ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ модуля:

.
└── flask_auth_app
    └── project
        β”œβ”€β”€ __init__.py       # setup our app
        β”œβ”€β”€ auth.py           # the auth routes for our app
        β”œβ”€β”€ db.sqlite         # our database
        β”œβ”€β”€ main.py           # the non-auth routes for our app
        β”œβ”€β”€ models.py         # our user model
        └── templates
            β”œβ”€β”€ base.html     # contains common layout and links
            β”œβ”€β”€ index.html    # show the home page
            β”œβ”€β”€ login.html    # show the login form
            β”œβ”€β”€ profile.html  # show the profile page
            └── signup.html   # show the signup form

По ΠΌΠ΅Ρ€Π΅ выполнСния этого ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ модуля ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ эти ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹.

Π¨Π°Π³ 1 β€” Установка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

Для нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π°ΠΌ потрСбуСтся Ρ‚Ρ€ΠΈ основных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

  • Flask
  • Flask-Login: для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сСансов послС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
  • Flask-SQLAlchemy: для прСдставлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ интСрфСйса с нашСй Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SQLite, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ зависимости для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Для Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создадим ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Если Ρƒ нас Π½Π΅Ρ‚ срСды Python, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Π’ зависимости ΠΎΡ‚ способа установки Python Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

  • python3 -m venv auth
  • source auth/bin/activate

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΠΎ вашСй локальной срСдС для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ настройкС venv.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π² своСй Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ срСдС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для установки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

  • pip install flask flask-sqlalchemy flask-login

ΠœΡ‹ установили ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ основной Ρ„Π°ΠΉΠ» прилоТСния.

Π¨Π°Π³ 2 β€” Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° прилоТСния

Для Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создадим ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ Ρ„Π°ΠΉΠ»ΠΎΠΌ __init__.py для нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ создания нашСго прилоТСния, которая ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ зарСгистрируСт наши ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½ΠΎ это потрСбуСтся для создания ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… частСй прилоТСния. Нам Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SQLAlchemy, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ значСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ здСсь наши ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹.

project/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# init SQLAlchemy so we can use it later in our models
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    app.config['SECRET_KEY'] = 'secret-key-goes-here'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'

    db.init_app(app)

    # blueprint for auth routes in our app
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    # blueprint for non-auth parts of app
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π³ΠΎΡ‚ΠΎΠ² основной Ρ„Π°ΠΉΠ» прилоТСния, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ².

Π¨Π°Π³ 3 β€” Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²

Для Π½Π°ΡˆΠΈΡ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ основном ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ главная страница (/) ΠΈ страница профиля (/profile), открываСмая послС Π²Ρ…ΠΎΠ΄Π°. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ попытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ страницС профиля Π±Π΅Π· Π²Ρ…ΠΎΠ΄Π° Π² систСму, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π²Ρ…ΠΎΠ΄Π°.

Π’ нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ auth Ρƒ нас Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ для получСния страницы Π²Ρ…ΠΎΠ΄Π° (/login) ΠΈ страницы рСгистрации (/sign-up). Π’Π°ΠΊΠΆΠ΅ Ρƒ нас ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов POST ΠΎΡ‚ ΠΎΠ±ΠΎΠΈΡ… этих ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ². НаконСц, Ρƒ нас имССтся ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π° (/logout) для Π²Ρ‹Ρ…ΠΎΠ΄Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· систСмы.

Пока Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ login, signup ΠΈ logout простыми Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°ΠΌΠΈ. ΠœΡ‹ вСрнСмся ΠΊ Π½ΠΈΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΈΡ…, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π½Π°Ρ‡Π°Π»Π΅ создайтС Ρ„Π°ΠΉΠ» main.py для main_blueprint:

project/main.py

from flask import Blueprint
from . import db

main = Blueprint('main', __name__)

@main.route('/')
def index():
    return 'Index'

@main.route('/profile')
def profile():
    return 'Profile'

Π—Π°Ρ‚Π΅ΠΌ создайтС Ρ„Π°ΠΉΠ» auth.py для auth_blueprint:

project/auth.py

from flask import Blueprint
from . import db

auth = Blueprint('auth', __name__)

@auth.route('/login')
def login():
    return 'Login'

@auth.route('/signup')
def signup():
    return 'Signup'

@auth.route('/logout')
def logout():
    return 'Logout'

Π’ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ значСния FLASK_APP ΠΈ FLASK_DEBUG:

  • export FLASK_APP=project
  • export FLASK_DEBUG=1

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ срСды FLASK_APP сообщаСт Flask, ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Она Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° мСсто создания create_app. Для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ project.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ срСды FLASK_DEBUG активируСтся посрСдством присвоСния Π΅ΠΉ значСния 1. Π­Ρ‚ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ошибки прилоТСния.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ flask_auth_app ΠΈ запуститС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… URL-адрСсов ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ тСкст, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„Π°ΠΉΠ»Π°Ρ… auth.py ΠΈ main.py.

НапримСр, Ссли ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ адрСс localhost:5000/profile, появится: Profile:

ΠœΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π°ΡˆΠΈΡ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ созданию шаблонов.

Π¨Π°Π³ 4 β€” Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ шаблонов

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈ создадим ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ…ΠΎΠ΄Π°. НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шаблона:

  • index.html
  • profile.html
  • login.html
  • signup.html

Π’Π°ΠΊΠΆΠ΅ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· страниц. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ссылки Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ°ΠΊΠ΅Ρ‚ страницы. Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим ΠΈΡ… сСйчас.

Для Π½Π°Ρ‡Π°Π»Π° создайтС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ templates Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ project:

  • mkdir -p project/templates

Π—Π°Ρ‚Π΅ΠΌ создайтС base.html:

  • nano project/templates/base.html

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» base.html:

project/templates/base.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Flask Auth Example</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css" />
</head>

<body>
    <section>

        <div>
            <nav>
                <div>

                    <div>
                        <div>
                            <a href="{{ url_for('main.index') }}">
                                Home
                            </a>
                            <a href="{{ url_for('main.profile') }}">
                                Profile
                            </a>
                            <a href="{{ url_for('auth.login') }}">
                                Login
                            </a>
                            <a href="{{ url_for('auth.signup') }}">
                                Sign Up
                            </a>
                            <a href="{{ url_for('auth.logout') }}">
                                Logout
                            </a>
                        </div>
                    </div>
                </div>
            </nav>
        </div>

        <div>
            <div>
               {% block content %}
               {% endblock %}
            </div>
        </div>
    </section>
</body>

</html>

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создаст ΡΠ΅Ρ€ΠΈΡŽ ссылок мСню Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ страницу прилоТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π—Π° кулисами ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Bulma для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со стилями ΠΈ ΠΌΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Bulma, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ Bulma.

Π—Π°Ρ‚Π΅ΠΌ создайтС Ρ„Π°ΠΉΠ» templates/index.html:

  • nano project/templates/index.html

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² созданный Ρ„Π°ΠΉΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ страницу содСрТаниСм:

project/templates/index.html

{% extends "base.html" %}

{% block content %}
<h2>
  Flask Login Example
</h2>
<h3>
  Easy authentication and authorization in Flask.
</h3>
{% endblock %}

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создаст Π±Π°Π·ΠΎΠ²ΡƒΡŽ страницу указатСля с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠ΄Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ.

Π—Π°Ρ‚Π΅ΠΌ создайтС страницу templates/login.html:

  • nano project/templates/login.html

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ страницу Π²Ρ…ΠΎΠ΄Π° с полями Email ΠΈ Password. Π’Π°ΠΊΠΆΠ΅ имССтся ΠΏΠΎΠ»Π΅ для ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ запоминания сСанса Π²Ρ…ΠΎΠ΄Π°.

project/templates/login.html

{% extends "base.html" %}

{% block content %}
<div>
    <h4>Login</h4>
    <div>
        <form method="POST" action="/login">
            <div>
                <div>
                    <input type="email" name="email" placeholder="Your Email" autofocus="">
                </div>
            </div>

            <div>
                <div>
                    <input type="password" name="password" placeholder="Your Password">
                </div>
            </div>
            <div>
                <label>
                    <input type="checkbox">
                    Remember me
                </label>
            </div>
            <button>Login</button>
        </form>
    </div>
</div>
{% endblock %}

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ шаблон templates/signup.html:

  • nano project/templates/signup.html

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Ρ„Π°ΠΉΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ страницу рСгистрации с полями адрСса элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹, ΠΈΠΌΠ΅Π½ΠΈ ΠΈ пароля:

project/templates/signup.html

{% extends "base.html" %}

{% block content %}
<div>
    <h4>Sign Up</h4>
    <div>
        <form method="POST" action="/signup">
            <div>
                <div>
                    <input type="email" name="email" placeholder="Email" autofocus="">
                </div>
            </div>

            <div>
                <div>
                    <input type="text" name="name" placeholder="Name" autofocus="">
                </div>
            </div>

            <div>
                <div>
                    <input type="password" name="password" placeholder="Password">
                </div>
            </div>

            <button>Sign Up</button>
        </form>
    </div>
</div>
{% endblock %}

Π—Π°Ρ‚Π΅ΠΌ создайтС шаблон templates/profile.html:

  • nano project/templates/profile.html

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ этот ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ страницу с Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ, welcome Anthony:

project/templates/profile.html

{% extends "base.html" %}

{% block content %}
<h2>
  Welcome, Anthony!
</h2>
{% endblock %}

ПозднСС ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠ΄ для динамичСского привСтствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ПослС добавлСния шаблонов ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ выраТСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто тСкста Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹.

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» main.py, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² строку ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ index ΠΈ profile:

project/main.py

from flask import Blueprint, render_template
...
@main.route('/')
def index():
    return render_template('index.html')

@main.route('/profile')
def profile():
    return render_template('profile.html')

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ auth.py, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² строку ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ login ΠΈ signup:

project/auth.py

from flask import Blueprint, render_template
...
@auth.route('/login')
def login():
    return render_template('login.html')

@auth.route('/signup')
def signup():
    return render_template('signup.html')

ПослС внСсСния этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ страница рСгистрации Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π² /sign-up:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ страницы /, /login ΠΈ /profile.

Пока Ρ‡Ρ‚ΠΎ ΠΌΡ‹ оставим /logout ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ эта страница Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ шаблон.

Π¨Π°Π³ 5 β€” Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ

Наша ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ модСль ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для нашСго прилоТСния. Π£ нас Π΅ΡΡ‚ΡŒ поля адрСса эл. ΠΏΠΎΡ‡Ρ‚Ρ‹, пароля ΠΈ ΠΈΠΌΠ΅Π½ΠΈ. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π»ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ ΠΊΠ°ΠΊ дСнь роТдСния, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ профиля ΠΈΠ»ΠΈ прСдпочтСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

МодСли, созданныС Π² Flask-SQLAlchemy, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ классами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Атрибуты этих классов прСвратятся Π² столбцы этих Ρ‚Π°Π±Π»ΠΈΡ†.

Π”Π°Π²Π°ΠΉΡ‚Π΅ вмСстС создадим эту ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ модСль:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создаСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ модСль со столбцами id, email, password ΠΈ name:

project/models.py

from . import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True) # primary keys are required by SQLAlchemy
    email = db.Column(db.String(100), unique=True)
    password = db.Column(db.String(100))
    name = db.Column(db.String(1000))

ΠœΡ‹ создали ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ модСль ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ настройкС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Π¨Π°Π³ 6 β€” Настройка Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Как ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трСбования», ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… SQLite. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… SQLite ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ сСйчас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для этого Flask-SQLAlchemy. ΠœΡ‹ ΡƒΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π΅ __init__.py, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ просто ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Flask-SQLAlchemy ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Python REPL.

Если Π²Ρ‹ остановитС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ Python REPL, ΠΌΡ‹ смоТСм ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ create_all для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° db. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ всС Π΅Ρ‰Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ срСдС ΠΈ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ flask_auth_app.

  • from project import db, create_app
  • db.create_all(app=create_app()) # pass the create_app result so Flask-SQLAlchemy gets the configuration.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Если Π²Ρ‹ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹ с использованиСм ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» db.sqlite Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ этой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ наша ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π¨Π°Π³ 7 β€” Настройка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

Для нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рСгистрации ΠΌΡ‹ возьмСм Π΄Π°Π½Π½Ρ‹Π΅, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π² Ρ„ΠΎΡ€ΠΌΡƒ, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΡ… Π² Π½Π°ΡˆΡƒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ это, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Если Π΅Π³ΠΎ Π½Π΅Ρ‚, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ тСкста.

Для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΡ‹ POST. Π’ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π²Π½Π°Ρ‡Π°Π»Π΅ собСрСм Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Π΅Π΅ ΠΊΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ пСрСадрСсован Π½Π° страницу Π²Ρ…ΠΎΠ΄Π°.

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» auth.py, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² строку import ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² signup_post:

project/auth.py

from flask import Blueprint, render_template, redirect, url_for
...
@auth.route('/signup', methods=['POST'])
def signup_post():
    # code to validate and add user to database goes here
    return redirect(url_for('auth.login'))

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Для Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ запроса для получСния Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΡ‹.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» auth.py, добавляя элСмСнты ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈ рСализуя signup_post:

auth.py

from flask import Blueprint, render_template, redirect, url_for, request
from werkzeug.security import generate_password_hash, check_password_hash
from .models import User
from . import db
...
@auth.route('/signup', methods=['POST'])
def signup_post():
    email = request.form.get('email')
    name = request.form.get('name')
    password = request.form.get('password')

    user = User.query.filter_by(email=email).first() # if this returns a user, then the email already exists in database

    if user: # if a user is found, we want to redirect back to signup page so user can try again
        return redirect(url_for('auth.signup'))

    # create a new user with the form data. Hash the password so the plaintext version isn't saved.
    new_user = User(email=email, name=name, password=generate_password_hash(password, method='sha256'))

    # add the new user to the database
    db.session.add(new_user)
    db.session.commit()

    return redirect(url_for('auth.login'))

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ тСкста считаСтся ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бСзопасности. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слоТный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ.

Π¨Π°Π³ 8 β€” ВСстированиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° рСгистрации

Π£ нас Π³ΠΎΡ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ рСгистрации, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ для создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

БущСствуСт Π΄Π²Π° способа ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт просмотра Π‘Π” для поиска строки, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΈΠ»ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ ΠΆΠ΅ адрСсом элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹, ΠΈ Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС, это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ адрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ Π±Ρ‹Π» сохранСн ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Ρ‡Ρ‚ΠΎ адрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΡƒΠΆΠ΅ сущСствуСт, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° страницу Π²Ρ…ΠΎΠ΄Π°. Вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ flash, ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ сообщСниС для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ запроса, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это запрос пСрСадрСсации. На ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΉ страницС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ доступ ΠΊ этому сообщСниС Π² шаблонС.

Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ элСмСнт flash, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π΄ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π½Π° страницу рСгистрации.

project/auth.py

from flask import Blueprint, render_template, redirect, url_for, request, flash
...
@auth.route('/signup', methods=['POST'])
def signup_post():
    ...
    if user: # if a user is found, we want to redirect back to signup page so user can try again
        flash('Email address already exists')
        return redirect(url_for('auth.signup'))

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² шаблон ΠΌΠΈΠ³Π°ΡŽΡ‰Π΅Π΅ сообщСниС, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π°Π΄ Ρ„ΠΎΡ€ΠΌΠΎΠΉ этот ΠΊΠΎΠ΄. Π’Π°ΠΊ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ нСпосрСдствСнно Π½Π°Π΄ Ρ„ΠΎΡ€ΠΌΠΎΠΉ.

project/templates/signup.html

...
{% with messages = get_flashed_messages() %}
{% if messages %}
    <div>
        {{ messages[0] }}. Go to <a href="{{ url_for('auth.login') }}">login page</a>.
    </div>
{% endif %}
{% endwith %}
<form method="POST" action="/signup">

Π¨Π°Π³ 9 β€” Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Ρ…ΠΎΠ΄Π°

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²Ρ…ΠΎΠ΄Π° ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ рСгистрации Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ с Π½Π΅ΠΉ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ сравниваСм Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ адрСс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΎΠ½ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ, ΠΌΡ‹ протСстируСм ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ пароля ΠΈ сравнив Π΅Π³ΠΎ с Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Если ΠΎΠ±Π° Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… пароля ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π» ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пароля ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Π΅Ρ€Π½Ρ‹, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΅ΠΌΡƒ Π²Ρ…ΠΎΠ΄ Π² систСму, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Flask-Login. Вызывая login_user, Flask-Login создаСт сСанс этого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСтся всС врСмя, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ остаСтся Π² систСмС, ΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ страницы.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ POST. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ Π½Π° страницу профиля послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

project/auth.py

...
@auth.route('/login', methods=['POST'])
def login_post():
    # login code goes here
    return redirect(url_for('main.profile'))

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π²Π΅Ρ€Π½ΠΎ:

project/auth.py

...
@auth.route('/login', methods=['POST'])
def login_post():
    email = request.form.get('email')
    password = request.form.get('password')
    remember = True if request.form.get('remember') else False

    user = User.query.filter_by(email=email).first()

    # check if the user actually exists
    # take the user-supplied password, hash it, and compare it to the hashed password in the database
    if not user or not check_password_hash(user.password, password):
        flash('Please check your login details and try again.')
        return redirect(url_for('auth.login')) # if the user doesn't exist or password is wrong, reload the page

    # if the above check passes, then we know the user has the right credentials
    return redirect(url_for('main.profile'))

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² шаблон Π±Π»ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΌΠΈΠ³Π°ΡŽΡ‰Π΅Π΅ сообщСниС. Как ΠΈ Π² случаС с Ρ„ΠΎΡ€ΠΌΠΎΠΉ рСгистрации, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС нСпосрСдствСнно Π½Π°Π΄ Ρ„ΠΎΡ€ΠΌΠΎΠΉ:

project/templates/login.html

...
{% with messages = get_flashed_messages() %}
{% if messages %}
    <div>
        {{ messages[0] }}
    </div>
{% endif %}
{% endwith %}
<form method="POST" action="/login">

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π²Ρ…ΠΎΠ΄, Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎΠΊΠ° Π½Π΅ΠΊΡƒΠ΄Π° Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ. На этом этапС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Flask-Login для управлСния сСансами ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ, Π½Π°ΠΌ потрСбуСтся нСсколько Π²Π΅Ρ‰Π΅ΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Flask-Login. Для Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ UserMixin Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ модСль. UserMixin Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² модСль Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Flask-Login, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Flask-Login ΠΌΠΎΠ³ с Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

models.py

from flask_login import UserMixin
from . import db

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True) # primary keys are required by SQLAlchemy
    email = db.Column(db.String(100), unique=True)
    password = db.Column(db.String(100))
    name = db.Column(db.String(1000))

Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ сообщаСт Flask-Login, ΠΊΠ°ΠΊ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ, сохранСнному Π² Ρ„Π°ΠΉΠ»Π΅ cookie сСанса. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ create_app вмСстС с ΠΊΠΎΠ΄ΠΎΠΌ init для Flask-Login:

project/__init__.py

...
from flask_login import LoginManager
...
def create_app():
    ...
    db.init_app(app)

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    from .models import User

    @login_manager.user_loader
    def load_user(user_id):
        # since the user_id is just the primary key of our user table, use it in the query for the user
        return User.query.get(int(user_id))

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ login_user ΠΏΠ΅Ρ€Π΅Π΄ пСрСадрСсациСй Π½Π° страницу профиля для создания сСанса:

project/auth.py

from flask_login import login_user
from .models import User
...
@auth.route('/login', methods=['POST'])
def login_post():
    ...
    # if the above check passes, then we know the user has the right credentials
    login_user(user, remember=remember)
    return redirect(url_for('main.profile'))

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Flask-Login ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ /login. Когда всС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ страницу профиля.

Π¨Π°Π³ 10 β€” Π—Π°Ρ‰ΠΈΡ‚Π° страниц

Если вашС имя Π½Π΅ Anthony, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ вашС имя ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Нам Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π» имя Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π½Π°Ρ‡Π°Π»Π΅ слСдуСт Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ страницу, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для получСния Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ страницу ΠΏΡ€ΠΈ использовании Flask-Login, ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @login_requried ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠΌ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΎ Π½Π΅ даст ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ²ΡˆΠ΅ΠΌΡƒ Π²Ρ…ΠΎΠ΄ Π² систСму, ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ этот ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π²Ρ…ΠΎΠ΄, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ пСрСадрСсован Π½Π° страницу Π²Ρ…ΠΎΠ΄Π° согласно ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Flask-Login.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ с Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ @login_required, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ current_user Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ current_user прСдставляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ этого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ. НапримСр, current_user.email, current_user.password, current_user.name ΠΈ current_user.id Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ значСния, хранящиСся Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π²Ρ…ΠΎΠ΄ Π² систСму.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ Π΅Π³ΠΎ Π² шаблон. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ это имя ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

project/main.py

from flask_login import login_required, current_user
...
@main.route('/profile')
@login_required
def profile():
    return render_template('profile.html', name=current_user.name)

Π—Π°Ρ‚Π΅ΠΌ Π² Ρ„Π°ΠΉΠ»Π΅ profile.html ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ страницу для отобраТСния значСния name:

project/templates/profile.html

...
<h2>
  Welcome, {{ name }}!
</h2>

Когда ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° страницу профиля, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ отобраТаСтся имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ прСдставлСниС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ logout_user Π² ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π°. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @login_required, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π²Ρ…ΠΎΠ΄.

project/auth.py

from flask_login import login_user, logout_user, login_required
...
@auth.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('main.index'))

ПослС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ просмотра страницы профиля ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ сообщСниС ΠΎΠ± ошибкС. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Flask-Login Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΌΠΈΠ³Π°ΡŽΡ‰Π΅Π΅ сообщСниС, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ доступ ΠΊ страницС.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ помСстим Π² ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ выраТСния if, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылки, Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π”ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² систСму Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄ ΠΈΠ»ΠΈ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ПослС Π²Ρ…ΠΎΠ΄Π° Ρƒ Π½Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² свой ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· систСмы:

templates/base.html

...
<div>
    <a href="{{ url_for('main.index') }}">
        Home
    </a>
    {% if current_user.is_authenticated %}
    <a href="{{ url_for('main.profile') }}">
        Profile
    </a>
    {% endif %}
    {% if not current_user.is_authenticated %}
    <a href="{{ url_for('auth.login') }}">
        Login
    </a>
    <a href="{{ url_for('auth.signup') }}">
        Sign Up
    </a>
    {% endif %}
    {% if current_user.is_authenticated %}
    <a href="{{ url_for('auth.logout') }}">
        Logout
    </a>
    {% endif %}
</div>

ΠœΡ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ создали ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΡ‹ использовали Flask-Login ΠΈ Flask-SQLAlchemy для создания систСмы Π²Ρ…ΠΎΠ΄Π° Π² нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠœΡ‹ рассказали ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ посрСдством создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ сохранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ пароля ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ пароля ΠΈΠ· Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈ сравнив Π΅Π³ΠΎ с сохранСнным Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @login_required Π½Π° страницС профиля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π²Ρ…ΠΎΠ΄Π°.

Π’ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создали Π² этом ΡƒΡ‡Π΅Π±Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅, Π±ΡƒΠ΄Π΅Ρ‚ достаточно для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ с самого Π½Π°Ρ‡Π°Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± использовании Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Flask-User ΠΈΠ»ΠΈ Flask-Security, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ построСны Π½Π° Π±Π°Π·Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Flask-Login.

ΠšΠ»ΡŽΡ‡ΠΈ для автоматичСской установки SkyDNS Agent Π² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти SkyDNS

Для автоматичСской установки SkyDNS Π°Π³Π΅Π½Ρ‚Π° Π² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ сСти, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ установочный Ρ„Π°ΠΉΠ» Π°Π³Π΅Π½Ρ‚Π° с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ /S Π² ΠΊΠΎΠΌΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС (всС ΠΊΠ»ΡŽΡ‡ΠΈ рСгистрозависимыС). ΠšΠ»ΡŽΡ‡ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π°Π³Π΅Π½Ρ‚Π΅, начиная с вСрсии Π°Π³Π΅Π½Ρ‚Π° 2.6.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹:

  • /login=< login > — ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠ½Π° вашСго Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° (ΠΏΡ€ΠΈΠΌΠ΅Ρ€, skydns-agent-setup.exe /S /[email protected] /pass=qwerty).
  • /pass=< password > — ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ пароля (ΠΏΡ€ΠΈΠΌΠ΅Ρ€, skydns-agent-setup.exe /S /[email protected] /pass=qwerty). ΠšΠ»ΡŽΡ‡ΠΈ /login ΠΈ /pass ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ вмСстС. Если Π±ΡƒΠ΄Π΅Ρ‚ использован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС Π°Π³Π΅Π½Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· графичСский интСрфСйс.
  • /prof=< profile > — опция ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€, skydns-agent-setup.exe /S /[email protected] /pass=qwerty /prof=My profile). Если опция Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ имя профиля, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ Основной.
  • /conn=< interface > — опция позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ сСтСвом интСрфСйсС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ прописаны DNS нашСго сСрвиса (ΠΏΡ€ΠΈΠΌΠ΅Ρ€, skydns-agent-setup.exe /S /[email protected] /pass=qwerty /conn=Wi-Fi). На интСфСйс ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ защищаСтся, Π±ΡƒΠ΄Π΅Ρ‚ прописан адрСс DNS 127.0.0.1. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.
  • /pall — Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ссли Π½Π°Π΄ΠΎ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ всС сСтСвыС интСрфСйсы. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Π° ΠΊΠ»ΡŽΡ‡Π° /conn ΠΈ /pall, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ использован. Если Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½ΠΈ ΠΊΠ»ΡŽΡ‡ /conn, Π½ΠΈ /pall, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ сСтСвоС соСдинСниС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • /dupd — ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ автоматичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… вСрсий Π°Π³Π΅Π½Ρ‚Π°.
  • /darun — ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ автоматичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ графичСского интСрфСйса Π°Π³Π΅Π½Ρ‚Π° (ΠΈΠΊΠΎΠ½ΠΊΠ° Π°Π³Π΅Π½Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚Ρ€Π΅Π΅). Π­Ρ‚ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ Π½Π΅ влияСт Π½Π° запуск систСмного сСрвиса SkyDNS Π°Π³Π΅Π½Ρ‚Π°.
  • /D=< path > — ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ установки Π°Π³Π΅Π½Ρ‚Π°. Π­Ρ‚Π° опиця Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ послСднСй Π² строкС запуска инсталлятора ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ, Π΄Π°ΠΆΠ΅ Ссли Π² ΠΏΡƒΡ‚ΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹. (ΠΏΡ€ΠΈΠΌΠ΅Ρ€, skydns-agent-setup.exe /S /[email protected] /pass=qwerty /D=c:\program files (x86)\SkyDNS Agent). ΠŸΡƒΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ Π² Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅.
  • New! /nogui — Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ установку графичСского интСрфСйса. ΠŸΡ€ΠΈ Π΅Π³ΠΎ использовании Π±ΡƒΠ΄ΡƒΡ‚ установлСны всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π° dns-agent.exe. ΠŸΡ€ΠΈ использовании Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ (/[email protected] /pass=qwerty).Β 

ЗначСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ с ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ /prof=Мой ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ).

Beget.API. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сайтами. LTD Beget.

getList

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список сайтов. Если ΠΊ сайту ΠΏΡ€ΠΈΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Π½Ρ‹ Π΄ΠΎΠΌΠ΅Π½Ρ‹, Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
https://api.beget.com/api/site/getList?login=userlogin&passwd=password&output_format=json
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°
[
   {
      "id":"125",
      "path":"site.ru\/public_html",
      "domains":[
         {
            "id":"12345",
            "fqdn":"site.ru"
         }
      ]
   },
   {
      "id":"124",
      "path":"facebook.com\/public_html",
      "domains":[
 
      ]
   },
   {
      "id":"123",
      "path":"mysite\/public_html",
      "domains":[
 
      ]
   }
]

ID сайта ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

add

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ создаСт Π½ΠΎΠ²Ρ‹ΠΉ сайт с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • nameΒ — имя Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с сайтом (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, site.ru).
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/add?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"name":"site.ru"}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/add?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7B%22name%22%3A%22site.ru%22%7D
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°

ВозвращаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ выполнСния. Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с сайтом Π±ΡƒΠ΄Π΅Ρ‚Β name/public_html.

delete

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ удаляСт сайт. Если ΠΊ сайту Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Π½Ρ‹ Π΄ΠΎΠΌΠ΅Π½Ρ‹, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΠ½ΠΊΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ Π½Π΅Π³ΠΎ.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • idΒ — id сайта, Ρ‚ΠΈΠΏ int.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/delete?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"id":10}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/delete?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7B%22id%22%3A10%7D
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°

ВозвращаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ выполнСния.

linkDomain

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ»ΠΈΠ½ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½ ΠΊ сайту.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • domain_idΒ — id Π΄ΠΎΠΌΠ΅Π½Π°. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ id Π΄ΠΎΠΌΠ΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ domain/getList;Β 
  • site_idΒ — id сайта.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/linkDomain?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"domain_id":100,"site_id":10}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/linkDomain?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7B%22domain_id%22%3A100%2C%22site_id%22%3A10%7D
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°

ВозвращаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ выполнСния. ПослС выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сайт Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ 5-10 ΠΌΠΈΠ½ΡƒΡ‚.

unlinkDomain

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½ ΠΎΡ‚ сайта.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • domain_idΒ — id Π΄ΠΎΠΌΠ΅Π½Π°. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ id Π΄ΠΎΠΌΠ΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ domain/getList.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/unlinkDomain?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"domain_id":100}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/unlinkDomain?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7B%22domain_id%22%3A100%7D
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°

ВозвращаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ выполнСния.

freeze

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² сайта.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • idΒ — id сайта. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ id сайта ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ site/getList;
  • excludedPathsΒ — список ΠΏΡƒΡ‚Π΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ².
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/freeze?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"id": 100, "excludedPaths": ["tmp", "cache"]}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/freeze?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7B%22id%22%3A+100%2C+%22excludedPaths%22%3A+%5B%22tmp%22%2C+%22cache%22%5D%7D
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°

ВозвращаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ выполнСния. Π—Π°Π΄Π°Π½ΠΈΠ΅ помСщаСтся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ выполняСтся Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ 5-10 ΠΌΠΈΠ½ΡƒΡ‚ Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сайта.

unfreeze

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² сайта.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • idΒ — id сайта. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ id сайта ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ site/getList.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/unfreeze?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"id": 100}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/unfreeze?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7b%22id%22%3a+100%7d
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°

ВозвращаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ выполнСния. Π—Π°Π΄Π°Π½ΠΈΠ΅ помСщаСтся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ выполняСтся Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ 5-10 ΠΌΠΈΠ½ΡƒΡ‚ Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сайта.

isSiteFrozen

ОписаниС

ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ статус сайта — доступно Π»ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ².

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • site_idΒ — id сайта. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ id сайта ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ site/getList.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°
// input_data ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π½Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для наглядности
https://api.beget.com/api/site/isSiteFrozen?login=userlogin&passwd=password&input_format=json&output_format=json&input_data={"site_id": 100}

// ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π°, input_data Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ urlencode
https://api.beget.com/api/site/isSiteFrozen?login=userlogin&passwd=password&input_format=json&output_format=json&input_data=%7B%22site_id%22%3A+100%7D
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‚Π°
"status": "success",
"answer": {
		"status": "success",
		"result": true
}

Flask-Login — докумСнтация Flask-Login 0.4.1

Flask-Login обСспСчиваСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ сСансами для Flask. Он ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ…ΠΎΠ΄Π°, Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈ запоминания сСансов Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π‘ΡƒΠ΄Π΅Ρ‚:

  • Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² сСансС ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π° ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ.
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ просмотры Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вошСдшими (ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅Π΄ΡˆΠΈΠΌΠΈ) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.
  • УправляСт ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ слоТной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Β«Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня».
  • ΠŸΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ сСансы Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‚ ΠΊΡ€Π°ΠΆΠΈ похититСлями Ρ„Π°ΠΉΠ»ΠΎΠ² cookie.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° интСграция с Flask-Principal ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ·ΠΆΠ΅.

Однако это Π½Π΅ Ρ‚Π°ΠΊ:

  • ΠΠ°Π²ΡΠ·Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ хранСния. Π’Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  • Π—Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ OpenID ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, выходящих Π·Π° Ρ€Π°ΠΌΠΊΠΈ Β«Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½ ΠΈΠ»ΠΈ Π½Π΅Ρ‚Β».”
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ восстановлСния ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи.

Установка

УстановитС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ с pip:

 $ pip install flask-login
 

Настройка прилоТСния

НаиболСС Π²Π°ΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Flask-Login, являСтся LoginManager класс. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ для своСго прилоТСния Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² ваш ΠΊΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 login_manager = LoginManager ()
 

ДиспСтчСр Π²Ρ…ΠΎΠ΄Π° Π² систСму содСрТит ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈ Flask-Login Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΊΡƒΠ΄Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.

ПослС создания фактичСского ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° прилоТСния Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ для Π²ΠΎΠΉΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

 login_manager.init_app (ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
 

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Flask-Login ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСансы для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ установитС сСкрСтный ΠΊΠ»ΡŽΡ‡ Π² своСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΈΠ½Π°Ρ‡Π΅ Flask выдаст Π²Π°ΠΌ сообщСниС ΠΎΠ± ошибкС с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это. Π‘ΠΌ. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Flask ΠΏΠΎ сСансам. Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСкрСтный ΠΊΠ»ΡŽΡ‡.

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π£Π‘Π•Π”Π˜Π’Π•Π‘Π¬, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² Π Π°Π·Π΄Π΅Π» «Как ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ сСкрСтныС ΠΊΠ»ΡŽΡ‡ΠΈΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой собствСнный сСкрСтный ΠΊΠ»ΡŽΡ‡.НЕ Π˜Π‘ΠŸΠžΠ›Π¬Π—Π£Π™Π’Π• ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² user_loader . Π­Ρ‚ΠΎΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, хранящСгося Π² сСансС. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π·ΡΡ‚ΡŒ unicode ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. НапримСр:

 @ login_manager.user_loader
def load_user (user_id):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ User.get (user_id)
 

Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ НСт ( Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ), Ссли ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ нСдСйствитСлСн.(Π’ этом случаС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· сСанса, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒ.)

Π’Π°Ρˆ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс

Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для прСдставлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти свойства. ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

is_authenticated
Π­Ρ‚ΠΎ свойство Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ True , Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚.Π΅. ΠΎΠ½ΠΈ прСдоставили Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. (Волько Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ login_required .)
Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ
Π­Ρ‚ΠΎ свойство Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ True , Ссли это Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ — Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ свою ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись, Π° Π½Π΅ Π±Ρ‹Π»ΠΈ приостановлСно, ΠΈΠ»ΠΈ любоС условиС вашСго прилоТСния для отклонСния ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи. НСактивныС ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ записи Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠΉΡ‚ΠΈ Π² систСму (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±Π΅Π· принуТдСния).
is_anonymous
Π­Ρ‚ΠΎ свойство Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ True , Ссли это Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. (Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ вмСсто этого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ False .)
get_id ()
Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ unicode , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ этого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· user_loader ΠŸΠ΅Ρ€Π΅Π·Π²ΠΎΠ½ΠΈΡ‚Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ юникодом — Ссли ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ int ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² unicode .

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ UserMixin , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх этих свойств ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².(Однако это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ…ΠΎΠ΄Π° Π² систСму

ПослС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Ρ‹ Π²Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π² систСму с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ login_user функция.

НапримСр:

 @ app.route ('/ login', methods = ['GET', 'POST'])
def login ():
    # Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ класс для прСдставлСния ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π°ΡˆΠΈΡ…
    # Π΄Π°Π½Π½Ρ‹Π΅ клиСнтской Ρ„ΠΎΡ€ΠΌΡ‹. НапримСр, WTForms - это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая Π±ΡƒΠ΄Π΅Ρ‚
    # ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ это Π·Π° нас, ΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ LoginForm для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.
    form = LoginForm ()
    Ссли Ρ„ΠΎΡ€ΠΌΠ°.validate_on_submit ():
        # Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
        # ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ экзСмпляром вашСго класса `User`
        login_user (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ)

        flask.flash ('Π£ΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ Π² систСму.')

        next = flask.request.args.get ('ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ')
        # is_safe_url Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, бСзопасСн Π»ΠΈ URL для пСрСнаправлСния.
        # Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° http://flask.pocoo.org/snippets/62/.
        Ссли нС is_safe_url (далСС):
            Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ flask.abort (400)

        Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ flask.redirect (next ΠΈΠ»ΠΈ flask.url_for ('index'))
    возвратная ΠΊΠΎΠ»Π±Π°.render_template ('login.html', Ρ„ΠΎΡ€ΠΌΠ° = Ρ„ΠΎΡ€ΠΌΠ°)
 

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π’Ρ‹ Π”ΠžΠ›Π–ΠΠ« ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° . Если Π²Ρ‹ этого Π½Π΅ сдСлаСтС, вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ уязвимо для ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рСализация is_safe_url см. этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Flask.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ просто. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ зарСгистрированному ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ current_user прокси, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ доступСн Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шаблонС:

 {% Ссли current_user.is_authenticated%}
  ΠŸΡ€ΠΈΠ²Π΅Ρ‚, {{current_user.имя }}!
{% endif%}
 

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Ρ‹, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ login_required Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€:

 @ app.route ("/ настройки")
@login_required
def settings ():
    ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ
 

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π³ΠΎΡ‚ΠΎΠ² Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· систСмы:

 @ app.route ("/ logout")
@login_required
def logout ():
    logout_user ()
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ (Π³Π΄Π΅-Ρ‚ΠΎ)
 

Они Π²Ρ‹ΠΉΠ΄ΡƒΡ‚ ΠΈΠ· систСмы, ΠΈ всС Ρ„Π°ΠΉΠ»Ρ‹ cookie для ΠΈΡ… сСанса Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹.

Настройка процСсса Π²Ρ…ΠΎΠ΄Π° Π² систСму

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ login_required Π±Π΅Π· послС Π²Ρ…ΠΎΠ΄Π° Π² систСму Flask-Login выдаст сообщСниС ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ ΠΈΡ… Π½Π° Π²ΠΎΠΉΡ‚ΠΈ Π² просмотр.(Если прСдставлСниС Π²Ρ…ΠΎΠ΄Π° Π² систСму Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½ΠΎ с ошибкой 401.)

Имя ΠΆΡƒΡ€Π½Π°Π»Π° Π² прСдставлСнии ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСно ΠΊΠ°ΠΊ LoginManager.login_view . НапримСр:

 login_manager.login_view = "users.login"
 

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ отобраТаСтся сообщСниС ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π²ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² систСму, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этой страницС. ΠšΠΎΠΌΡƒ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сообщСниС, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ LoginManager.login_message :

 login_manager.login_message = u "Bonvolu Ensaluti por uzi tiun paĝon."
 

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ сообщСний, установитС LoginManager.login_message_category :

 login_manager.login_message_category = "информация"
 

Когда ΠΆΡƒΡ€Π½Π°Π» Π² прСдставлСнии ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π°, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² строка запроса, которая прСдставляСт собой страницу, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пытался ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Ссли USE_SESSION_FOR_NEXT True , страница сохраняСтся Π² сСансС ΠΏΠΎΠ΄ ΠΊΠ»ΡŽΡ‡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ .

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ процСсс, ΡƒΠΊΡ€Π°ΡΡŒΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ LoginManager.unauthorized_handler :

 @ login_manager.unauthorized_handler
def unauthorized ():
    # Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ a_response
 

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Ρ…ΠΎΠ΄ с использованиСм Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° запросов

Иногда Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π²Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ Π² систСму Π±Π΅Π· использования Ρ„Π°ΠΉΠ»ΠΎΠ² cookie, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ значСния ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ API, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° запроса. Π’ этих случаях Π²Π°ΠΌ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² request_loader . Π­Ρ‚ΠΎΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ вСсти сСбя Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ваш ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² user_loader , Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Запрос Flask вмСсто user_id.

НапримСр, для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° URL, Ρ‚Π°ΠΊ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ с использованиСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Authorization :

 @ login_manager.request_loader
def load_user_from_request (запрос):

    # сначала ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²ΠΎΠΉΡ‚ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ api_key url arg
    api_key = request.args.get ('api_key')
    Ссли api_key:
        user = User.query.filter_by (api_key = api_key) .first ()
        Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ:
            Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

    # Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π²ΠΎΠΉΡ‚ΠΈ Π² систСму, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±Π°Π·ΠΎΠ²ΡƒΡŽ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ
    api_key = request.headers.get ('Авторизация')
    Ссли api_key:
        api_key = api_key.replace ('Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ', '', 1)
        ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
            api_key = base64.b64decode (api_key)
        ΠΊΡ€ΠΎΠΌΠ΅ TypeError:
            ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ
        user = User.query.filter_by (api_key = api_key) .first ()
        Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ:
            Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

    # Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ None, Ссли ΠΎΠ±Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ вошли Π² систСму ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
    return None
 

Анонимных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ фактичСски Π½Π΅ вошСл Π² систСму, для current_user установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ AnonymousUserMixin .Он ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • is_active ΠΈ is_authenticated ΡΠ²Π»ΡΡŽΡ‚ΡΡ False
  • is_anonymous is True
  • get_id () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ НСт

Если Ρƒ вас Π΅ΡΡ‚ΡŒ особыС трСбования для Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π»ΠΈΠ±ΠΎ класс, Π»ΠΈΠ±ΠΎ factory), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ для LoginManager с:

 login_manager.anonymous_user = MyAnonymousUser
 

Помни мСня

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ свой Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, сСанс Flask удаляСтся. ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹ΡˆΠ΅Π» ΠΈΠ· систСмы. Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня» ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ случайноС выходят ΠΈΠ· систСмы ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π­Ρ‚ΠΎ НЕ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ пароля Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π²Ρ…ΠΎΠ΄Π° Π² систСму послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· систСмы.

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ

Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня» Π±Ρ‹Π²Π°Π΅Ρ‚ слоТно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Однако Flask-Login Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ — просто ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Remember = True Π² login_user Π²Ρ‹Π·ΠΎΠ².На ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±ΡƒΠ΄Π΅Ρ‚ сохранСн Ρ„Π°ΠΉΠ» cookie, Π° Π·Π°Ρ‚Π΅ΠΌ Flask-Login автоматичСски восстановит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· этого Ρ„Π°ΠΉΠ»Π° cookie, Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚ Π² сСанс. ВрСмя Π΄ΠΎ истСчСния срока дСйствия cookie ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ REMEMBER_COOKIE_DURATION ΠΈΠ»ΠΈ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ login_user . Π€Π°ΠΉΠ» cookie Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ ΠΎΡ‚ нСсанкционированного доступа, поэтому, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π² Π½Π΅Π³ΠΎ (Ρ‚.Π΅. вставляСт Ρ‡ΡƒΠΆΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ вмСсто своСго), Ρ„Π°ΠΉΠ» cookie просто Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚Ρ‹ΠΌ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π΅Π³ΠΎ Ρ‚Π°ΠΌ Π½Π΅ Π±Ρ‹Π»ΠΎ.

Π­Ρ‚ΠΎΡ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ обрабатываСтся автоматичСски.Однако Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ (ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½, Ссли вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ инфраструктура для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ бСзопасности Π²Π°ΡˆΠΈΡ… Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² cookie.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΆΠ΅Ρ‚ΠΎΠ½Ρ‹

ИспользованиС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² качСствС значСния Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ сСансы Π²Ρ…ΠΎΠ΄Π° Π² систСму. Один ΠΈΠ· способов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ это — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ вмСсто ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. НапримСр:

 @ login_manager.user_loader
def load_user (user_id):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ User.query.filter_by (Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ_ΠΈΠ΄ = ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ) .first ()
 

Π’ΠΎΠ³Π΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ get_id вашСго класса User Π²Π΅Ρ€Π½Π΅Ρ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ вмСсто основного ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

 def get_id (сам):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ unicode (self.alternative_id)
 

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ мСняСт свой ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Ρ‡Ρ‚ΠΎ обСспСчит ΠΈΡ… старыС сСансы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ пСрСстанут Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° id ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ … Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± этом ΠΊΠ°ΠΊ ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π‘Π²Π΅ΠΆΠΈΠ΅ Π»ΠΎΠ³ΠΈΠ½Ρ‹

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² систСму, Π΅Π³ΠΎ сСанс помСчаСтся ΠΊΠ°ΠΊ «свСТий», Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π½Π° этом сСансС. Когда ΠΈΡ… сСанс ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ ΠΈ ΠΎΠ½ΠΈ снова вошли Π² систСму с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° cookie Β«Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня», ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ «НСсвСТий». login_required Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ ΡΠ²Π΅ΠΆΠ΅ΡΡ‚ΡŒ, которая ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° страниц. Однако Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π΅Π»ΠΈΠΊΠ°Ρ‚Π½Ρ‹Π΅ дСйствия, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‡ΡŒΠ΅Π³ΠΎ-Ρ‚ΠΎ личная информация Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² систСму. (ДСйствия Π²Ρ€ΠΎΠ΄Π΅ измСнСния ΠΏΠ°Ρ€ΠΎΠ»ΡŒ всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° пароля, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ.)

fresh_login_required , Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вошСл Π² систСму in, Ρ‚Π°ΠΊΠΆΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΡ… Π»ΠΎΠ³ΠΈΠ½ Π±ΡƒΠ΄Π΅Ρ‚ свСТим. Если Π½Π΅Ρ‚, ΠΎΠ½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ ΠΈΡ… Π½Π° страница, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ввСсти свои ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ login_required , установив LoginManager.refresh_view , needs_refresh_message ΠΈ needs_refresh_message_category :

 login_manager.refresh_view = "ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ записи.ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ "
login_manager.needs_refresh_message = (
    u Β«Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ свою ΡƒΡ‡Π΅Ρ‚Π½ΡƒΡŽ запись, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ для доступа ΠΊ этой страницС».
)
login_manager.needs_refresh_message_category = "информация"
 

Или прСдоставив свой собствСнный ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ обновлСния:

 @ login_manager.needs_refresh_handler
def refresh ():
    # Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ a_response
 

Π§Ρ‚ΠΎΠ±Ρ‹ снова ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ сСанс ΠΊΠ°ΠΊ Π½ΠΎΠ²Ρ‹ΠΉ, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ confirm_login .

Настройки Ρ„Π°ΠΉΠ»ΠΎΠ² cookie

Π”Π΅Ρ‚Π°Π»ΠΈ Ρ„Π°ΠΉΠ»Π° cookie ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² настройках прилоТСния.

REMEMBER_COOKIE_NAME Имя Ρ„Π°ΠΉΠ»Π° cookie для хранСния Β«Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня». информация Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: Remember_token
REMEMBER_COOKIE_DURATION ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ истСчСния срока дСйствия cookie, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ datetime.timedelta ΠΈΠ»ΠΈ Ρ†Π΅Π»Ρ‹Π΅ сСкунды. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 365 Π΄Π½Π΅ΠΉ (1 нСвисокосный Π³ΠΎΠ΄ ΠΏΠΎ григорианскому ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€ΡŽ)
REMEMBER_COOKIE_DOMAIN Если cookie Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½Ρ‹, установитС здСсь Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° (Ρ‚.Π΅.Π΅. .example.com ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ cookie Π½Π° всСх ΠΏΠΎΠ΄Π΄ΠΎΠΌΠ΅Π½Ρ‹ example.com ). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: НСт
REMEMBER_COOKIE_PATH ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ cookie Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: /
REMEMBER_COOKIE_SECURE ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия cookie Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня» Π΄ΠΎ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ HTTPS). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: НСт
REMEMBER_COOKIE_HTTPONLY ΠŸΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сохранСниС Ρ„Π°ΠΉΠ»Π° cookie Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня». доступ осущСствляСтся клиСнтскими скриптами. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: Π›ΠΎΠΆΡŒ
REMEMBER_COOKIE_REFRESH_EACH_REQUEST Если установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True , cookie обновляСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·. запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ врСмя ΠΆΠΈΠ·Π½ΠΈ. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Flask’s SESSION_REFRESH_EACH_REQUEST . По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: Π›ΠΎΠΆΡŒ

Π—Π°Ρ‰ΠΈΡ‚Π° сСанса

Π₯отя пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ ваш Ρ‚ΠΎΠΊΠ΅Π½ Β«Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня» ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² cookie Π²ΠΎΡ€Ρ‹, cookie сСанса всС Π΅Ρ‰Π΅ уязвим.Flask-Login Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ сСанс Π·Π°Ρ‰ΠΈΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΡ€Π°ΠΆΡƒ сСансов Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ сСанса Π½Π° LoginManager ΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ конфигурация. Если ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ с basic , Π»ΠΈΠ±ΠΎ с strong . Ρ€Π΅ΠΆΠΈΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° LoginManager , установитС session_protection Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ "Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ" ΠΈΠ»ΠΈ "ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ" :

 login_manager.session_protection = "ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ"
 

Или, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ:

 login_manager.session_protection = НСт
 

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ Π² Β«Π±Π°Π·ΠΎΠ²ΠΎΠΌΒ» Ρ€Π΅ΠΆΠΈΠΌΠ΅ . Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прилоТСния, Π·Π°Π΄Π°Π² для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° SESSION_PROTECTION Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ None , Β«Π±Π°Π·ΠΎΠ²Ρ‹ΠΉΒ» , ΠΈΠ»ΠΈ Β«ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉΒ» .

Когда Π·Π°Ρ‰ΠΈΡ‚Π° сСанса Π°ΠΊΡ‚ΠΈΠ²Π½Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π² основном, бСзопасный Ρ…Π΅Ρˆ IP-адрСса ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π°Π³Π΅Π½Ρ‚). Если Ρƒ сСанса Π½Π΅Ρ‚ связанного ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, Ρ‚ΠΎΡ‚ сгСнСрированныС Π±ΡƒΠ΄ΡƒΡ‚ сохранСны.Если Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΈ ΠΎΠ½ совпадаСт с сгСнСрирован, Ρ‚ΠΎ запрос Π² порядкС.

Если ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ , ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° сСанс постоянный, Ρ‚ΠΎ сСанс Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ нСсвСТий, ΠΈ всС Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² систСму заставит ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. (ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ записи Ρ‚Π°ΠΌ, Π³Π΄Π΅ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эффСкт.)

Если ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ strong для нСпостоянного сСанса, Ρ‚ΠΎΠ³Π΄Π° вСсь сСанс (Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½, Ссли ΠΎΠ½ сущСствуСт) ΡƒΠ΄Π°Π»Π΅Π½ΠΎ.

ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ cookie сСанса для API

ΠŸΡ€ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· API Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ настройку Flask БСссионный Ρ„Π°ΠΉΠ» cookie. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ настраиваСмый интСрфСйс сСанса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пропускаСт сохранСниС. сСанс Π² зависимости ΠΎΡ‚ Ρ„Π»Π°Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ установили Π² запросС. НапримСр:

 ΠΈΠ· ΠΊΠΎΠ»Π±Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π½ΠΎΠΉ Π³
ΠΈΠ· flask.sessions import SecureCookieSessionInterface
ΠΈΠ· flask_login ΠΈΠΌΠΏΠΎΡ€Ρ‚ user_loaded_from_header

класс CustomSessionInterface (SecureCookieSessionInterface):
    "" "Π—Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ созданиС сСанса ΠΈΠ· запросов API."" "
    def save_session (self, * args, ** kwargs):
        Ссли g.get ('login_via_header'):
            Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅
        Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ super (CustomSessionInterface, self) .save_session (* args,
                                                                ** kwargs)

app.session_interface = CustomSessionInterface ()

@ user_loaded_from_header.connect
def user_loaded_from_header (self, user = None):
    g.login_via_header = Π’Π΅Ρ€Π½ΠΎ
 

Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ установку Ρ„Π°ΠΉΠ»Π° cookie сСанса Flask всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ аутСнтифицируСтся. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ваш header_loader .

Локализация

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ LoginManager ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ flash для отобраТСния сообщСний, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ трСбуСтся для Π²Ρ…ΠΎΠ΄Π° Π² систСму. Π­Ρ‚ΠΈ сообщСния Π½Π° английском языкС. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, установитС для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° localize_callback LoginManager Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ функция, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с этими сообщСниями ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π½Π° flash , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ тСкст . Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с сообщСниСм ΠΈ Π΅Π³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ. вмСсто этого Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ Π½Π° flash .

ДокумСнтация ΠΏΠΎ API

Π­Ρ‚Π° докумСнтация автоматичСски создаСтся ΠΈΠ· исходного ΠΊΠΎΠ΄Π° Flask-Login.

Настройка Π²Ρ…ΠΎΠ΄Π° Π² систСму

класс flask_login. LoginManager ( app = None , add_context_processor = True ) [источник]

Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния настроСк, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для Π²Ρ…ΠΎΠ΄Π° Π² систСму. ЭкзСмпляры ΠΈΠ· LoginManager — это , Π° Π½Π΅ , привязанныС ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ прилоТСниям, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ создайтС Π΅Π³ΠΎ Π² основной части вашСго ΠΊΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ привяТитС Π΅Π³ΠΎ ΠΊ своСму app Π² заводской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

setup_app ( app , add_context_processor = True ) [источник]

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ устарСл. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ LoginManager.init_app () вмСсто .

нСсанкционированный () [источник]

Π­Ρ‚ΠΎ вызываСтся, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ трСбуСтся Π²ΠΎΠΉΡ‚ΠΈ Π² систСму. Если Π²Ρ‹ зарСгистрируСтС ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² с LoginManager.unauthorized_handler () , Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  • Flash LoginManager.login_message ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.
  • Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠΈ, Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΎΠΊΠ½ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² систСму для Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠ»Π°Π½ с использованиСм blueprint_login_views . Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠΈ ΠΈΠ»ΠΈ прСдставлСниС Π²Ρ…ΠΎΠ΄Π° Π² систСму для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ blueprint Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ login_view .
  • ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ…ΠΎΠ΄Π° Π² систСму. (Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° доступа Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запросС строковая пСрСмСнная, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π°, Ссли ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ домашнСй страницы.Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² сСанс ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ , Ссли установлСн USE_SESSION_FOR_NEXT.)

Если LoginManager.login_view Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, ΠΎΠ½ просто вмСсто этого Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ HTTP 401 (НСавторизовано).

Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ ΠΈΠ· прСдставлСния ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ before / after_request, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ подСйствуСт.

needs_refresh () [источник]

Π­Ρ‚ΠΎ вызываСтся, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вошСл Π² систСму, Π½ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ повторная аутСнтификация, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡ… сСанс устарСл.Если Π²Ρ‹ зарСгистрируСтС ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² с needs_refresh_handler , Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

Если LoginManager.refresh_view Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ вмСсто этого просто Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ HTTP 401 (НСавторизовано).

Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ ΠΈΠ· прСдставлСния ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ before / after_request, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ подСйствуСт.

ΠžΠ±Ρ‰Π°Ρ конфигурация

user_loader ( ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ) [источник]

УстанавливаСт ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· сСанса.Π’ функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ устанавливаСтС, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ( unicode ) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ НСт , Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ сущСствуСт.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ( Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ) — ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π­Ρ‚Π° функция устарСла. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ LoginManager.request_loader () вмСсто этого.

УстанавливаСт ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· значСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°.УстановлСнная Π²Π°ΠΌΠΈ функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ НСт , Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ сущСствуСт.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ( Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ) — ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

Класс ΠΈΠ»ΠΈ заводская функция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½.

Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

login_view

Имя прСдставлСния для пСрСнаправлСния, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΠΉΡ‚ΠΈ Π² систСму. (Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ URL-адрСсом, Ссли ваш ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ внСшний ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.)

сообщСниС_Π²Ρ…ΠΎΠ΄Π°

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΈΠ³Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСнаправляСтся Π½Π° страницу Π²Ρ…ΠΎΠ΄Π°.

unauthorized_handler ( callback ) [источник]

Π­Ρ‚ΠΎ установит ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ срСди ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ login_required .Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ вмСсто Π΅Π³ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: callback ( callable ) — ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

needs_refresh ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ_просмотр

Имя прСдставлСния для пСрСнаправлСния, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ.

needs_refresh_message

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΈΠ³Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСнаправляСтся Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. страница.

needs_refresh_handler ( callback ) [источник]

Π­Ρ‚ΠΎ установит ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° needs_refresh , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ срСди ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ fresh_login_required . НС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ вмСсто Π΅Π³ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: callback ( callable ) — ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² для Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π²Ρ…ΠΎΠ΄Π° Π² систСму

flask_login. Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

ΠŸΡ€ΠΎΠΊΡΠΈ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

flask_login. login_fresh () [источник]

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True , Ссли Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π»ΠΎΠ³ΠΈΠ½ свСТий.

flask_login. login_user ( user , Remember = False , duration = None , force = False , fresh = True ) [источник]

ВыполняСт Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² систСму. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ фактичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Если Бвойство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ is_active Π›ΠΎΠΆΡŒ , ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΎΠΉΠ΄ΡƒΡ‚ Π² систСму Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ force Π½Π΅ True .

Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½Π΅Ρ‚ True , Ссли ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ, ΠΈ False , Ссли это Π½Π΅ удаСтся (Ρ‚.Π΅. ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½).

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:
  • ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ( ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ) — ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для Π²Ρ…ΠΎΠ΄Π° Π² систСму.
  • Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ( bool ) — слСдуСт Π»ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ послС истСчСния Π΅Π³ΠΎ сСанса. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π›ΠΎΠΆΡŒ .
  • Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ( datetime.timedelta ) — врСмя Π΄ΠΎ истСчСния срока дСйствия Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° cookie. Если НСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π² настройках.По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ НСт .
  • force ( bool ) — Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½, установка этого значСния Π½Π° True Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² любом случаС. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π›ΠΎΠΆΡŒ .
  • свСТий ( bool ) — установка этого значСния Π½Π° Π›ΠΎΠΆΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² систСму ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с сСансом ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ Π½Π΅ «свСТий». По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ True .
flask_login. logout_user () [источник]

ВыполняСт Π²Ρ‹Ρ…ΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· систСмы.(Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ фактичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.) Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ очиститС Ρ„Π°ΠΉΠ» cookie Β«Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ мСня», Ссли ΠΎΠ½ сущСствуСт.

flask_login. confirm_login () [источник]

УстанавливаСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ сСанс ΠΊΠ°ΠΊ свСТий. БСссии ΡƒΡΡ‚Π°Ρ€Π΅Π²Π°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° cookie.

Π—Π°Ρ‰ΠΈΡ‚Π° взглядов

flask_login. login_required ( func ) [источник]

Если Π²Ρ‹ украситС Π²ΠΈΠ΄ этим, это Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ вошли Π² систСму ΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ фактичСского прСдставлСния.(Если ΠΎΠ½ΠΈ Π½Π΅Ρ‚, ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² LoginManager.unauthorized .) ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 @ app.route ('/ сообщСниС')
@login_required
def post ():
    ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ
 

Если Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π°, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±Ρ‹Π» вошли Π² систСму, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

, Ссли нС current_user.is_authenticated:
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ current_app.login_manager.unauthorized ()
 

… ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΏΠΎ сути, являСтся ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ эта функция добавляСт ΠΊ вашим прСдставлСниям.

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ глобально ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΌ тСстировании.Для этого, Ссли пСрСмСнная ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прилоТСния LOGIN_DISABLED установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True , этот Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: func ( function ) — Ѐункция просмотра для ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΡ.
flask_login. fresh_login_required ( func ) [источник]

Если Π²Ρ‹ украситС Π²ΠΈΠ΄ этим, это Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π»ΠΎΠ³ΠΈΠ½ свСТий — i.Π΅. ΠΈΡ… сСанс Π½Π΅ Π±Ρ‹Π» восстановлСн ΠΈΠ· Β«Π·Π°ΠΏΠΎΠΌΠ½ΠΈ мСня» ΠΊΡƒΠΊΠΈ. ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ пароля ΠΈΠ»ΠΈ элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ этим, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ усилиям ΠΏΠΎΡ…ΠΈΡ‚ΠΈΡ‚Π΅Π»Π΅ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ² cookie.

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½, LoginManager.unauthorized () являСтся называСтся ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. Если ΠΎΠ½ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π½ΠΎ ΠΈΡ… сСанс Π½Π΅ fresh, вмСсто этого ΠΎΠ½ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ LoginManager.needs_refresh () . (Π’ этом Π’ этом случаС Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ LoginManager.refresh_view .)

ДСйствуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρƒ login_required () Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: func ( function ) — Ѐункция просмотра для ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΡ.

ΠŸΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

класс flask_login. UserMixin [источник]

Π­Ρ‚ΠΎ обСспСчиваСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Flask-Login ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚.

класс flask_login. AnonymousUserMixin [источник]

Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для прСдставлСния Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹

flask_login. login_url ( login_view , next_url = None , next_field = ‘next’ ) [источник]

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ URL-адрСс для пСрСнаправлСния Π½Π° страницу Π²Ρ…ΠΎΠ΄Π°. Если Ρ‚ΠΎΠ»ΡŒΠΊΠΎ login_view ΠΏΡ€ΠΈ условии, это просто Π²Π΅Ρ€Π½Π΅Ρ‚ для Π½Π΅Π³ΠΎ URL.Если ΡƒΠΊΠ°Π·Π°Π½ next_url , ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΈ этом ΠΊ строкС запроса Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ next = URL . Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ прСдставлСниС Π²Ρ…ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° этот URL. Flask-Login ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π½Π° ваш URL-адрСс для Π²Ρ…ΠΎΠ΄Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя хоста, установитС для хоста FORCE_HOST_FOR_REDIRECTS . Π­Ρ‚ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° внСшниС сайты, Ссли Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ запроса Host ΠΈΠ»ΠΈ X-Forwarded-For присутствуСт.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:
  • login_view ( str ) — имя прСдставлСния Π²Ρ…ΠΎΠ΄Π°.(Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ фактичСскоС URL-адрСс для Π²Ρ…ΠΎΠ΄Π° Π² систСму.)
  • next_url ( str ) — URL-адрСс для прСдставлСния Π²Ρ…ΠΎΠ΄Π° Π² систСму для пСрСнаправлСния.
  • next_field ( str ) — Π’ ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΠ»Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ URL-адрСс (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ .)

Π‘ΠΈΠ³Π½Π°Π»Ρ‹

Π‘ΠΌ. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Flask ΠΏΠΎ сигналам для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. сигналы Π² вашСм ΠΊΠΎΠ΄Π΅.

flask_login. user_logged_in

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² систСму. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ), Π΅ΠΌΡƒ пСрСдаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, вошСдшим Π² систСму.

flask_login. user_logged_out

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· систСмы. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ), Π΅ΠΌΡƒ пСрСдаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, выходящим ΠΈΠ· систСмы.

flask_login. user_login_confirmed

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ послС подтвСрТдСния Π²Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Π½ΠΎΠ²Ρ‹ΠΉ. (НСт ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π» Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² систСму.) Он Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ прилоТСния.

flask_login. user_unauthorized

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π΅Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π² LoginManager . Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ прилоТСния.

flask_login. user_needs_refresh

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π² LoginManager вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ needs_refresh . Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΡ€ΠΎΠΌΠ΅ прилоТСния.

flask_login. session_protected

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° срабатываСт Π·Π°Ρ‰ΠΈΡ‚Π° сСанса, ΠΈ сСанс Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ нСсвСТиС ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅. Никаких Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π»ΠΎΠ³ΠΈΠ½ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ | ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΠšΠ΅ΠΌΠ±Ρ€ΠΈΠ΄ΠΆΡΠΊΠΎΠΌΡƒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ

Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ взяты ΠΈΠ· корпусов ΠΈ ΠΈΠ· источников Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅.Π›ΡŽΠ±Ρ‹Π΅ мнСния Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ ΠΌΠ½Π΅Π½ΠΈΠ΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² Cambridge Dictionary, Cambridge University Press ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ°Ρ€ΠΎΠ².

КаТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для Π²Ρ…ΠΎΠ΄Π° ΠΈ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π·Ρ‹Π²Ρ‹.

Из

ВикипСдия