├── .gitignore ├── README.md ├── aiohttp └── README.md ├── asyncio └── README.md ├── celery ├── README.md └── upscale │ ├── EDSR_x2.pb │ ├── lama_300px.png │ ├── requirements.txt │ └── upscale.py ├── ci_cd ├── README.md └── flask_deploy_example │ ├── .github │ └── workflows │ │ ├── docker-publish.yml │ │ └── python-app.yml │ ├── .gitignore │ ├── Dockerfile │ ├── Readme.md │ └── app │ ├── app.py │ ├── requirements.txt │ └── tests │ └── test_main.py ├── docker ├── README.md └── html │ └── index.html └── flask └── README.md /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netology-code/py-homeworks-web/0fbf8772692458277303683b210380ea8dadfc71/.gitignore -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Домашние задания на курсе «Python в веб-разработке» 2 | 3 | ## Как сдавать задачи 4 | 1. Инициализируйте на своём компьютере пустой Git-репозиторий 5 | 2. Добавьте в этот же каталог необходимые файлы 6 | 3. Сделайте необходимые коммиты 7 | 4. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым 8 | 5. Сделайте пуш (удостоверьтесь, что ваш код появился на GitHub) 9 | 6. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](http://netology.ru/) 10 | 7. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачета (в этом ДЗ все задачи являются обязательными) 11 | 8. Любые вопросы по решению задач задавайте в чате Slack, но мы не сможем проверить или помочь, если вы пришлете: 12 | * архивы; 13 | * скриншоты кода; 14 | * теоретический рассказ о возникших проблемах. 15 | 16 | 1. [Flask](flask) 17 | 2. [Docker](docker) 18 | 3. [CI/CD](ci_cd) 19 | 4. [Event loop. Asyncio.](asyncio) 20 | 5. [Aiohttp](aiohttp) 21 | 6. [Celery](celery) 22 | -------------------------------------------------------------------------------- /aiohttp/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Aiohttp» 2 | 3 | ## Задание 1 4 | 5 | Переписать сервис из [домашнего задания по Flask](../flask) на aiohhtp. 6 | 7 | 8 | Результатом работы является API, написанный на aiohttp. 9 | 10 | ## Задание 2 (необязательное) 11 | 12 | Докеризировать API, написанный в задании 1. 13 | Чтобы проверить корректность работы сервиса, нужно: 14 | 1. запустить контейнер 15 | 2. проверить работу роута 16 | -------------------------------------------------------------------------------- /asyncio/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Asyncio» 2 | 3 | В этом задании мы будем выгружать из API персонажей Start Wars и загружать в базу данных.
4 | Документация по API находится здесь: [SWAPI](https://swapi.dev/documentation#people).
5 | Пример запроса: `https://swapi.dev/api/people/1/`
6 | В результате запроса получаем персонажа с ID 1: 7 | ``` 8 | { 9 | "birth_year": "19 BBY", 10 | "eye_color": "Blue", 11 | "films": [ 12 | "https://swapi.dev/api/films/1/", 13 | ... 14 | ], 15 | "gender": "Male", 16 | "hair_color": "Blond", 17 | "height": "172", 18 | "homeworld": "https://swapi.dev/api/planets/1/", 19 | "mass": "77", 20 | "name": "Luke Skywalker", 21 | "skin_color": "Fair", 22 | "created": "2014-12-09T13:50:51.644000Z", 23 | "edited": "2014-12-10T13:52:43.172000Z", 24 | "species": [ 25 | "https://swapi.dev/api/species/1/" 26 | ], 27 | "starships": [ 28 | "https://swapi.dev/api/starships/12/", 29 | ... 30 | ], 31 | "url": "https://swapi.dev/api/people/1/", 32 | "vehicles": [ 33 | "https://swapi.dev/api/vehicles/14/" 34 | ... 35 | ] 36 | } 37 | ``` 38 | Необходимо выгрузить cледующие поля:
39 | **id** - ID персонажа
40 | **birth_year**
41 | **eye_color**
42 | **films** - строка с названиями фильмов через запятую
43 | **gender**
44 | **hair_color**
45 | **height**
46 | **homeworld**
47 | **mass**
48 | **name**
49 | **skin_color**
50 | **species** - строка с названиями типов через запятую
51 | **starships** - строка с названиями кораблей через запятую
52 | **vehicles** - строка с названиями транспорта через запятую
53 | Данные по каждому персонажу необходимо загрузить в любую базу данных.
54 | Выгрузка из апи и загрузка в базу должна происходить аснхронно.
55 | Результатом работы будет:
56 | 1) скрипт миграции базы данных
57 | 2) скрипт загрузки данных из API в базу
58 | -------------------------------------------------------------------------------- /celery/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Celery» 2 | 3 | Специалист по машинному обучению создал модель для 4 | [апскейлинга](https://ru.wiktionary.org/wiki/%D0%B0%D0%BF%D1%81%D0%BA%D0%B5%D0%B9%D0%BB%D0%B8%D0%BD%D0%B3) 5 | изображений и функцию, которая позволяет ее использовать. 6 | Файлы проекта находится [здесь](upscale). 7 | `EDSR_2.pb` - модель. 8 | В модуле `upscale.py` находится функция `upscale`, которая имплементирует модель и функция `example` с примером использования. 9 | В файле `requirements.txt` перечислены зависимости 10 | 11 | Перед Вами стоит задача написать сервис для апскейлинга изображений на базе Flask, Celery и ИИ модели. 12 | Должно быть реализовано 3 роута 13 | - POST `/upscale`. Принимает файл с изображением и возвращает id задачи 14 | - GET `/tasks/` возвращает статус задачи и ссылку на обработанный файл, если задача выполнена 15 | - GET `/processed/{file}` возвращает обработанный файл 16 | 17 | Дополнительные задачи: 18 | - перепишите функцию `upscale` так, чтобы файл `EDSR_x2.pb` считывался только один раз, а не при каждом вызове функции 19 | - попробуйте написать сервис и функцию `upscale` таким образом, чтобы не сохранять файлы изображений на диск 20 | - докеризируйте приложение 21 | - напишите тесты 22 | 23 | Результатом работы является рабочее API. 24 | 25 | -------------------------------------------------------------------------------- /celery/upscale/EDSR_x2.pb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netology-code/py-homeworks-web/0fbf8772692458277303683b210380ea8dadfc71/celery/upscale/EDSR_x2.pb -------------------------------------------------------------------------------- /celery/upscale/lama_300px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netology-code/py-homeworks-web/0fbf8772692458277303683b210380ea8dadfc71/celery/upscale/lama_300px.png -------------------------------------------------------------------------------- /celery/upscale/requirements.txt: -------------------------------------------------------------------------------- 1 | opencv-contrib-python==4.6.0.66 2 | opencv-python==4.6.0.66 3 | -------------------------------------------------------------------------------- /celery/upscale/upscale.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | from cv2 import dnn_superres 3 | 4 | 5 | def upscale(input_path: str, output_path: str, model_path: str = 'EDSR_x2.pb') -> None: 6 | """ 7 | :param input_path: путь к изображению для апскейла 8 | :param output_path: путь к выходному файлу 9 | :param model_path: путь к ИИ модели 10 | :return: 11 | """ 12 | 13 | scaler = dnn_superres.DnnSuperResImpl_create() 14 | scaler.readModel(model_path) 15 | scaler.setModel("edsr", 2) 16 | image = cv2.imread(input_path) 17 | result = scaler.upsample(image) 18 | cv2.imwrite(output_path, result) 19 | 20 | 21 | def example(): 22 | upscale('lama_300px.png', 'lama_600px.png') 23 | 24 | 25 | if __name__ == '__main__': 26 | example() -------------------------------------------------------------------------------- /ci_cd/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «CI/CD» 2 | ## Задание 3 | 4 | - Развернуть собственное flask приложение из домашнего задания лекции “Flask” на Heroku (или другом) сервере. 5 | - Настроить процессы CI/CD для запуска тестов и сборки после каждого коммита на основной ветке. 6 | 7 | К проверке прислать git репозиторий и ссылку на работающий web сервис. 8 | 9 | ##### Полезные материалы: 10 | - [Пример приложения с GitHub Actions](flask_deploy_example/) -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/.github/workflows/docker-publish.yml: -------------------------------------------------------------------------------- 1 | name: Docker wokrflow 2 | on: 3 | push: 4 | branches: 5 | - main 6 | - master 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: Login to Heroku Container registry 13 | env: 14 | HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} 15 | run: heroku container:login 16 | - name: Build the Docker image 17 | run: docker build -t web:latest . 18 | - name: Push the Docker image to the Heroku registry 19 | env: 20 | HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} 21 | run: | 22 | heroku container:push web --app ${{ secrets.HEROKU_APP_NAME }} 23 | heroku container:release web --app ${{ secrets.HEROKU_APP_NAME }} 24 | heroku ps:scale web=1 -a ${{ secrets.HEROKU_APP_NAME }} 25 | -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/.github/workflows/python-app.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a single version of Python 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 3 | 4 | name: Python application 5 | defaults: 6 | run: 7 | shell: bash 8 | working-directory: app 9 | on: 10 | push: 11 | branches: [ main, master ] 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: Set up Python 3.8 18 | uses: actions/setup-python@v2 19 | with: 20 | python-version: 3.8 21 | - name: Install dependencies 22 | run: | 23 | python -m pip install --upgrade pip 24 | pip install flake8 pytest 25 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 26 | - name: Lint with flake8 27 | run: | 28 | # stop the build if there are Python syntax errors or undefined names 29 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 30 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 31 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 32 | - name: Test with pytest 33 | run: | 34 | pytest 35 | -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/.gitignore: -------------------------------------------------------------------------------- 1 | *_cache 2 | .idea 3 | __pycache__ 4 | -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.7 2 | COPY ./app /app 3 | RUN pip install -r /app/requirements.txt 4 | WORKDIR /app 5 | CMD ["gunicorn", "app:app"] 6 | -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/Readme.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netology-code/py-homeworks-web/0fbf8772692458277303683b210380ea8dadfc71/ci_cd/flask_deploy_example/Readme.md -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/app/app.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | 4 | from flask import Flask 5 | 6 | app = Flask(__name__) 7 | 8 | 9 | @app.route('/') 10 | def home(): 11 | name = os.getenv('ADMINAME', 'Def') 12 | return f'Hello {name}!' 13 | 14 | 15 | if __name__ == '__main__': 16 | port = int(os.environ.get("PORT", 5000)) 17 | app.run(debug=True, host='0.0.0.0', port=port) 18 | -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/app/requirements.txt: -------------------------------------------------------------------------------- 1 | click==6.7 2 | Flask==0.12 3 | itsdangerous==0.24 4 | Jinja2==2.9.4 5 | MarkupSafe==0.23 6 | Werkzeug==0.11.15 7 | wheel==0.24.0 8 | gunicorn==20.0.4 9 | pytest 10 | -------------------------------------------------------------------------------- /ci_cd/flask_deploy_example/app/tests/test_main.py: -------------------------------------------------------------------------------- 1 | def test_capital_case(): 2 | assert 'semaphore' == 'Semaphore'.lower() 3 | -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Docker» 2 | ## Задание 1 3 | По аналогии с практикой из лекции создайте свой docker image с http сервером nginx. Замените страницу приветсвия Nginx на своё (измените текст приветствия на той же странице). 4 | 5 | 6 |
Подсказки: 7 | В официальном образе nginx стандартный путь к статичным файлам `/usr/share/nginx/html`. 8 |
9 | 10 | На проверку присылается GitHub репозиторий с Dockerfile и статичными файлами для него. 11 | > Для пользовательского html можно использовать пример в [каталоге](html/) с ДЗ. 12 | 13 | 14 | ## Задание 2 15 | Создайте контейнер для REST API сервера из решения ДЗ по теме «Flask» 16 | 17 | 1. Создайте типовой Docker-файл для запуска Python-приложения 18 | 2. Проверьте конфигурацию Flask на использование переменных окружения (environment) 19 | 3. Проверьте Docker-файл на передачу переменных окружения в Flask 20 | 4. Docker-контейнер запускается с приложением Flask 21 | 22 |
Подсказки: 23 | 1. Хорошим тоном будет пример команд с последовательным запуском контейнеров и объединением их в сеть для БД и Flask. 24 | 2. В качестве простого решения можно подключаться к БД на локальной хост машине. 25 |
26 | 27 | - Приложите в репозиторий Dockerfile и файлы приложения. 28 | - В Readme.md описать типовые команды для запуска контейнера c backend сервером. 29 | 30 | ## Задание 3 *(не обязательное) 31 | Создать конфигурацию для последовательного запуска 3-х контейнеров: flask, postgres, nginx. 32 | Контейнеры объединяются в сеть, которые работают в связке: 33 | - Nginx работает в качестве proxy-http для пересылки динамических запросов к Flask или возвращая статические html файлы. 34 | - PostgreSQL запускается до Flask, т.к. rest api может зависетьот БД. 35 | - Flask запускается через Gunicorn, отвечая http клиенту через Nginx. 36 | 37 | В Readme.md перечислить команды для запуска или описать конфигурацию `docker-compose.yml` для запуска одной командой. 38 | 39 | Полезные материалы для Задания 3: 40 | - [Введение в docker-compose](https://dker.ru/docs/docker-compose/getting-started/) 41 | - https://the-bosha.ru/2017/01/04/zapusk-flask-prilozheniia-c-uwsgi-virtualenv-i-nginx/ 42 | - https://habr.com/ru/post/352266/ `Темы Настройка Gunicorn и Supervisor` и `Настройка Nginx` 43 | - https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04-ru 44 | -------------------------------------------------------------------------------- /docker/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hello example 5 | 6 | 7 |

Hello World!

8 | 9 | -------------------------------------------------------------------------------- /flask/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Flask» 2 | 3 | Вам нужно написать REST API (backend) для сайта объявлений. 4 | 5 | Должны быть реализованы методы создания/удаления/редактирования объявления. 6 | 7 | У объявления должны быть следующие поля: 8 | - заголовок 9 | - описание 10 | - дата создания 11 | - владелец 12 | 13 | Создавать объявление может только авторизованный пользователь. 14 | Удалять/редактировать может только владелец объявления. 15 | В таблице с пользователями должны быть как минимум следующие поля: идентификатор, почта и хэш пароля. 16 | 17 | Результатом работы является API, написанное на Flask. 18 | 19 | Этапы выполнения задания: 20 | 21 | 1. Сделайте роут на Flask. 22 | 2. POST метод должен создавать объявление, GET - получать объявление, DELETE - удалять объявление. 23 | 3. Создайте таблицу с пользователями. 24 | 4. Сделайте любую систему авторизации пользователей на ваш выбор: по логину и паролю или токену. 25 | 26 | ## Как сдавать задачи 27 | 28 | 1. Инициализируйте на своём компьютере пустой Git-репозиторий 29 | 2. Добавьте в этот же каталог необходимые файлы 30 | 3. Сделайте необходимые коммиты 31 | 4. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым 32 | 5. Сделайте пуш (удостоверьтесь, что ваш код появился на GitHub) 33 | 6. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](http://netology.ru/) 34 | 7. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачета (в этом ДЗ все задачи являются обязательными) 35 | 8. Любые вопросы по решению задач задавайте в чате Slack, но мы не сможем проверить или помочь, если вы пришлете: 36 | * архивы; 37 | * скриншоты кода; 38 | * теоретический рассказ о возникших проблемах. 39 | --------------------------------------------------------------------------------