Re: Рецепти для Flask
FakiNyan
Нє. Цей курс в них на шару.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Python → Рецепти для Flask
Сторінки Попередня 1 2 3 4 5 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
FakiNyan
Нє. Цей курс в них на шару.
Ок, в мене працює 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, можливо там це якось вже передбачено.
Далі все пішло поки що добре, крок "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 а для решти він не потрібний тоді нашо він вам в основній системі ви встановлюєто цого лише в віртуальнім середовищі котре використовуєте для вашого проекту.
Туторіал, котрим я користуюся, поки що не відповів на моє запитання щодо редагування/видалення довільних записів; не впевнений що далі це буде описано, бо вже тема пішла в бік міграції, 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?
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 - хоча тут теж тема з базою даних здається в четвертому розділі а вивід лінків в циклі в восьмому.
Хороший спосіб очистки db в flasl-sqlalchemy
https://gist.github.com/vkotovv/6281951
Знадобиться для тестування бази данних.
Віртуальні середовища для того щоб не засмічувати систему не потрібними пакетами. Допустим для якогось проекту вам потрібний пакет beautifulsoup а для решти він не потрібний тоді нашо він вам в основній системі ви встановлюєто цого лише в віртуальнім середовищі котре використовуєте для вашого проекту.
ще одна причина (і часто - набагато вагоміша , аніж проблема засмічування) -
забезпечення комплекту необхідних версій різних бібліотек та модулів в рамках конкретного проекту.
/*
на новому проекті потрібен Python 3.8, на іншому розробка продовжується на 3.5, а на сапорті ще стоїть і працює 2.7
звісно - кожен Python живе зі своїм зоопарком бібліотек та модулів та з купою залежностей від тих чи інших версій
*/
і потрібно на одному компі нормально працювати з різноманітними наборами.
Інтимно поспілкувався впродовж останніх 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)
Встановив 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
Додав інтеграцію з 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: якщо програміст з самого ранку за комп'ютером, це означає що він ще не лягав
а з якою метою робиться імпорт при отриманні запиту?
чому не зробити це на самому початку виконання аплікації?
@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
Знайшов як пофіксити поштові заголовки:
https://stackoverflow.com/a/57401680
Не розумію як перевіряти на допустимі символи в поштовій адресі ще на рівні html, щоб не передавати безґлузде значення в Python.
Не розумію як перевіряти на допустимі символи в поштовій адресі ще на рівні html, щоб не передавати безґлузде значення в Python.
оце?
https://developer.mozilla.org/en-US/doc … nput/email
<label for="email">Enter your globex.com email:</label>
<input type="email" id="email"
pattern=".+@globex.com" size="30" required>
ping
Ух-ох, скільки там корисного тексту... Насправді мені потрібно дозволяти лише латинський алфавіт і крапку; така полісі компанії. Мабуть серед того різноманіття валідацій є й те що мені потрібно. Однак варто піти поспати і потім продовжити.
запаролив сайт за допомогою /etc/apache2/.htpasswd
Воно страшенно діряве. Не відображає лише фонові малюнки і деякий текст. Але форма доступна, навіть якщо на формі введення пароля натиснути cancel
ping
Ух-ох, скільки там корисного тексту... Насправді мені потрібно дозволяти лише латинський алфавіт і крапку; така полісі компанії. Мабуть серед того різноманіття валідацій є й те що мені потрібно. Однак варто піти поспати і потім продовжити.
пишемо паттерн під ці вимоги
https://developer.mozilla.org/en-US/doc … il#pattern
тут можна на ходу перевірити:
https://regex101.com/
p.s.
і так - це не відміняє обов'язкової валідації даних на бекенді
запаролив сайт за допомогою /etc/apache2/.htpasswd
Воно страшенно діряве. Не відображає лише фонові малюнки і деякий текст. Але форма доступна, навіть якщо на формі введення пароля натиснути cancel
Пофіксив за допомогою
https://www.digitalocean.com/community/ … untu-14-04
(розділ Configuring Access Control with .htaccess Files)
Не розумію як перевіряти на допустимі символи в поштовій адресі ще на рівні html, щоб не передавати безґлузде значення в Python.
Я робив форми за допомгою розширення wtf-form Flash WTF він має в собі валідатори а потім уже передавав їх в шаблон. WTF-form maє свої валідатори і там легко додаються користувацькі.