41

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

FakiNyan
Нє. Цей курс в них на шару.

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

42 Востаннє редагувалося frz (09.01.2021 22:36:54)

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

Ок, в мене працює CRUD на Flask + Postgres на основі вивченого за цим посиланням:
https://www.rithmschool.com/courses/fla … with-flask
Поки що без SQL Alchemy.

Все ок для:
- відображення існуючих записів з бд
- додавання нового запису.

Є зауваження до свого ж коду для редагування і видалення існуючого запису. Річ у тім, що нема зручного інтерфейсу для вибору який саме запис я хочу відредагувати або видалити.
Тому працює напів-вручну, потрібно в url додати в кінці номер запису: http://127.0.0.1:5000/record/4
Така конфігурація підійде найкраще для тих сценаріїв, коли наперед відома кількість записів в бд, наприклад для таблиць налаштувань це один запис або ж декілька, але кількість записів фіксована; тоді на сторінці де відображаються всі записи можна додати одне чи декілька захардкоджених посилань для редагування.

Також потрібно перехоплювати помилку про неіснуючий запис і відображати юзер-френдлі повідомлення, бо в url можна ввести будь-яке число.

Зараз буду проходити наступний розділ вже з SQL Alchemy, можливо там це якось вже передбачено.

43

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

frz написав:

Далі все пішло поки що добре, крок "Postgres із Flask" пройшов успішно
https://www.rithmschool.com/courses/fla … with-flask
Наступним кроком буде "SQL Alchemy із Flask"
https://www.rithmschool.com/courses/fla … with-flask

Єдине що я так і не подолав віртуальні середовища. Тобто спробував venv, однак так і не зрозумів що саме станеться, якщо не користуватися цим взагалі. Тобто що якщо я просто буду девелопити стейджинг в окремій фізичній папці, без використання venv чи virtualenvwrapper? Питання ламерське, однак відповідь не описана в туторіалі і думаю що буде швидше написати про це тут ніж ґуґлити (проблема що навіть не знаю як сформулювати вірно запитання).

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

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

44 Востаннє редагувалося frz (10.01.2021 01:05:25)

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

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

Отже, запитання таке.
Аплікація відображає всі записи, нехай їх сьогодні 3, а завтра може бути 10 чи скільки завгодно.

record1
record2
record3

Я можу зробити захардкоджені лінки на edit/delete внизу під цим виведеним списком, але їх буде лише три, а завтра це вже буде неактуально.

Тому шукаю можливість динамічного виведення записів з посиланнями на edit/delete у такому вигляді:

record1 - edit - delete
record2 - edit - delete
record3 - edit - delete

Якщо їх стане 5, то відповідно:

record1 - edit - delete
record2 - edit - delete
record3 - edit - delete
record4 - edit - delete
record5 - edit - delete

Як таке зробити? Таку можливість взагалі передбачено у Flask?

45

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

from app.models import <IM'Я КЛАСУ В КОТРІМ ОПИСАНА МОДЕЛЬ ДАННИХ> as Records

@app.route('/')
def explore():
    records = Records()
    """Тут ваш код """
    return render_template('index.html', records=records.items)

Далі в шаблоні

    {% for record in records %}
              <div><p>{{record.name}}><<!--тут описуєте посилання на ваші едіт і деліт--></p></div>#name я взяв зі стелі там повинна бути ім'я реальної колонки з бази даних
    {% endfor %}

Забігаючи вперед розумію що слідуючим питанням буде поділ видачі на сторінки тому все таки ще раз осмілюсь порекомендува о цей туторіал https://blog.miguelgrinberg.com/post/th … ello-world - хоча тут теж тема з базою даних здається в четвертому розділі а вивід лінків в циклі в восьмому.

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

46

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

Хороший спосіб очистки db в flasl-sqlalchemy
https://gist.github.com/vkotovv/6281951
Знадобиться для тестування бази данних.

47

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

pluszz написав:

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

ще одна причина (і часто - набагато вагоміша , аніж проблема засмічування) -
забезпечення комплекту необхідних версій різних бібліотек та модулів в рамках конкретного проекту.
/*
на новому проекті потрібен Python 3.8,  на іншому розробка продовжується на 3.5,  а на сапорті ще стоїть і працює 2.7
звісно - кожен Python живе зі своїм зоопарком бібліотек та модулів та з купою залежностей від тих чи інших версій

*/

і потрібно на одному компі нормально працювати з різноманітними наборами.

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

48 Востаннє редагувалося frz (11.01.2021 00:42:21)

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

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

Далі підняв віртуальний хост, встановив ssl сертифікат від Let's encrypt, запаролив сайт за допомогою /etc/apache2/.htpasswd

Поки що працює лише статичний index.html, працюю далі...

----

Upd: якогось дива не працює автоматичне (але вручну подолав) продовження сертифікату ssl з конфігурацією Flask:

AH00526: Syntax error on line 4 of /etc/apache2/sites-enabled/FlaskApp.conf:
Name duplicates previous WSGI daemon definition.

$ sudo less /etc/apache2/sites-enabled/FlaskApp.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAdmin admin@example.com
    WSGIDaemonProcess example.com python-path=/var/www/html/FlaskApp:/var/www/FlaskApp/FlaskApp/venv/lib/python3.6/site-packages
    WSGIProcessGroup example.com
    WSGIScriptAlias / /var/www/html/FlaskApp/flaskapp.wsgi
    <Directory /var/www/html/FlaskApp/FlaskApp/>
        Order allow,deny
        Allow from all
    </Directory>
    Alias /static /var/www/html/FlaskApp/FlaskApp/static
    <Directory /var/www/html/FlaskApp/FlaskApp/static/>
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =example.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

