ππ Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ LiveLib.ru Π½Π° Flask. Π§Π°ΡΡΡ 2: CRUD, IntegrityError ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ WTForms
Π Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ: ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π½Π°Π±ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ; ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΆΠ°ΡΠΈΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΡ ΠΎΠ±Π»ΠΎΠΆΠ΅ΠΊ Π΄ΠΎ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Pillow.
Π’ΡΠ΅ΡΠΈΠΉ ΡΡΠ°ΠΏ
Π Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΡΠΎΡΠΈΠ°Π»Π° ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΡΠΌΠ°ΠΌΠΈ WTForms, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ CRUD ΠΈ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ΄ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΈ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π΅ΡΡΡ Π·Π΄Π΅ΡΡ.
ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΎΡΠΌ WTForms
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° Π² Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΡΠΌΡ WTForms. ΠΡΠΈ ΡΠΎΡΠΌΡ Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ» ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ Π²Π²Π΅Π΄Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ . Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΠΎΡΠΌ Π·Π° ΡΡΠ΅Ρ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠΎΠ² ΡΠΎΠΆΠ΅ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΌΡ ΡΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠ·ΠΆΠ΅.
ΠΠ»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ Π΄Π²Π΅ ΡΠΎΡΠΌΡ β BookForm ΠΈ UpdateBook. ΠΠ΅ΡΠ²Π°Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ, Π²ΡΠΎΡΠ°Ρ β Π·Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠΈ. ΠΠ±Π»ΠΎΠΆΠΊΠΈ ΠΊΠ½ΠΈΠ³ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΊΠ°ΠΊ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎΡΠ»Π΅ β Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΠΌΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠΎΠ²:
- DataRequired β Π½Π΅ Π΄Π°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΌΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Π΅ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌ.
- Length(min=5, max=100) β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ Π² ΠΏΠΎΠ»Π΅ β 5 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ β 100.
- FileAllowed(['jpg', 'png']) β ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡ ΠΊ ΡΠΎΡΠΌΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ .jpg ΠΈ .png.
- NumberRange(min=1, max=5)]) β ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²Π²ΠΎΠ΄ ΠΎΡΠ΅Π½ΠΊΠΈ Π΄Π»Ρ ΠΊΠ½ΠΈΠ³ΠΈ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ 1 Π΄ΠΎ 5 Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ.
ΠΡΠΎΠΌΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠΎΠ², ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ:
ΠΡΠΎΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΆΠ΅ Π΅ΡΡΡ Π² Π±Π°Π·Π΅. ΠΠ΅Π· Π½Π΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ:
ΠΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ²ΡΠ·Π°Π½Π° Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ unique=True
ΡΡΠΎΠ»Π±ΡΠ° title
ΠΈ Π΅Π΅ ΠΏΡΠΎΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ, ΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ. ΠΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΌΡ ΡΠΎΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½ΠΈΠΆΠ΅ β ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ.
Π¨Π°Π±Π»ΠΎΠ½Ρ Π΄Π»Ρ ΡΠΎΡΠΌ
Π€ΠΎΡΠΌΠ°ΠΌ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π½ΡΠΆΠ½Ρ ΡΠ°Π±Π»ΠΎΠ½Ρ. ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ create.html ΠΈ edit.html. Π¨Π°Π±Π»ΠΎΠ½ create.html ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ²ΠΎΠ΄ ΠΎΡΠΈΠ±ΠΎΠΊ:
ΠΠ»Ρ Π²Π²ΠΎΠ΄Π° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ:
- class="form-control-label" β ΠΎΠ΄Π½ΠΎΡΡΡΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅;
- class="form-control-textarea" β ΠΌΠ½ΠΎΠ³ΠΎΡΡΡΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅;
- class="form-control-number" β Π²Π²ΠΎΠ΄ ΡΠΈΡΡ;
- class="form-control-file" β Π²ΡΠ±ΠΎΡ ΡΠ°ΠΉΠ»Π°.
Π ΡΠ°Π±Π»ΠΎΠ½Π΅ edit.html ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΠΌΡ, ΡΠΆΠ΅ Π²Π½Π΅ΡΠ΅Π½Π½ΠΎΠΉ Π² ΠΊΠ°ΡΡΠΎΡΠΊΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ, β ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ»ΠΎ ΠΏΡΠΎΡΠ΅ Π΅Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² ΡΠΎΡΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ edit
, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΎΠ½Π° Π½ΡΠΆΠ΅Π½ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ°ΠΊΡΠΎΡ β ΠΎΠ½ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ formhelpers.html. ΠΡΠΎΡ ΡΠ°ΠΉΠ» Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΠΏΠ°ΠΏΠΊΡ /templates Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ. Π ΡΠ°Π±Π»ΠΎΠ½Π΅ Π΄Π»Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΅ΡΡΡ Π±Π»ΠΎΠΊ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ
Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΡ
ΠΎΡ Flask ΠΈ SQLAlchemy (ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ WTForms):
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ°Π±Π»ΠΎΠ½. ΠΡΠ»ΠΈ Π²ΡΡΠ°Π²ΠΈΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ edit.html ΠΊΠΎΠ΄ ΠΈΠ· create.html, ΠΎΠ½ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ°ΡΡΠΎ Π΄Π»Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠ΄ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΡΠ°ΠΉΠ»Π΅. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠΎΡΠΌΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΠ° ΠΈΠ· _formhelpers.html ΠΏΡΠΎΡΡΠΎ Π² ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅Π»ΡΡ .
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΠΎΡΠΌ
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ°ΠΉΠ»Π΅ routes.py. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΈΠΌΠΏΠΎΡΡΠ° ΡΠΎΡΠΌ ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Pillow, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΆΠ°ΡΠΈΠ΅ ΠΎΠ±Π»ΠΎΠΆΠ΅ΠΊ ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Π² Π½ΡΠΆΠ½ΡΡ ΠΏΠ°ΠΏΠΊΡ uploads:
Π€Π»Π°ΡΠΊΡ ΡΠΎΠΆΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠΌΠΏΠΎΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ β flash, url_for ΠΈ redirect. Pillow Π½ΡΠΆΠ½Ρ ΠΌΠΎΠ΄ΡΠ»ΠΈ os ΠΈ secrets, Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ Π±Π°Π·Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ IntegrityError.
Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ±Π»ΠΎΠΆΠ΅ΠΊ ΠΊΠ½ΠΈΠ³ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
ΠΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΎΠ±Π»ΠΎΠΆΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°Π³ΡΡΠΆΠ΅Π½Π°, Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΏΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡ Π²ΡΡΠ΅ ΠΊΠΎΠ΄Ρ, Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΠΌΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Π² ΠΏΠ°ΠΏΠΊΡ uploads.
Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² ΡΠΎΡΠΌΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠΎΡΠΌΠ° Π½Π΅ Π±ΡΠ»Π° ΠΏΡΡΡΠΎΠΉ, ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ IntegrityError
β ΠΎΠ½Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π²ΠΎΠ΄ΠΈΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΆΠ΅ Π΅ΡΡΡ Π² Π±Π°Π·Π΅:
Π£Π΄Π°Π»ΠΈΡΡ ΠΊΠ°ΡΡΠΎΡΠΊΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΡΠΎΡΠ΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ:
ΠΠ»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ β ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΆΠ΅ Π΅ΡΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ . ΠΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² base.html, index.html, book.html, best.html ΠΈ thrillers.html ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ:
Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΡΡΡ:
Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ:
Π ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ:
ΠΠΊΡΠΏΠΎΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π±Π°Π·Ρ
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· Π½Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΡΠΌΠΈ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. Π€Π°ΠΉΠ» json, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΡΠΎΡΠΈΠ°Π»Π°, Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π½ΡΠΆΠ½ΠΎ Π²Π½Π΅ΡΡΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΡΠ°ΠΉΠ» ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ /reader/models.py ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ /reader/routes.py. Π‘Π½Π°ΡΠ°Π»Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠ»Π°ΡΡ Book
:
ΠΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Ρ. ΠΡΠ»ΠΈ Π½Π΅ Π½ΡΠΆΠ΅Π½ ID Π·Π°ΠΏΠΈΡΠΈ, ΠΈΠ»ΠΈ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΠΈΠ»ΠΈ Π΅ΡΠ΅ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ β ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ.
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΠΌΠΏΠΎΡΡ jsonify
ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° Π² /reader/routes.py:
Π ΡΠ°ΠΉΠ» __init__.py Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ app.config['JSON_AS_ASCII'] = False
β ΠΈΠ½Π°ΡΠ΅ jsonify Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ Π°Π±ΡΠ°ΠΊΠ°Π΄Π°Π±ΡΡ.
ΠΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ: Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:8000/export/, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π²ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π±Π°Π·Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠ»ΠΎΠ²Π°ΡΡ:
ΠΠ° ΡΡΠΎΠΌ ΡΠ°Π±ΠΎΡΠ° Π½Π°Π΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½Π°. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ SQLAlchemy Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΠ»Π° ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. Π Ρ ΠΎΡΡ SQLAlchemy β Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π²ΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ORM, Π΅Π΅ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ ΡΠ°ΠΌΠΎΠΉ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΎΠΉ, ΡΠ΅ΠΌ ΠΈ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ. ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ ΡΠΈΠ½Π°Π»ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΊΠΎΠ΄Π° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π·Π΄Π΅ΡΡ.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΡΠ΅ΠΌΠ΅
- ππ₯€ Flask Π·Π° ΡΠ°Ρ. Π§Π°ΡΡΡ 1: ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΠΉ ΡΠ°ΠΉΡ Π΄Π»Ρ GitHub Pages
- ππ₯€ Flask Π·Π° ΡΠ°Ρ. Π§Π°ΡΡΡ 2: Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌ ΡΠ°ΠΉΡ Π½Π° GitHub Pages
- πποΈ Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Python, SQLite ΠΈ SQLAlchemy