Django | 가격 추적 어플리케이션 추적 할인
안녕하세요!
유튜브 채널 동영상 튜토리얼 -
이 강좌에서, 우리는 가격 추적기 응용 프로그램을 구축할 것이며, 이 응용 프로그램은 우리에게 할인을 통지할 것이다.
복잡한 프로젝트를 만드는 것이 빠른 학습의 관건이다!만약 당신이 나를 한동안 주목한다면, 당신은 이미 내가 복잡한 것을 좋아한다는 것을 알고 있기 때문에, 우리는 Rabbit MQ+미나리+Beautiful Soup+Django를 사용하여 이 프로그램을 만들 것이다.
그래우리 시작합시다!
미나리는 Python/Django 생태계에서 백그라운드 작업 처리를 하기에 가장 좋은 선택이다.간단하고 명확한 API가 있으며 Django와 완벽하게 통합됩니다.따라서 우리는 셀러리를 사용하여 시간을 소모하는 작업을 처리합니다. 방법은 작업을 대기열에 전달하여 백그라운드에서 실행하고 서버가 새로운 요청에 응답할 준비를 하도록 하는 것입니다.
미나리는 메시지를 보내고 받을 수 있는 해결 방안이 필요하다.통상적으로 이것은 메시지 에이전트라고 불리는 단독 서비스의 형식으로 나타난다.RabbitMQ 메시지 전달 시스템을 사용하기 위해celery를 설정합니다. 강력하고 안정적인 성능을 제공하고celery와 상호작용이 양호하기 때문입니다.
다음 명령을 사용하여 Ubuntu 저장소에서 RabbitMQ를 설치할 수 있습니다.
sudo apt-get install rabbitmq-server
그런 다음 RabbitMQ 서비스를 활성화하고 시작합니다.sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
Install RabbitMQ on Mac 그러면 pricetracker라는 새 Django 프로젝트와 tracker라는 프로그램을 만듭니다.
다음 종속성을 설치합니다.
pip3 install beautifulsoup4 httplib2 Celery
설치가 완료되면 CELERY\u BROKER\u URL 구성을 설정에 추가합니다.py 파일:CELERY_BROKER_URL = 'amqp://localhost'
그리고 미나리를 만든다.py는 당신의 프로젝트에 있습니다.미나리회사 명
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pricetracker.settings')
app = Celery('pricetracker')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
"celery"프로그램에 기본 Django 설정 모듈을 설정하고 등록된 모든 Django 응용 프로그램 설정에서 작업 모듈을 불러옵니다.현재 _uinit_uu 에 있습니다.미나리 가져오기:
from .celery import app as celery_app
__all__ = ['celery_app']
이것은 Django가 시작될 때마다 미나리 프로그램을 불러오는 것을 보장합니다.이제 우리 모형을 만듭시다
모형.회사 명
from django.db import models
class Item(models.Model):
title = models.CharField(max_length=200)
url = models.CharField(max_length=600)
requested_price = models.IntegerField(default=0)
last_price = models.IntegerField(null=True, blank=True)
discount_price = models.CharField(max_length=100, null=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
우리는 기어갈 것이다eBay.사용자는 특정 항목의 URL과 요청한 가격을 입력합니다.그러면 다음 양식을 만듭니다.
형식회사 명
from django import forms
class AddNewItemForm(forms.Form):
url = forms.CharField(max_length=600)
requested_price = forms.IntegerField()
우리는 주어진 URL에서 항목의 가격과 제목을 캡처하는 데 beautifulsoup을 사용할 것입니다.데이터가 인터넷에 올라간 후에 우리는 가격을 변동으로 바꾸고 데이터베이스에 새로운 대상을 만들어야 한다.의견회사 명
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
def crawl_data(url):
# User Agent is to prevent 403 Forbidden Error
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urlopen(req).read()
bs = BeautifulSoup(html, 'html.parser')
title = bs.find('h1', id="itemTitle").get_text().replace("Details about", "")
price = bs.find('span', id="prcIsum").get_text()
clean_price = float(price.strip().replace("US", "").replace("$", ""))
return {'title': title, 'last_price':clean_price }
strip () 은 문자열의 시작과 끝에 있는 공백을 삭제하고,replace () 방법은 다른 지정한 단어로 지정한 단어를 대체합니다.그래서 우리는 이런 방법을 사용하여 프로젝트의 순가격과 제목을 얻는다.일단 데이터가 성공적으로 인터넷에 오르면 데이터베이스에 새로운 대상을 만들어야 한다.우리는 폼 제출에서 이 기능을 사용하여 새 항목의 제목과 가격을 잡을 것이다.
의견회사 명
from django.shortcuts import render, get_object_or_404,HttpResponseRedirect
from .models import Item
from .forms import AddNewItemForm
def tracker_view(request):
items = Item.objects.order_by('-id')
form = AddNewItemForm(request.POST)
if request.method == 'POST':
if form.is_valid():
url = form.cleaned_data.get('url')
requested_price = form.cleaned_data.get('requested_price')
# crawling the data
crawled_data = crawl_data(url)
Item.objects.create(
url = url,
title = crawled_data['title'],
requested_price=requested_price,
last_price=crawled_data['last_price'],
discount_price='No Discount Yet',
)
return HttpResponseRedirect('')
else:
form = AddNewItemForm()
context = {
'items':items,
'form':form,
}
return render(request, 'tracker.html', context)
너무 좋아요.이제 할인에 대한 이해를 위해 모든 객체의 데이터를 연속적으로 캡처해야 합니다.만약 우리가 미나리가 없는 상황에서 이렇게 한다면, 서버 연결이 시간을 초과할 것이다. 이것은 서버가 데이터 요청에 회답하는 시간이 너무 길고, 우리의 응용 프로그램이 붕괴될 것을 의미한다.작업을 작성합니다.미나리 미션으로 처리합시다.
임무회사 명
import time
from celery import shared_task
from .models import Vehicle
from tracker.views import crawl_data
@shared_task
# do something heavy
def track_for_discount():
items = Item.objects.all()
for item in items:
# crawl item url
data = crawl_data(item.url)
# check for discount
if data['last_price'] < item.requested_price:
print(f'Discount for {data["title"]}')
# update discount field to notify user
item_discount = Item.objects.get(id=item.id)
item_discount.discount_price = f'DISCOUNT! The price is {data["last_price"]}'
item_discount.save()
while True:
track_for_discount()
time.sleep(15)
@shared_task는 각 응용 프로그램에 대해 작업을 다시 사용할 수 있도록 독립적인 작업 실례를 만듭니다.이 때문에 @shared_ 작업 장식기는 라이브러리와 재사용 가능한 프로그램에 매우 유용합니다. 왜냐하면 사용자의 프로그램에 접근할 수 없기 때문입니다.우리는 단지 15초에 한 번씩 데이터를 캡처하여 마지막 가격과 요청한 가격을 비교할 뿐이다.만약 마지막 가격이 요구하는 가격보다 낮다면, 우리는 할인 가격 필드를 업데이트할 것이다.
만약 가격이 다시 오르면 어떻게 합니까?
@shared_task
def track_for_not_discount():
items = Item.objects.all()
for item in items:
data = crawl_data(item.url)
if data["last_price"] > item.requested_price:
print(f'Discount finished for {data["title"]}')
item_discount_finished = Item.objects.get(id=item.id)
item_discount_finished.discount_price = 'No Discount Yet'
item_discount_finished.save()
너무 좋아요.이제 할인을 정확하게 추적할 수 있습니다.더 가까운 가격을 감지하고 사용자에게 알릴 수 있는 기능을 추가할 수 있습니다.예를 들어 프로젝트 가격이 100달러라면 요청 가격은 97달러이다.하지만 이제는 간단하게 하자.마지막으로, 우리는 템플릿을 만들 수 있다.
추적기.html
{% extends 'base.html' %}
{% block content %}
<form method="POST">
{% csrf_token %}
{{form.as_p}}
<button class="btn btn-primary" type="submit">Send</button>
</form>
<table class="table">
<thead>
<tr>
<th scope="col">Title</th>
<th scope="col">Requested Price</th>
<th scope="col">Last Price</th>
<th scope="col">Discount Price</th>
<th scope="col">Date Created</th>
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td>{{item.title}}</td>
<td>{{item.requested_price}}</td>
<td>{{item.last_price}}</td>
<td>{{item.discount_price}}</td>
<td>{{item.date}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
응, 전자 우편 기능을 추가해서 항목을 개선할 수 있어. 그러면 Django가 할인에 관한 전자 우편을 보낼 거야.봐봐 How to Send Email in a Django App임의로 공헌 항목:)
아래 내 GitHub 저장소에서 이 항목을 복제할 수 있습니다.
ThePilot 회사 / 가격 추적기 어플리케이션
Python/Django 할인 추적기 어플리케이션 사용
가격 추적기 어플리케이션
Python/Django 할인 추적기 어플리케이션 사용
입문
이 강좌는 Python 3+와 Django 2+에 적용됩니다.
설치 종속성:python3 -m pip3 install -r requirements.txt
미나리 일꾼 가동:celery -A pricetracker worker -l info
다음 명령을 실행합니다.python3 manage.py makemigrations tracker
python3 manage.py migrate
python3 manage.py runserver
View on GitHub
임무 완수!
그렇습니다!당신들이 소셜 미디어에서 나를 주목하도록 하세요. 다음 글에서 다시 만나요!
Reverse Python
Reference
이 문제에 관하여(Django | 가격 추적 어플리케이션 추적 할인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/thepylot/price-tracker-application-with-django-track-discounts-889
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
python3 -m pip3 install -r requirements.txt
celery -A pricetracker worker -l info
python3 manage.py makemigrations tracker
python3 manage.py migrate
python3 manage.py runserver
Reference
이 문제에 관하여(Django | 가격 추적 어플리케이션 추적 할인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/thepylot/price-tracker-application-with-django-track-discounts-889텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)