2016-09-14 8 views
0

이 내 파일 구조내가 오류 메시지를받을

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 
+0

** app = Celery ('blog') **! 거기에 작업을 넣지 마십시오. 모듈의 이름입니다. 그래서 app = Celery ('blog')를 실행하고 src 폴더에서 * celery worker -A blog -l info *를 실행합니다. 이것이 도움이되는지보십시오. 문제가 지속되면 게시물에서 현재 사용중인 tasks.py도 업데이트하십시오. – SpiXel

+0

@SpiXel이 작동했습니다. 내가 읽은 튜토리얼에서 Celery()의 첫 번째 매개 변수는 그것이 상주하는 파일의 이름을 따서 명명되었다. 내가 셀러리 ('tasks')를 갖기 전에는 tasks.py에 있었다. 내가 샐러리 (즉, 셀러리 ('이온')에서 나는 셀러리 작업자 - 이온 - 정보처럼 실행해야합니다. 내가 그것을 실행할 때 (아직 쉘을 시도하지 않은) 오류가 없지만, add.delay (1,2)를 사용할 때 브라우저에서 계산이 일어나지 않을 때 그대로 유지된다. 고마워요. 당신은 내 목표를 달성하는 데 가장 가까운 곳에서 왔습니다. 하루가 끝나기 전에 당신은 아마 저에게 다시 응답 할 것입니다. – losee

+0

달릴 수 있다는 말을 듣고 반갑습니다. 이제 실제로 정의한 작업을 실행하지 않는 경우 먼저 manage.py 셸에서 작업을 가져 와서 .delay()를 실행하고 셀러리 셸에서 이에 대한 정보를 제공하는지 확인합니다 과제를 받는다. – SpiXel

답변

0

를 얻을. 따라서 json을 사용하기 위해 셀러리 시리얼 라이저를 설정하는 것이 좋습니다.

CELERY_TASK_SERIALIZER = 'json' 

지금은 주요 문제의 오류가 나타냅니다으로 실행 되 고하는 것은입니다 작업, blog.tasks.p_panties하지만 셀러리 노동자를 실행하는 표시의 출력으로, 셀러리에 등록되어 작업, tasks.p_panies입니다.

당신이 당신의 tasks.py 내부, 셀러리 응용 프로그램의 인스턴스를 생성하고 있기 때문에 문제가 발생한다, 그래서 작업처럼 이름으로 작업을 등록합니다. *을.

루트 디렉토리에 celery.py을 만들고 거기에 셀러리 응용 프로그램을 설치 한 다음 마지막으로 해당 app 객체를 tasks.py 파일로 가져 오는 것입니다. 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', DEFAULT_SETTINGS_MODULE 
) 

app = Celery('app_name') 

# 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) 

다음.평, 아래와 같이 가져 :

from blog.celery import app 

에서 볼 수있는 바와 같이 에서, celery.py 파일에, 나는 셀러리를 인스턴스화하고 app.config_from_object('django.conf:settings')라고했습니다. 이렇게 셀러리는 장고 설정 파일에서 구성 매개 변수를 읽습니다. 그래서 모든 셀러리 설정, BROKER_URL 및 기타 설정을 포함, 거기에 갈 것이다

편집

(당신은 셀러리 객체에 직접 전달하는 것을)와 같은 셀러리 실행하지 않는 : celery worker -A tasks -l info

을 그것을 실행하십시오 : celery worker -A project_name -l info

+0

자습서는 왜 사람들을 위해 작동하는 것처럼 보입니까? 나는 정확히 무엇을 해야할지 잘 알고 있습니다. 그런 식으로 작동하지 않는 이유는 무엇입니까? – losee

+0

샐러리 (Celery) 문서는 실제로 다소 엉망이며 잘못된 것입니다. routing_keys와 queue, kombu queue와 amqp queue의 차이 등입니다. 그러나이 도구는 고급 도구이며 작동 방식에 익숙해지기 위해서는 시간과 노력이 필요합니다. – SpiXel

+0

('django.conf : settings')도 내 설정 파일에있는이 DEFAULT_SETTINGS_MODULE = 'gettingstarted.settings'에 적용되거나 설정을 가져 와서 명시 적으로 가져와야합니까? gettingstarted.settings.local 가져 오기 DEFAULT_SETTINGS_MODULE – losee