Skip to content

Веб-сайт для сбора данных. Пользователям оставившим данные о себе, будет отправлен email с результатами опроса.

Notifications You must be signed in to change notification settings

VCTR09/Data-Collector_WebApp

Repository files navigation

Bеб-приложение для сбора данных

ссылка на веб-сайт: link1

screen1


❇️ Содержание:


Веб-сайт для сбора данных о росте пользователей. Пользователям оставившим данные о себе (рост и адрес почты), будет отправлен email примерного содержания: "Приветствую, Ваш рост 187 см. Средний рост всех пользователей 183.0 см - рассчитано на основе данных 15 человек."

** Приложение создано на фреймворке Flask. Работает с базой данных PostGreSQL.

** Фронтенд - HTML и CSS. Бэкенд - Python.

Приложение принимает адрес электронной почты и рост (см) у посетителей сайта. Данные сохраняются в базу на сервере. Расчитывается средний рост всех людей в базе. Информация о росте пользователей и величине выборки отправляется на email, оставленный посетителем.

Фронтенд приложения

1. Создание html страницы.

** см. файл: templates/index.html; templates/success.html.

2. Работа над внешним видом страинц - создание CSS файла.

** см. файл: static/main.css.

Бэкенд приложения

1. Создание виртуального окружения.

Виртуальное окружение создается в начале, чтобы иметь доступ к версии Python без библиотек, модулей и всего, что не понадобится в работе над проектом.

pip install virtualenv

python3 -m venv virtual

** Установка Flask в виртуальном окружении:

virtual/bin/pip3 install flask (для mac)

** Запуск веб-сайта в виртуальном окружении:

virtual/bin/python3 app.py

2. Захват пользовательского ввода.

Импортируем класс 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, соответсвенно приложение запускается только из данного файла.

3. Создание таблицы в базе данных PostGreSQL.

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()

4. Хранение пользовательских данных в базе данных.

В функции 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!")

5. Отправка емэйла пользователю.

** см. файл 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)

6. Отправка пользователю статистических данных (средний рост и величина выборки).

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, так как это может привести к уязвимости сайта.

Вверх

About

Веб-сайт для сбора данных. Пользователям оставившим данные о себе, будет отправлен email с результатами опроса.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published