ОТЧЕТ ПО ПРОИЗВОДСТВЕННОЙ
ПРАКТИКЕ
Принял отчет:
_к.э.н., доцент Е.В. Ефимова_ ______________
ФИО подпись
Оценка: ______________
Ростов-на-Дону, 2021
Содержание
Введение……………………………………………………………………………………….
1 Теоритическое задание……………………………………………………………………
Заключение……………………………………………………………………………………
1 Техническое задание
1.2.2 Прототипирование(Prototyping)
Важный этап проектирования любой проекта – это создание прототипа. То, что
хорошо выглядит «на бумаге», совершенно не обязательно будет интересно в реальности.
Прототип реализуется для оценки основного процесса, проверки различных гипотез,
проведения тестов механик, для проверки ключевых технических моментов.
Очень важно на этапе создания прототипа реализовывать только то, что нужно
проверить и в сжатые сроки. Прототип должен быть простым в реализации, т.к. после
достижения поставленных перед ним целей, он должен быть «выкинут».
1.2.8 Release
2 Практическое задание
Разработка идёт в разы быстрее, потому что кода здесь куда меньше, чем
на других языках. И ещё Python отлично подходит новичкам. Именно с него можно начать
свой путь программиста
Abilian SBE;
Ella;
Saleor;
Wagtail;
Django-CMS.
Config.py
# Add token of your bot here
TOKEN = "1702770128:AAFNaaf9i43twZKxO8RwG9oAkmziF-E8_QU"
POSTGRES_USER='postgres'
POSTGRES_PASSWORD='adminuser'
POSTGRES_DATABASE='rsuedb'
Mange.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'botrsue.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
Settings.py
"""
Django settings for botrsue project.
Generated by 'django-admin startproject' using Django 3.0.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'dy=29gc5!g7q6ws8vd8fde$o!oqocag@lt6umq$i(1u5w*@2*7'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'botrsueapp'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'botrsue.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
WSGI_APPLICATION = 'botrsue.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': POSTGRES_USER,
'PASSWORD': POSTGRES_PASSWORD,
'NAME': POSTGRES_DATABASE,
'HOST': 'localhost',
'PORT': 5432
}
}
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarity
Validator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'
,
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator
',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidato
r',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
MEDIA_DIR = f'{BASE_DIR}/media'
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'
Urls.py
"""botrsue URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Wsgi.py
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'botrsue.settings')
application = get_wsgi_application()
bot.py
import os
import io
import base64
import pickle
import telebot
from PIL import Image
import face_recognition
from config import TOKEN
from botrsueapp.models import RsuePhoto
from django.core.files.base import ContentFile
from django.core.files.images import ImageFile
from django.core.management.base import BaseCommand, CommandError
from telebot.types import ReplyKeyboardMarkup, InlineKeyboardButton, InlineKeybo
ardMarkup
TRANSPARENCY = 65
# Инициализируем бота
client = telebot.TeleBot(TOKEN)
def create_image(image_bytes, name):
image = ImageFile(io.BytesIO(image_bytes), name=name)
RsuePhoto.objects.create(image=image)
class Command(BaseCommand):
def handle(self, *args, **kwargs):
# Этот декоратор нужен для обработки команды старт
# Отправляем сообщение и кнопку
client.send_message(message.from_user.id,
"Здравствуйте, вас приветствует бот который нахо
дит ваши фото в базе Ринха",
reply_markup=button)
# Обрабатываем фото
@client.message_handler(func = lambda message: message.text == "Отправит
ь фотографию")
def send_photo_message(message):
# После нажатия кнопки просим отправить фотку
msg = client.send_message(message.from_user.id, "Отправьте сюда фото
графию")
client.register_next_step_handler(msg, scan_photo)
# Сам обработчик
def scan_photo(message):
# Проверяем является ли сообщение фоткой, если после нажатия на кн
опку будет отправлено не фото то ничего не произойдет
if message.content_type == 'photo':
# Вытягиваем id фотографии
raw = message.photo[-1].file_id
# Даем назание фотографии
name = raw + '.jpeg'
# Получаем фотку в байтовом виде
file_info = client.get_file(raw)
downloaded_file = client.download_file(file_info.file_path)
# Записываем временно фотку в файл
# нам это нужно потому что библиотека для комп зрения не прини
мает байтовые фото
with open(name, "wb") as file:
file.write(downloaded_file)
# Загружаем фото в обработку
first_face_img = face_recognition.load_image_file(name)
# Проходимся по всем фоткам в базе данных
client.send_message(message.from_user.id, "Идет анализ фотографи
й\n Это может занять время")
for photo in RsuePhoto.objects.all():
# Загружаем фотку из базы в обработку
# Создаем прозрачность
paste_mask = rsue_photo.split()[3].point(lambda i: i * T
RANSPARENCY / 100.)
#
image = Image.open(photo.image)
width, height = image.size
image = image.resize((int(width/2), int(height/2)))
# Добавляем водный знак
image.paste(rsue_photo, (1, 1), mask=paste_mask)
# Отправляем фотку
client.send_photo(message.from_user.id, image)
client.send_message(message.from_user.id, "Процесс окончен, если
вы не видите отправленных фотографий значит вас нет в базе")
# Удаляем временную фотку
os.remove(name)
client.polling(none_stop=True)
Отметка
руководител
4 № я практики
Сроки
Вид, содержание Планируемые от
выполнени
п/ планируемых работ результаты практики профильной
я
п организации
о
выполнении
1. Изучение предметной области Готовый план проекта 5.07.21
По итогу данной учебной практики, нами был разработан бот, для поиска
фотографий в архивах университета, сделано, это с целью того, чтобы люди работающие в
университете быстро могли находить нужные фотографии, не прерывая свою основную
работу в рабочей среде РИНХ – а, в данной работе было разработано простая и удобная
форма поиска, так же вместе с этим было реализовано хранение и получение самих
файлов, чтобы пользователь мог в краткие сроки получить все необходимое в рабочем
пространстве. Данный бот и дальше будет дорабатываться, это делается для того чтобы
избежать устаревания данного продукта, а так же для добавления в него нового полезного
функционала