Skip to content

Repository files navigation

Лабораторные работы по предмету "Технологии сетевого программирования"

Тема проекта, реализуемого в рамках лабораторных работ:

-> Сервис для распознавания эмоций людей по изображениям

Лабораторная работа №0

Концепция использования сервиса.

1. Данный сервис должен предоставлять возможность определять эмоции человека по изображению его лица.

2. Пользователь может выбрать нейронную сеть, которую он будет использовать для определения эмоций. Сервис предоставляет различные архитектуры сетей, обученные на разных датасетах.

3. В сервисе должна вестись запись история запросов к серверу. Т.е. пользователь может посмотреть запрос к серверу и ответ сети.

Данный сервис предполагает последующее расширение в виде Android приложения и Telegram бота.

Схема базы данных:

Схема базы данных

Стек технологий:

1. PyTorch

2. Django

3. DjangoRestFramework

4. Docker

Лабораторная 1

Задача 1: Настройка базы данных

2.Выполнено подключение к базе через DBeaver

Задача 2: Разработка ORM-моделей:

Задача 3.

1. Определена структура модели пользователя;

from django.contrib.auth.models import User

class UserModel(models.Model):

   user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user_model")

   interests = models.ManyToManyField(Interest, related_name="user_model", blank=True)

   class Meta:
       verbose_name = "User"
       verbose_name_plural = "Users"

   def __str__(self):
       return self.user.username

   @property
   def login(self):
       return self.user.username

   @property
   def email(self):
       return self.user.email

2. Настроено хеширование паролей.

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
]

Задача 4.

База данных с тестовыми данными:

Лабораторная 2

Задача №1.

2. Настроены все маршруты:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('models/', views.model_list, name='model-list'),
    path('models/<int:model_id>/', views.model_detail, name='model-detail'),
    path('datasets/', views.dataset_list, name='dataset-list'),
    path('datasets/<int:dataset_id>/', views.dataset_detail, name='dataset-detail'),
    path('trained-models/', views.trained_model_list, name='trained-model-list'),
    path('trained-models/<int:trained_model_id>/', views.trained_model_detail, name='trained-model-detail'),
    path('users/', views.user_list, name='user-list'),
    path('users/<int:user_id>/', views.user_detail, name='user-detail'),
    path('users/<str:login>/', views.user_login_detail, name='user-login-detail'),
    path('users-create/', views.create_user_and_user_model, name='user-create'),
    path('user-model/<int:user_id>/', views.update_user_model_trained_model, name='user-model-update'),
    path('history/<int:user_id>/', views.history_detail, name='history-detail'),
    path('predict/<int:user_id>/', views.predict, name='result'),
    path('image/<int:image_id>/', views.get_image, name='image'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Задача №2.

Выполнено тестирование через Postman:

Получение всех моделей:

Получение модели по ID:

Получение всех датасетов:

Получение датасета по ID:

Получение всех обученных моделей:

Получение обученной модели по ID:

Получение всех пользователей:

Получение пользователя по ID:

Получение пользователя по логину:

Изменение обученной модели у пользователя:

Добавление нового пользователя:

Получение картинки по ID:

Получение истории по ID пользователя

Получение предсказания по изображению:

Лабораторная 3

Задача №1.

Регистрация нового пользователя.

@api_view(['POST'])
@permission_classes([permissions.AllowAny])
def register(request):
    if request.method == 'POST':
        user_data = request.data

        if not user_data:
            return Response({"error": "User data is required"}, status=status.HTTP_400_BAD_REQUEST)

        user_serializer = RegisterSerializer(data=user_data)
        if user_serializer.is_valid():
            user = user_serializer.save()
        else:
            return Response(user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        first_trained_model = TrainedModel.objects.first()

        try:
            user_model = UserModel.objects.create(
                user=user,
                trained_model=first_trained_model
            )
        except Exception as e:
            user.delete()
            return Response({"error": f"An unexpected error occurred: {str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        return Response({"user_id": user.id}, status=status.HTTP_201_CREATED)

Вход в систему и получение JWT-токена.

urlpatterns = [
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]    

Задача №2.

Проверка валидности токена и ограничение доступа к определенным эндпоинтам реализованы при помощи

@permission_classes([permissions.IsAuthenticated])

Задача №3.

Изменение пароля.

@api_view(['PUT'])
@permission_classes([permissions.IsAuthenticated])
def change_password(request):
    serializer = ChangePasswordSerializer(data=request.data)
    if serializer.is_valid(raise_exception=True):

        if not request.user.check_password(serializer.validated_data.get("old_password")):
            return Response({"old_password": ["Wrong password."]}, status=status.HTTP_400_BAD_REQUEST)
        
        request.user.set_password(serializer.validated_data.get("new_password"))
        request.user.save()
        update_session_auth_hash(request, request.user)
        return Response(status=status.HTTP_204_NO_CONTENT)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Выход из системы (отзыв токена) реализован при помощи

TokenBlacklistView.as_view()()

Задача №4.

Проверка работы аутентификации с помощью Postman/Curl.

Проверка на запрос без токена к незазищённому эндпоинту:

Проверка на запрос без токена к защищённому эндпоинту:

Проверка на запрос с токеном к тому же эндпоинту:

Проверка на регистрацию пользователя:

1. При отстутствии подтверждения пароля:

2. При подтверждении пароля:

Проверка на получение токена при входе:

Проверка на изменение пароля:

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages