1 Востаннє редагувалося pluszz (04.01.2021 04:56:16)

Тема: Рецепти для Flask

Я приступив до поглибленого вивчення Flask. Вирішив створити тему конспект, в котрій буду писати різні рецепти котрих немає в Flask Mega Tutorial Мігеля Грінберга. Тема створена щоб краще засвоїти матеріал, а заодно щоб полегшити життя людям, котрі можливо будуть гуглити питання по темі українською мовою.

Проста розмітка тексту в блогах та на форумах написаних на Flask

Я знайшов три способи зробити розмітку тексту в блозі. Можливо є більше, якщо хтось знає діліться.

1)Найпростіший це дозволити виводити html-розмітку зроблену користувачами.
Робиться це дуже просто. В шаблоні сторінки в місці де виводиться текст поста додати параметр safe.

    {{ post.body | safe }} 

Це дуже поганий спосіб оскільки хтось в коментарях зможе ввести

 <script>alert("Пішли всі на хутор");</script> 

Ну і ви розумієте що буде кожного разу при відкриванню сторінки. Також хтось з користувачів може використати теги на зразок <blink></bkink>, результат використання котрого в різних браузерах не передбачуваний.
Коротше кажучи використання цього способу оправдовується лише тим, що він не потребує додаткових бібліоте. Цей варіант можливий до використання лише на якихось локальних ресурсах де всі свої.

2)Розмітка з бібліотекою bbcode

from flask import Flask
from flask import render_template

import bbcode

app = Flask(__name__)

@app.route('/<name>/')
def hello_world(name):
    bb_user = bbcode.render_html('[b]' + name + '[/b]')
    return render_template('index.html',
                           user=bb_user)

if __name__ == "__main__":
    app.run()

Хороший спосіб у мене на тестовому сервері-Flask все було круто. Але коли я задеплоїв додаток на Heroku воно незахотіло працювати і постійно крашилося. Навіть не знаю в чому вина, в якихось механізмах Heroku чи криворукості виконавця.
Тому я продовжив процес гугління для пошуку бібліотеки котра б помогла мені подружити Heroku, Flask і bbcode.

3) bbcode з бібліотекою postmarkup
Більше про бібліотеку можна дізнатись на сайті розробника і тут
Все дуже просто і зрозуміло:

import postmarkup

markup = postmarkup.PostMarkup().default_tags()
bbcode = "[b]Hello, World![/b]"

print markup.render_to_html(bbcode)

Оскільки в своїй програмі я не збирався додавати можливість редагування старих постів і цитат, вирішив зберігати в базі данних  вже готовий html, щоб лишній раз не ганяти парсер. Cпрощено то виглядає так

...
form = PostForm()#форма вводу тексту на основі wtforms котра передається в шаблон
post = Post(body=render_bbcode(form.post.data), 
            author=current_user,language=language)#Получаєм текст повідомлення, ім'я користувача, і мову 
db.session.add(post)#передаєм все в базу даних
db.session.commit()#коміт
...

А в шаблоні треба знову задати параметр safe

    {{ post.body | safe }} 

Можете не переживати, вкинути злодійський скрипт на ваш сайт не зможуть, postmarkup якось сам знешкоджує HTML теги введені користувачами і повертає його як звичайний текст скоріше всього просто все екранує, хоча я чесно не перевіряв.

Якщо ж треба надати можливість редагувати повідомлення то треба навпаки зберігати повідомлення з тегами bbcode і рендерити його перед передачею в шаблон. Або описувати цю дію в самім шаблоні, що в моїм випадку являється єдиним доступним варіантом, оскільки  вивід постів в моїм шаблоні проходить в циклі.

4)Можна написати свій парсер розмітки тексту.

    Для роботи знадобиться бібліотека re фантазія, нерви та вільний час.



P.S Всі зауваження і конструктивна критика приймаються.

2

Re: Рецепти для Flask

Ви розвиваєте український інтернет, дякую.
І розкручуєте форум, додаючи таку нову тематику, як Flask.


Це все корисно для тих, хто вже знає трохи Flask.
Але поясність будь-ласка, у чому переваги саме Flask, бо зі сторони він виглядає трохи не потрібним на фоні інших популярних речей, і тому здається, особливо із Вашого посту, що працювати із ним важко, а значить щоб не тратити сили, час та гроші попусту, занятися чимось іншим (це для тих, хто ще не вчив Flask).
Або ж, якщо він незамінна річ - тоді доведеться повозитися. Може й автора попросити, щоб функціоналу додав.
Ну а для тих, кому не зручно переучуватися з Flask на щось інше, ця тема - як золота цеглина, та ще й українською.

3

Re: Рецепти для Flask

Якщо для автора це актуально, то напишіть як зробити простий CRUD, скажімо у зв'язці з Postgres. Якраз вступив в інтимний контакт з django з цього приводу і це не зовсім тривіально для повного початківця у фронтенд. Можливо, у Flask це простіше...

4

Re: Рецепти для Flask

frz написав:

Якщо для автора це актуально, то напишіть як зробити простий CRUD, скажімо у зв'язці з Postgres. Якраз вступив в інтимний контакт з django з цього приводу і це не зовсім тривіально для повного початківця у фронтенд. Можливо, у Flask це простіше...

Я ніколи не користувався Django та і в Flask  можна сказати теж являюсь новачком.  Особисто я поки що пробував працювати лише з flask_sqlalchemi. Для міграцій використовував flask_migrate. Більше про це можна прочитати у цього дядька як намене це дуже гарний і простий спосіб. Крім того я на гуглив що можна використовувати sqlalchemy разом з django кажуть що вона краща від Django ORM.

5

Re: Рецепти для Flask

pluszz написав:

можна використовувати sqlalchemy разом з django кажуть що вона краща від Django ORM.

не  знаю як зараз, але кілька років тому відкрутти рідну orm від джанго було досить складно.
але треба вийти на дуже серйозні навантаження і складність запитів, щоб взагалі над цим замислюватися.
в 99.5%  випадків рідна ОРМ чудово справлятиметься з потребами.
а для якихось окремих складних випадків можна ж і напряму зробити запит на чистому SQL чи  написати свою процедуру в базі і смикати її.

Подякували: pluszz1

6

Re: Рецепти для Flask

frz написав:

Якщо для автора це актуально, то напишіть як зробити простий CRUD, скажімо у зв'язці з Postgres. Якраз вступив в інтимний контакт з django з цього приводу і це не зовсім тривіально для повного початківця у фронтенд. Можливо, у Flask це простіше...

отут не зовсім зрозумів.
якщо використовувати джанго разом з рідним ОРМ - (а початківцю варто саме так і робити) - то яка різниця що там за база - постгре чи скюлайт чи ще що. з цим розбиратиметься ОРМ.

7

Re: Рецепти для Flask

Нема різниці яка саме база, це так для прикладу.
То чи хтось може дати посилання на толковий hello world для CRUD на базі django + orm?

8 Востаннє редагувалося pluszz (05.01.2021 16:57:09)

Re: Рецепти для Flask

ping написав:
pluszz написав:

можна використовувати sqlalchemy разом з django кажуть що вона краща від Django ORM.

не  знаю як зараз, але кілька років тому відкрутти рідну orm від джанго було досить складно.
але треба вийти на дуже серйозні навантаження і складність запитів, щоб взагалі над цим замислюватися.
в 99.5%  випадків рідна ОРМ чудово справлятиметься з потребами.
а для якихось окремих складних випадків можна ж і напряму зробити запит на чистому SQL чи  написати свою процедуру в базі і смикати її.

Я взагалі не знаю як працює django orm. Просто пан frz написав що в django важко працювати з базою даних. Тому я, й написав про sqlalchemy бо з нею точно легко.

9

Re: Рецепти для Flask

pluszz написав:
ping написав:
pluszz написав:

можна використовувати sqlalchemy разом з django кажуть що вона краща від Django ORM.

