❇️ Содержание:
- Фронтенд
- Бэкенд
- 1. Создание виртуального окружения
- 2. Захват пользовательского ввода
- 3. Создание таблицы в базе данных PostGreSQL
- 4. Хранение пользовательских данных в базе
- 5. Отправка емэйла пользователю
- 6. Отправка пользователю статистических данных
- 7. Развертывание сайта на pythonanywhere.com
Веб-сайт для сбора данных о росте пользователей. Пользователям оставившим данные о себе (рост и адрес почты), будет отправлен email примерного содержания: "Приветствую, Ваш рост 187 см. Средний рост всех пользователей 183.0 см - рассчитано на основе данных 15 человек."
** Приложение создано на фреймворке Flask. Работает с базой данных PostGreSQL.
** Фронтенд - HTML и CSS. Бэкенд - Python.
Приложение принимает адрес электронной почты и рост (см) у посетителей сайта. Данные сохраняются в базу на сервере. Расчитывается средний рост всех людей в базе. Информация о росте пользователей и величине выборки отправляется на email, оставленный посетителем.
** см. файл: templates/index.html; templates/success.html.
** см. файл: static/main.css.
Виртуальное окружение создается в начале, чтобы иметь доступ к версии Python без библиотек, модулей и всего, что не понадобится в работе над проектом.
pip install virtualenv
python3 -m venv virtual
** Установка Flask в виртуальном окружении:
virtual/bin/pip3 install flask (для mac)
** Запуск веб-сайта в виртуальном окружении:
virtual/bin/python3 app.py
Импортируем класс Flask фреймфорка Flask в файле app.py:
from flask import Flask, render_template, request
** render_template - метод для отображения html-шаблонов. ** request - метод для доступа к http-запросу, отправляемому браузером и его чтения.
Создаем переменную app для хранения экземляра объекта:
app = Flask(name)
** name - специальная переменная, в качестве значения принимающая название Python скрипта.
Используем декоратор @app.route('/') для создания Домашней страницы.
URL по которому виден вебсайт (/ - Домашняя страница)
Создадим функцию, определяющую функционал веб-страницы:
@app.route("/")
def index():
return render_template("index.html")
** С помощью данной функции, Python имеет доступ к templates/index.html, и отображает файл index.html по адресу домашней страницы.
Используем новый декоратор и новую функцию, для создания страницы 'success':
@app.route("/success", methods=['POST'])
def success():
if request.method == 'POST':
email = request.form["email_name"] # Убедимся в получении POST запроса, так как пользователь может перейти на данный URL и другими способами.
height = request.form["height_name"]
print(email, height)
return render_template("success.html")
** При создании декоратора, по умолчанию используется метод GET. Во избежание ошибки 'Method Not Allowed', укажем нужный метод: methods=['POST']. Метод 'POST' нужен для передачи емэйла и роста пользователей на сервер.
Далее:
if name == "main": app.debug=True app.run()
** При запуске Python файла, Python присваивает файлу имя main. При импорте данного скрипта в другой файл, данному скрипту будет присвоено имя app.py, соответсвенно приложение запускается только из данного файла.
pip install psycopg2
pip install Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
Создание модели базы данных - таблица с колонками.
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://*******:********@localhost/height_collector'
db = SQLAlchemy(app)
class Data(db.Model):
__tablename__="data"
id=db.Column(db.Integer, primary_key=True)
email_=db.Column(db.String(120), unique=True)
height_=db.Column(db.Integer)
def __init__(self, email_, height_):
self.email_ = email_
self.height_ = height_
Команды в терминале:
python from app import db db.create_all()
В функции def success():
if db.session.query(Data).filter(Data.email_==email).count() == 0:
data = Data(email, height) # создание экземпляра объекта класса Data с двумя параметрами email_, height_
db.session.add(data) # для добавления строк в таблицу с помощью SQLAlchemy, обратимся к объекту SQLAlchemy (db)
db.session.commit() # метод commit класса session фиксирует изменения в базе данных
return render_template("success.html")
return render_template("index.html", text="Seems like we've got something from that email address already!")
** см. файл send_email.py.
import smtplib
from email.mime.text import MIMEText
def send_email(email, height):
from_email = "********@google.com"
from_password = "***********"
to_email = email
subject = "Height data"
message = "Hey there, your height is <strong>%s</strong>." % height
msg = MIMEText(message, 'html')
msg['Subject'] = subject
msg['To'] = to_email
msg['From'] = from_email
server = smtplib.SMTP('smtp.google.com', 587)
server.ehlo()
server.starttls()
server.login(from_email, from_password)
server.send_message(msg)
from sqlalchemy.sql import func # average function
average_height = db.session.query(func.avg(Data.height_)).scalar()
average_height = round(average_height, 1)
count = db.session.query(Data.height_).count()
send_email(email, height, average_height)
def send_email(email, height, average_height):
message = "Hey there, your height is <strong>%s</strong>. Average height of all is <strong>%s</strong> and that is calculated out <strong>%s</strong> of people." % (height, average_height, count)
7. Развертывание сайта на pythonanywhere.com:
Pythonanywhere как и Heroku позволяет бесплатно развертывать Flask-приложения.
Важно:
if __name__ == "__main__":
app.run(debug=True)
** При развертывании сайта, в файле app.py, True заменим на False, чтобы не показывать посетителям ошибки Python, так как это может привести к уязвимости сайта.