Пришло время создать еще один прохладный проект, используя Django и Framework.
В этом посте мы собираемся построить API REST в реальном времени.
Канал YouTube с видеоуроками – Обратный питон youtube
Прежде чем мы продолжим, посмотрите Обратный питон Анкет Вы можете найти больше таких статей с дизайном UI UX, и если вам понравилось, поделитесь в социальных сетях или с друзьями.
В настоящее время я заинтересован в криптовалюте, поэтому я решил создать API криптовалюты, чтобы использовать его в React. Что ж, нам нужно постоянно ползать и постоянно обновлять данные и избегать долгосрочного тайм -аута.
Установка и конфигурация
Начнем с создания нового проекта с именем CryptocurrencyTracking и внутри вашего проекта создать приложение с именем Trackingapi
django-admin startproject cryptocurrencytracking cd cryptocurrencytracking django-admin startapp trackingAPI
и установить платформу REST:
pip install djangorestframework
После завершения установки откройте свой настройки.py и обновление stasted_apps.
INSTALLED_APPS = [ ... 'rest_framework', 'trackingAPI', ]
Итак, я заявил, прежде чем нам понадобятся долгосрочные запросы. Сельдерей является лучшим выбором для выполнения обработки фоновой задачи в экосистеме Python/Django. Он имеет простой и четкий API, и он прекрасно интегрируется с Django. Таким образом, мы используем сельдерея для выполнения трудоемких задач, передавая их в очередь, чтобы выполняться в фоновом режиме, и всегда поддерживать сервер готовым отвечать на новые запросы.
Чтобы установить выполнение сельдерея следующая команда:
pip install Celery
Сельдерея требует решения для отправки и получения сообщений; Обычно это происходит в виде отдельной службы, называемой брокером сообщения. Мы будем настраивать сельдерей, чтобы использовать Rabbitmq Система обмена сообщениями, поскольку она обеспечивает надежные, стабильные производительность и хорошо взаимодействует с сельдереем.
Мы можем установить RabbitMQ через репозитории Ubuntu, следующая команда:
sudo apt-get install rabbitmq-server
Затем включите и запустите услугу RabbitMQ:
sudo systemctl enable rabbitmq-server sudo systemctl start rabbitmq-server
Установите Rabbitmq на Mac
После завершения установки добавьте конфигурацию celery_broker_url в конец настройки.py файл:
CELERY_BROKER_URL = 'amqp://localhost'
Затем создайте celery.py внутри вашего проекта.
celery.py
import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cryptocurrencytracking.settings') app = Celery('cryptocurrencytracking') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks()
Мы настраиваем модуль настройки Django по умолчанию для программы «Сельдерея» и загрузки модулей задач из всех зарегистрированных конфигураций приложения Django.
Теперь внутри твоего __init__.py импортировать сельдерей:
from .celery import app as celery_app __all__ = ['celery_app']
Это убедится, что наше приложение для сельдерея загружается каждый раз, когда начинается Django.
Создание модели
В вашем модели.py :
from django.db import models class Cryptocurrency(models.Model): cryptocurrency = models.CharField(max_length=100) price = models.CharField(max_length=100) market_cap = models.CharField(max_length=100) change = models.CharField(max_length=100) def __str__(self): return self.cryptocurrency
Мы собираемся ползать на сайте с именем Coinranking И если вы посетите сайт, вы увидите там имена поля.
Ползание данных криптовалюты
Мы будем использовать BeautifulSoup для ползания значений криптовалюты в данном URL.
Beautiful Soup – это библиотека Python для извлечения данных из файлов HTML и XML. Он работает с вашим любимым анализатором, чтобы обеспечить идиоматические способы навигации, поиска и изменения дерева анализа. Обычно это экономит программисты или дни работы. Запустите следующую команду в вашем терминале для установки BeautifulSoup:
pip install beautifulsoup4
Теперь создайте новый файл с именем tasks.py Внутри нашего приложения Trackingapi Анкет
# tasks.py from time import sleep from celery import shared_task from bs4 import BeautifulSoup from urllib.request import urlopen, Request from .models import Cryptocurrency @shared_task # do some heavy stuff def crawl_currency(): print('Crawling data and creating objects in database ..') req = Request('https://coinranking.com', headers={'User-Agent': 'Mozilla/5.0'}) html = urlopen(req).read() bs = BeautifulSoup(html, 'html.parser') # Find first 5 table rows rows = bs.find('tbody', class_="table__body").find_all('tr', class_="table__row")[0:5] for row in rows: cryptocurrency = row.find('span', class_="profile__name").get_text().strip().replace('\n', '') values = row.find_all('div', class_="valuta") price = values[0].get_text().strip().replace('\n', '') market_cap = values[1].get_text().strip().replace('\n', '') change = row.find('div', class_="change").find('span').get_text().strip().replace('\n', '') print({'cryptocurrency': cryptocurrency, 'price':price, 'market_cap':market_cap, 'change':change}) # Create object in database from crawled data Cryptocurrency.objects.create( cryptocurrency = cryptocurrency, price = price, market_cap = market_cap, change = change ) # Sleep 3 seconds to avoid any errors sleep(3)
@shared_task создаст независимый экземпляр задачи для каждого приложения, делая задачу повторно используемым. Это делает декоратор @shared_task полезным для библиотек и многоразовых приложений, поскольку он не будет иметь доступа к приложению пользователя.
Как вы видите, мы ползаем наши данные и чистим их от бесполезных символов, а затем создают новый объект в базе данных.
После ползания данных нам нужно довольствоваться этими объектами.
#tasks.py @shared_task def update_currency(): print('Updating data ..') req = Request('https://coinranking.com', headers={'User-Agent': 'Mozilla/5.0'}) html = urlopen(req).read() bs = BeautifulSoup(html, 'html.parser') rows = bs.find('tbody', class_="table__body").find_all('tr', class_="table__row")[0:5] for row in rows: cryptocurrency = row.find('span', class_="profile__name").get_text().strip().replace('\n', '') values = row.find_all('div', class_="valuta") price = values[0].get_text().strip().replace('\n', '') market_cap = values[1].get_text().strip().replace('\n', '') change = row.find('div', class_="change").find('span').get_text().strip().replace('\n', '') print({'cryptocurrency': cryptocurrency, 'price':price, 'market_cap':market_cap, 'change':change}) data = {'cryptocurrency': cryptocurrency, 'price':price, 'market_cap':market_cap, 'change':change} Cryptocurrency.objects.filter(cryptocurrency=cryptocurrency).update(**data) sleep(3) # Run this function if database is empty if not Cryptocurrency.objects.all(): crawl_currency() while True: sleep(15) update_currency()
Как вы видите, мы ползаем данные каждые 15 секунд и обновляем наши объекты.
Если вы хотите увидеть сельдерей начала результата в терминале:
celery -A cryptocurrencytracking worker -l info
И зайдите, проверьте своего администратора, чтобы увидеть созданные объекты.
Здание API
Хорошо! Теперь наши объекты обновляются, и нам нужно создать API с помощью Framework REST.
Теперь создайте serializers.py В нашем приложении.
Сериализаторы позволяют преобразовать сложные данные, такие как запросы и экземпляры модели, в нативные данные Python, которые затем можно легко отображать в JSON, XML или другие типы контента. Сериализаторы также обеспечивают десериализацию, позволяя конвертировать данные обратно в сложные типы после сначала проверки входящих данных.
#serializers.py from rest_framework import serializers from .models import Cryptocurrency class CryptocurrencySerializer(serializers.ModelSerializer): class Meta: model = Cryptocurrency fields = ['cryptocurrency', 'price', 'market_cap', 'change']
Класс моделейализатора предоставляет ярлык, который позволяет автоматически создавать класс сериализатора с полями, которые соответствуют полям модели.
Для получения дополнительной информации посмотрите документация
Следующим шагом является создание видов API, так что открыт views.py :
#views.py from django.shortcuts import render from rest_framework import generics from .models import Cryptocurrency from .serializers import CryptocurrencySerializer class ListCryptocurrencyView(generics.ListAPIView): """ Provides a get method handler. """ queryset = Cryptocurrency.objects.all() serializer_class = CryptocurrencySerializer
и, наконец, настройте urls.py
#urls.py from django.contrib import admin from django.urls import path from trackingAPI.views import ListCryptocurrencyView urlpatterns = [ path('admin/', admin.site.urls), path('', ListCryptocurrencyView.as_view()), ]
Когда вы запустите сервер и сельдерей (отдельные терминалы), вы увидите следующее результат:
Постарайтесь обновить страницу каждые 15 секунд или каждую минуту, и вы заметите, что значения меняются.
Вы можете клонировать или загрузить этот проект с моего GitHub:
Raszidzie/Cryptocurrency-Rest-Api-Django
API, построенный из Framework Django REST
API, построенный из Framework Django REST
Начиная
Этот урок работает на Python 3+ и Django 2+.
Установить зависимости:
python3 -m pip3 install -r requirements.txt
Запустить следующие команды:
python3 manage.py makemigrations trackingAPI python3 manage.py migrate python3 manage.py runserver
и начать работник сельдерея:
celery -A cryptocurrencytracking worker -l info
Миссия выполнена!
Я надеюсь, что вы кое -что узнали из этого урока и убедитесь, что вы следите за мной в социальных сетях. Также проверьте Обратный питон
Оригинал: “https://dev.to/coderasha/implement-real-time-updates-with-django-rest-framework-building-cryptocurrency-api-1kld”