не  знаю як зараз, але кілька років тому відкрутти рідну orm від джанго було досить складно.
але треба вийти на дуже серйозні навантаження і складність запитів, щоб взагалі над цим замислюватися.
в 99.5%  випадків рідна ОРМ чудово справлятиметься з потребами.
а для якихось окремих складних випадків можна ж і напряму зробити запит на чистому SQL чи  написати свою процедуру в базі і смикати її.

Я взагалі не знаю як працює django orm. Просто пан frz написав що в django важко працювати з базою даних. Тому я, й написав про sqlalchemy бо з нею точно легко.

я б сказав, що швидше у фласку важко - треба руками робити комміти
в джанго це все зроблять за тебе, рівень абстракції вищий, але і гнучкості чуть менше.
ну але відчути різницю - то треба добре  попрацювати зі складними запитами на великих об'ємах. що явно виходить за межі простого ту-ду чи інтернет магазину рівня нижче розетки.

10

Re: Рецепти для Flask

в django важко працювати з базою даних

Трохи не так - мені з нульовим досвідом у фронтенд складно почати кодити CRUD будь-де, тому шукаю опис hello world рівня "для пастухів овець" і байдуже що це буде, чи django чи Flask, головне щоб у зв'язці з будь-якою базою. Можливо, я просто погано шукав поки що.

11

Re: Рецепти для Flask

frz написав:

в django важко працювати з базою даних

Трохи не так - мені з нульовим досвідом у фронтенд складно почати кодити CRUD будь-де, тому шукаю опис hello world рівня "для пастухів овець" і байдуже що це буде, чи django чи Flask, головне щоб у зв'язці з будь-якою базою. Можливо, я просто погано шукав поки що.

Пане frz дублюю посилання https://blog.miguelgrinberg.com/post/th … v-database то і є фактично Hello World для flask+sqlalchemy. Для django не підкажу бо в нім поки що не шарю ані трошки. Я поцім посиланню створив навчальний  додаток котрий в мене на ноуті працював з sqlite а потім закинув на хероку і підключив Postgres фактично не міняючи коду.

Подякували: frz1

12 Востаннє редагувалося frz (05.01.2021 17:55:12)

Re: Рецепти для Flask

pluszz
Дякую, спробуйю сьогодні чи найближчим часом пройти цей туторіал.
В мене одразу ж запитання (дуже ламерське) :
1) Flask піднімається на 5000 порті, чи можливо зробити натомість 80 порт;
2) якщо "1" технічно можливо в принципі, однак на цьому хості вже висить апач на тому ж 80 порті, то чи можна щоб існуючий веб-сервер працював як і досі, а Flask відзивався за іншим лінком, наприклад localhost/flask чи щось схоже.

13

Re: Рецепти для Flask

frz написав:

pluszz
Дякую, спробуйю сьогодні чи найближчим часом пройти цей туторіал.
В мене одразу ж запитання (дуже ламерське) :
1) Flask піднімається на 5000 порті, чи можливо зробити натомість 80 порт;
2) якщо "1" технічно можливо в принципі, однак на цьому хості вже висить апач на тому ж 80 порті, то чи можна щоб існуючий веб-сервер працював як і досі, а Flask відзивався за іншим лінком, наприклад localhost/flask чи щось схоже.

1.фласк піднімається на тому порті, на якому йому скажете. 5000 - за замовчуванням

2. ну то ваш апач мав би розрулювати на які веб-аплікації що спрямовувати. це і є його завдання.

Подякували: frz1

14

Re: Рецепти для Flask

frz написав:

в django важко працювати з базою даних

Трохи не так - мені з нульовим досвідом у фронтенд складно почати кодити CRUD будь-де, тому шукаю опис hello world рівня "для пастухів овець" і байдуже що це буде, чи django чи Flask, головне щоб у зв'язці з будь-якою базою. Можливо, я просто погано шукав поки що.

The Django Book

Welcome to the online version of The Django Book, a free book about the Django Web framework for the Python programming language.
https://django-book.readthedocs.io/en/latest/

