Навигация по документации:
- Обзор
- Структура сайта Motorcycle Store
- Особенность
- Установка
- Заполнение данными Telegram Bot
- API
- Теги
Motorcycle Store - интернет площадка для размещения объявлений для юр и физ лиц посвященная продаже "мотоциклов".
Данный сайт представляет из себя упрощенную версию классифайд площадки - ресурса с объявлениями от физических и юридических лиц с различными предложениями, широко известных на просторах рунета auto.ru или avito.ru. Однако тут тематика узкоспециализированная, и это мотоциклы.
- Главная
- Торговая площадка - отображаются все активные объявления
- Разместить объявление
- Новости
- Публикации - новостной раздел сайта
- Опубликовать новость
- Проект
- О проекте - информация о сайте
- Контакты - форма обратной связи
- Условия - техническая информация, лицензия
- Профиль
- "Пользователь" - страница с профилем пользователя
- Выход
- Парсер объявлений для заполнения БД с сайта auto.ru. (Инструкция будет ниже)
- Система авторизации пользователей
- Пагинация на веб странице
- Права доступа
- API
- Telegram Bot. Запросы пользователй и информация о пользователях сохраняется в БД для дальнейшего анализа.(Инструкция будет ниже)
- Пагинация в телеграм боте
- Если в профиле пользователь укажет свой телеграм аккаунт или телефон, то имеется способ напрямую связаться с ним через телеграм объявление
- Объявления и новости могут публиковать только авторизованные пользователи. Новости могут публиковать только пользователи со статусом author
- Редактирование новостей и объявлений возможна, как на главной странице, так и на странице профиля пользователей и в самой новости или объявлении. Пользователь может редактировать, удалять только свои.
- На странице профиля можно увидеть все объявления и новости с указанием количества.
- На странице профиля можно изменить токен для api доступа без перезарузки страницы на ajax, информацию профиля, пароль
- Имеется два блока поиска по ключевым словам
- Имеется динамический блок фильтрации контекта по марке, модели, типу мотоцикла, а также цены без перезарузки страницы на ajax
- После обновления страницы форма сохраняет свои поисковые запросы
- Имеется блок типов мотоцикла для ускоренной фильтрации контента
- Имеется блок часто просматриваемых объявлений
(действия будут выполнятся на windows)
1. Создаем директорию, клонируем проект в эту папку ...
git clone ..
2. Переходим в папку с проектом, выполнив команду cd
cd motostore/motostore
3. Установим все необходимые библиотеки, используя pip ...
pip install -r requirements.txt
4. Создадим новые миграции
manage.py makemigrations
5. Применим миграции
manage.py migrate
5.1 Создадим суперпользователя. Он нам понадобиться для парсинга. Именно на него будут заводиться все объявления (Если Вы выберите заполнение через json, то этот пункт можно пропустить, т.к далее будет выполнена загрузка пользователей)
manage.py createsuperuser
6. На данный момент все готово, но данных пока у нас нет, поэтому выполним парсинг с сайта auto.ru. Т.к сайт динамически обновляет контент, необходимо ...
6.1.1 Создаем config.py в директории storeapp/management/, т.е должно получиться storeapp/management/config.py
6.1.2 Заходим на сайт в раздел мотоциклы [auto.ru](https://auto.ru/motorcycle/all/). Открываем инструменты разработчика Ctrl+Shift+I или F12
6.1.3 Далее следуем инструкциям по картинке:
6.1.4 Скопированный cURL вставляем в любой cURL конвертер онлайн
6.1.5 Получаем request запрос на языке python. (да там много языков, нам нужен python). Копируем словари cookies и headers в ранее созданный файл config.py.
6.1.6 (Опционально) Словарь json_data можем изменить в файле fillstore, именно в нем задаются параметры запроса. В целом достаточно изменять ключ "catalog_filter" в json_data. Параметры опять же можно узнать в раскодированной curl соманде
6.1.7 Выполняем парсинг любой командой (-w --wait задает время ожидания между запросами, если не задано, то случайное число в диапазоне от 10 до 35 сек.):
manage.py fillstore
manage.py fillstore -w 30
manage.py fillstore --wait 30
6.1.8 Запускаем сервер командой
manage.py runserver
6.1.9 При попытке зайти на сайт мы увидим, что сайт будет пустым. Это связано с тем, что объявления которые спарсились находятся в неактивном статусе, т.е. их нужно активировать. Для этого заходим в админку: wedsite/admin. Логинимся под суперпользователем, которого создали в пунке 5.1. Далее в раздел мотоциклы, все выделяем галочкой и выполняем команду: "Опубликовать"
6.2.1 Загрузим базу пользователей. Таким образом в системе будет два пользователя. Суперпользователь будет (admin, 123)
manage.py loaddata db_json/users.json
6.2.2 Загрузим базу новостей
manage.py loaddata db_json/news.json
6.2.3 Загрузим базу объявлений
manage.py loaddata db_json/store.json
6.2.4 Загрузим изображения для объявлений, выполнив команду в django админ панели
manage.py download-images.py
7. Снова заходим на сайт.
1. Создаем файл telegram_config по следующей директории: telegramapp.management.telegram_config
2. Создаем в файле telegram_config константы TOKEN, PATH_TO_IMAGES
TOKEN = 'TelegramBotToken'
PATH_TO_IMAGES = 'absolute path to motostore' # к примеру C:/../../motostore
3. Запускам бота командой
manage.py telegram
4. Открываем своего бота и вводим команду
/start
API функционал выполнен с использованием Django REST framework
Неавторизованные пользователи получают доступ только на чтение, а вот авторизованные могут выполнять действия в зависимости от прав доступа. На проекте доступны 3 вида аутентификации: базовый на основе пароля и логина, сессии и токен аутентификация
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
],
...
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
API Root запрос выполняется на website/api/v0/
/api/v0/
Остальные API запросы выполняется на website/api/v0/request
mark list: /api/v0/marks/
models: /api/v0/motorcycle-models/
news: /api/v0/news/
...
сURL API запрос на чтение
curl -X GET http://website/api/v0/
curl -X GET http://website/api/v0/marks/ -u user:password
curl -X GET http://website/api/v0/marks/ -H "Accept: application/json" -H "Authorization: Token token"
сURL API запрос на запись
Так как операции запись, редактирование и удаление доступна только авторизованным пользователям, то в запрос необходимо передать логин и пароль или токен (который можно получить в личном кабинете)curl -X POST http://website/api/v0/marks/ -u user:password -d "name=TestString"
curl -X POST http://website/api/v0/marks/ -H "Accept: application/json" -H "Authorization: Token token" -d "name=TestString"
сURL API запрос на редактирование
Так как операции запись, редактирование и удаление доступна только авторизованным пользователям, то в запрос необходимо передать логин и пароль или токен (который можно получить в личном кабинете)curl -X PUT http://website/api/v0/marks/id/ -u user:password -d "name=NewString"
curl -X PUT http://website/api/v0/marks/id/ -H "Accept: application/json" -H "Authorization: Token token" -d "name=NewString"
сURL API запрос на удаление
Так как операции запись, редактирование и удаление доступна только авторизованным пользователям, то в запрос необходимо передать логин и пароль или токен (который можно получить в личном кабинете)curl -X DELETE http://website/api/v0/marks/id/ -u user:password
curl -X DELETE http://website/api/v0/marks/id/ -H "Accept: application/json" -H "Authorization: Token token"