(справжній домен замінив на example.com)

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

49

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

Встановив postgres на vps, чомусь базі не сподобався сертифікат котрий вже існував раніше

2021-01-11 00:49:28.558 EET [18774] FATAL:  could not load server certificate file "/etc/ssl/certs/ssl-cert-snakeoil.pem": no start line
2021-01-11 00:49:28.558 EET [18774] LOG:  database system is shut down
pg_ctl: could not start server
Examine the log output.

Допомогло створення сертифікату з нуля - підказку знайшов в коментарі на stackoverflow, при цьому коментар ніяк не був позначений як вірний
https://stackoverflow.com/questions/314 … 6_31429416

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

50 Востаннє редагувалося frz (11.01.2021 06:10:23)

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

Додав інтеграцію з email. Є труднощі з відображенням одночасно поштових заголовків Subject: i To:
Зараз з цих двох заголовків відображається лише Subject. З більшістю поштових серверів проходить нормально, але є проблема з деякими, листи в такому вигляді просто не доставляються. Як це виправити?...

@app.route('/result', methods=["GET", "POST"])
def result():
    import smtplib, ssl
    if request.method == "POST":
        smtp_server = "127.0.0.1"
        port = 25
        sender_email = "user@example.com"
        receiver_domain = "@example.com"
        context = ssl.create_default_context()
        try:
            server = smtplib.SMTP(smtp_server,port)
            server.ehlo()
            server.ehlo()
            message_from_html = request.form['message_text']
            receiver_from_html = request.form['receiver_text'] + receiver_domain
            if message_from_html is None:
                server.sendmail(sender_email, receiver_from_html, 'message is empty')
            else:
                subject_text = 'some subject'
                message_from_html = 'Subject: {}\n\n{}'.format(subject_text, message_from_html + '\n\n-- \nsome footer 1\nsome footer 2)
                server.sendmail(sender_email, receiver_from_html, message_from_html)
        except Exception as e:
            print(e)
        finally:
            server.quit()
    return render_template('result.html')

----

Upd: якщо програміст з самого ранку за комп'ютером, це означає що він ще не лягав  *CRAZY*

51

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

а з якою метою робиться імпорт при отриманні запиту?
чому не зробити це на самому початку виконання аплікації?

@app.route('/result', methods=["GET", "POST"])
def result():
    import smtplib, ssl

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

Imports should be grouped in the following order:

    Standard library imports.
    Related third party imports.
    Local application/library specific imports.

You should put a blank line between each group of imports.

https://www.python.org/dev/peps/pep-0008/#imports

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

52

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

ping
Так, це потрібно пофіксити, дякую.

53

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

Знайшов як пофіксити поштові заголовки:
https://stackoverflow.com/a/57401680

54

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

Не розумію як перевіряти на допустимі символи в поштовій адресі ще на рівні html, щоб не передавати безґлузде значення в Python.

55

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

frz написав:

Не розумію як перевіряти на допустимі символи в поштовій адресі ще на рівні html, щоб не передавати безґлузде значення в Python.

оце?
https://developer.mozilla.org/uk/docs/W … nput/email

<label for="email">Enter your globex.com email:</label>

<input type="email" id="email"
       pattern=".+@globex.com" size="30" required>
Подякували: frz1

56 Востаннє редагувалося frz (11.01.2021 06:58:59)

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

ping
Ух-ох, скільки там корисного тексту... Насправді мені потрібно дозволяти лише латинський алфавіт і крапку; така полісі компанії. Мабуть серед того різноманіття валідацій є й те що мені потрібно. Однак варто піти поспати і потім продовжити.

57

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

запаролив сайт за допомогою /etc/apache2/.htpasswd

Воно страшенно діряве. Не відображає лише фонові малюнки і деякий текст. Але форма доступна, навіть якщо на формі введення пароля натиснути cancel  *FACEPALM*

58 Востаннє редагувалося ping (11.01.2021 07:12:47)

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

frz написав:

ping
Ух-ох, скільки там корисного тексту... Насправді мені потрібно дозволяти лише латинський алфавіт і крапку; така полісі компанії. Мабуть серед того різноманіття валідацій є й те що мені потрібно. Однак варто піти поспати і потім продовжити.

пишемо  паттерн під ці вимоги
https://developer.mozilla.org/uk/docs/W … il#pattern

тут можна на ходу перевірити:
https://regex101.com/

p.s.
і так - це не відміняє обов'язкової валідації даних на бекенді

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

59

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

frz написав:

запаролив сайт за допомогою /etc/apache2/.htpasswd

Воно страшенно діряве. Не відображає лише фонові малюнки і деякий текст. Але форма доступна, навіть якщо на формі введення пароля натиснути cancel  *FACEPALM*

Пофіксив за допомогою
https://www.digitalocean.com/community/ … untu-14-04
(розділ Configuring Access Control with .htaccess Files)

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

60 Востаннє редагувалося plusxx (24.02.2021 23:52:45)

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

frz написав:

Не розумію як перевіряти на допустимі символи в поштовій адресі ще на рівні html, щоб не передавати безґлузде значення в Python.

Я робив форми за допомгою розширення wtf-form  Flash WTF він має в собі валідатори а потім уже передавав їх в шаблон. WTF-form maє свої валідатори  і там легко додаються користувацькі.