이 내 파일 구조내가 오류 메시지를받을
venv/
|-src/
|-gettingstarted/
| |-settings/
| |-__init__.py
| |-base.py
| |-local.py
| |-production.py
|
|-blog/
| |-__init__.py
| |-admin.py
| |-forms.py
| |-models.py
| |-tasks.py
| |-urls.py
| |-views.py
|
|-manage.py
내 views.py입니다
from .tasks import add, p_panties
def shopan(request):
# one = scrape_and_store_world()
# two = panties()
# argument_scrapes(one, two)
p_panties.delay()
return redirect('/')
내에서
import requests
import random
import re
import os
from celery import Celery
from bs4 import BeautifulSoup
app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')
@app.task
def add(x, y):
return x + y
@app.task
def reverse(string):
return string[::-1]
@app.task
def p_panties():
def swappo():
user_one = ' "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0" '
user_two = ' "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5)" '
user_thr = ' "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko" '
user_for = ' "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0" '
agent_list = [user_one, user_two, user_thr, user_for]
a = random.choice(agent_list)
return a
headers = {
"user-agent": swappo(),
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"accept-charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"accept-encoding": "gzip,deflate,sdch",
"accept-language": "en-US,en;q=0.8",
}
pan_url = 'http://www.example.com'
shtml = requests.get(pan_url, headers=headers)
soup = BeautifulSoup(shtml.text, 'html5lib')
video_row = soup.find_all('div', {'class': 'post-start'})
name = 'pan videos'
def youtube_link(url):
youtube_page = requests.get(url, headers=headers)
soupdata = BeautifulSoup(youtube_page.text, 'html5lib')
video_row = soupdata.find_all('p')[0]
entries = [{'text': div,
} for div in video_row]
tubby = str(entries[0]['text'])
urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', tubby)
cleaned_url = urls[0].replace('?&autoplay=1', '')
return cleaned_url
def yt_id(code):
the_id = code
youtube_id = the_id.replace('https://www.example.com/embed/', '')
return youtube_id
def strip_hd(hd, move):
str = hd
new_hd = str.replace(move, '')
return new_hd
entries = [{'href': div.a.get('href'),
'text': strip_hd(strip_hd(div.h2.text, '– Official video HD'), '– Oficial video HD').lstrip(),
'embed': youtube_link(div.a.get('href')), #embed
'comments': strip_hd(strip_hd(div.h2.text, '– Official video HD'), '– Oficial video HD').lstrip(),
'src': 'https://i.ytimg.com/vi/' + yt_id(youtube_link(div.a.get('href'))) + '/maxresdefault.jpg', #image
'name': name,
'url': div.a.get('href'),
# 'author': author,
'video': True
} for div in video_row][:13]
return entries
tasks.py 내 터미널
(practice) apples-MBP:blog ray$ celery worker -A tasks -l info
[2016-09-14 11:30:14,537: WARNING/MainProcess] /Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/celery/apps/worker.py:161: CDeprecationWarning:
Starting from version 3.2 Celery will refuse to accept pickle by default.
The pickle serializer is a security concern as it may give attackers
the ability to execute any command. It's important to secure
your broker from unauthorized access when using pickle, so we think
that enabling pickle should require a deliberate action and not be
the default choice.
If you depend on pickle then you should set a setting to disable this
warning and to be sure that everything will continue working
when you upgrade to Celery 3.2::
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
You must only enable the serializers that you will actually use.
warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))
-------------- [email protected] v3.1.23 (Cipater)
---- **** -----
--- * *** * -- Darwin-15.6.0-x86_64-i386-64bit
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x1037836a0
- ** ---------- .> transport: redis://localhost:6379//
- ** ---------- .> results: redis://localhost/
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
[tasks]
. tasks.add
. tasks.p_panties
. tasks.reverse
[2016-09-14 11:30:14,689: INFO/MainProcess] Connected to redis://localhost:6379//
[2016-09-14 11:30:14,702: INFO/MainProcess] mingle: searching for neighbors
[2016-09-14 11:30:15,710: INFO/MainProcess] mingle: all alone
[2016-09-14 11:30:15,723: WARNING/MainProcess] [email protected] ready.
내가 내 프로그램을 실행하려고하면
내가 얻을이 오류 메시지는 자세한 내용
[2016-09-14 11:30:32,171: ERROR/MainProcess] Received unregistered task of type 'blog.tasks.p_panties'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see
here입니다.
The full contents of the message body was:
{'timelimit': (None, None), 'task': 'blog.tasks.p_panties', 'chord': None, 'taskset': None, 'errbacks': None, 'id': 'd9814eb1-98a9-4b45-b049-e36ac64fc55c', 'retries': 0, 'args': [], 'utc': True, 'expires': None, 'eta': None, 'kwargs': {}, 'callbacks': None} (263b)
Traceback (most recent call last):
File "/Users/ray/Desktop/myheroku/practice/lib/python3.5/site-packages/celery/worker/consumer.py", line 456, in on_task_received
strategies[name](message, body,
KeyError: 'blog.tasks.p_panties'
내가 이것을 사용할 수 있도록 앱으로 만들어야하나요? 당신이 나를 제안
편집
이내 블로그/celery.py가 그것을 나는 셀러리 노동자를 실행하는 방법
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault(
'DJANGO_SETTINGS_MODULE', 'gettingstarted.settings'
)
app = Celery('tasks')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
를 작성
celery worker -A tasks -l info
와 나는 그것을 실행 해요 blog 디렉토리는 그것이 tasks.py가있는 곳이기 때문에, 그렇지 않으면 내가 src에서 실행한다면
No module named 'tasks'
내가 SRC에서 실행하면
는하지만 난 당신이 경우 you're not familiar with it's possible side effects에 피클를 사용하지 말하고, 긴 경고를 받고있어
Parent module '' not loaded, cannot perform relative import
** app = Celery ('blog') **! 거기에 작업을 넣지 마십시오. 모듈의 이름입니다. 그래서 app = Celery ('blog')를 실행하고 src 폴더에서 * celery worker -A blog -l info *를 실행합니다. 이것이 도움이되는지보십시오. 문제가 지속되면 게시물에서 현재 사용중인 tasks.py도 업데이트하십시오. – SpiXel
@SpiXel이 작동했습니다. 내가 읽은 튜토리얼에서 Celery()의 첫 번째 매개 변수는 그것이 상주하는 파일의 이름을 따서 명명되었다. 내가 셀러리 ('tasks')를 갖기 전에는 tasks.py에 있었다. 내가 샐러리 (즉, 셀러리 ('이온')에서 나는 셀러리 작업자 - 이온 - 정보처럼 실행해야합니다. 내가 그것을 실행할 때 (아직 쉘을 시도하지 않은) 오류가 없지만, add.delay (1,2)를 사용할 때 브라우저에서 계산이 일어나지 않을 때 그대로 유지된다. 고마워요. 당신은 내 목표를 달성하는 데 가장 가까운 곳에서 왔습니다. 하루가 끝나기 전에 당신은 아마 저에게 다시 응답 할 것입니다. – losee
달릴 수 있다는 말을 듣고 반갑습니다. 이제 실제로 정의한 작업을 실행하지 않는 경우 먼저 manage.py 셸에서 작업을 가져 와서 .delay()를 실행하고 셀러리 셸에서 이에 대한 정보를 제공하는지 확인합니다 과제를 받는다. – SpiXel