Подякували: frz, pluszz2

15

Re: Рецепти для Flask

ping написав:

2. ну то ваш апач мав би розрулювати на які веб-аплікації що спрямовувати. це і є його завдання.

Ок, в такому випадку потрібно ще розібратися, як подружити одночасно апач і фласк на тому ж порті і чи це в принципі можливо. Поки що виглядає так, що на хості піднято умовно два веб-сервери.

16

Re: Рецепти для Flask

frz написав:

pluszz
Дякую, спробуйю сьогодні чи найближчим часом пройти цей туторіал.
В мене одразу ж запитання (дуже ламерське) :
1) Flask піднімається на 5000 порті, чи можливо зробити натомість 80 порт;
2) якщо "1" технічно можливо в принципі, однак на цьому хості вже висить апач на тому ж 80 порті, то чи можна щоб існуючий веб-сервер працював як і досі, а Flask відзивався за іншим лінком, наприклад localhost/flask чи щось схоже.

Щоб поміняти порт тре запустити flask вказавши потрібний порт типу так

flask run --host=127.0.0.23 --port=5001

. Але скажу так що в мене при спробі змінити порт на 80сервер упав а при спробі поміняти на 5001 перший все запрацювало добре. В інтернетах пишуть що Apache треба зупинити. А ще я вам скажу що  я натільки ламер що мені це питання навіть ніколи в голову не приходило.

17

Re: Рецепти для Flask

pluszz

flask run --host=127.0.0.23 --port=5001

А як його потім на проді запускати разом зі стартом системи, щоб не робити це вручну? В принципі, я можу це зробити через кастомний старт-ап скрипт в убунті, також прикрутити до тулзи monit щоб перевіряло чи доступний порт і рестартувати аплікацію якщо недоступний. Чи можливо є якісь штатні засоби?

18

Re: Рецепти для Flask

frz написав:
ping написав:

2. ну то ваш апач мав би розрулювати на які веб-аплікації що спрямовувати. це і є його завдання.

Ок, в такому випадку потрібно ще розібратися, як подружити одночасно апач і фласк на тому ж порті і чи це в принципі можливо. Поки що виглядає так, що на хості піднято умовно два веб-сервери.

не розумію - що там у Вас робить апач, але йому треба сказати, що при отриманні на localhost/flask:80  кидати запит на localhost:5000 отримати респонс і повернути його.

тобто - саме в цьому і полягає робота веб-сервера (одна з) - приймати купу запитів на host1, host2,  host_n які всі сидять на одному IP і роздавати їх на локальні аплікації

19

Re: Рецепти для Flask

що там у Вас робить апач

Там в мене живе вся статика, яку очевидно доведеться мігрувати на Flask/django.

саме в цьому і полягає робота веб-сервера (одна з) - приймати купу запитів на host1, host2,  host_n які всі сидять на одному IP і роздавати їх на локальні аплікації

В цій частині я не ламер, а просунутий юзер (або ж адмін-початківець). Принаймні знаю як на апачі підняти віртуальні хости, налаштувати https. А от як дозволити співіснувати апачу зі статикою і Flask/django, та й чи це взагалі можливо - ще належить з'ясувати.

20

Re: Рецепти для Flask

frz написав:

що там у Вас робить апач

Там в мене живе вся статика, яку очевидно доведеться мігрувати на Flask/django.

саме в цьому і полягає робота веб-сервера (одна з) - приймати купу запитів на host1, host2,  host_n які всі сидять на одному IP і роздавати їх на локальні аплікації

В цій частині я не ламер, а просунутий юзер (або ж адмін-початківець). Принаймні знаю як на апачі підняти віртуальні хости, налаштувати https. А от як дозволити співіснувати апачу зі статикою і Flask/django, та й чи це взагалі можливо - ще належить з'ясувати.

апач має роздавати всю статику сам. і тільки запити до веб-аплікації спрямовувати на неї.
принаймі nginx саме так робить, то ж апач  мав би діяти аналогічно

при цьому відключається обробка статики на рівні джанги