├── .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 |
--------------------------------------------------------------------------------