2016-11-17 10 views
2

こんにちは、私は、ウェブサイトを掻き集め、データベースのモデル(MOVIE)の一部として格納する必要がありますcronジョブをスケジュールする問題があります。問題は、Procfileが実行される前にモデルがロードされているように見えることです。バックグラウンドで内部的に実行され、スクレイプされた情報をデータベースに格納するcronジョブを作成するにはどうすればよいですか?ここに私のコードは次のとおりです。問題Djangoプロジェクトにapschedulerを使用してProcfile(Heroku)でCronジョブを定義する

Procfile:

web: python manage.py runserver 0.0.0.0:$PORT 
    scheduler: python cinemas/scheduler.py 

scheduler.py:

# More code above 
from cinemas.models import Movie 
from apscheduler.schedulers.blocking import BlockingScheduler 
sched = BlockingScheduler() 

@sched.scheduled_job('cron', day_of_week='mon-fri', hour=0, minutes=26)  
def get_movies_playing_now(): 
    global url_movies_playing_now 
    Movie.objects.all().delete() 
    while(url_movies_playing_now): 
    title = [] 
    description = [] 
    #Create BeatifulSoup Object with url link 
    s = requests.get(url_movies_playing_now, headers=headers) 
    soup = bs4.BeautifulSoup(s.text, "html.parser") 
    movies = soup.find_all('ul', class_='w462')[0] 

    #Find Movie's title 
    for movie_title in movies.find_all('h3'): 
     title.append(movie_title.text) 
    #Find Movie's description 
    for movie_description in soup.find_all('ul', 
              class_='w462')[0].find_all('p'): 
     description.append(movie_description.text.replace(" [More]",".")) 

    for t, d in zip(title, description): 
     m = Movie(movie_title=t, movie_description=d) 
     m.save() 

    #Go to the next page to find more movies 
    paging = soup.find(class_='pagenating').find_all('a', class_=lambda x: 
                 x != "inactive") 
    href = "" 
    for p in paging: 
     if "next" in p.text.lower(): 
      href = p['href'] 
    url_movies_playing_now = href 

sched.start() 
# More code below 

from django.db import models 

映画館/ models.py:これは私が取得していますエラーがある

#Create your models here. 

class Movie(models.Model): 
    movie_title = models.CharField(max_length=200) 
    movie_description = models.CharField(max_length=20200) 

ジョブが実行されます。

2016-11-17T17:57:06.074914 + 00:00 app [scheduler.1]:トレースバック(直近のコール最後): 2016-11-17T17:57:06.074931 + 00:00 app [scheduler。 1]:ファイル "cinemas/scheduler.py"、2行目 2016-11-17T17:57:06.075058 + 00:00 app [scheduler.1]:import cineplex 2016-11-17T17:57:06.075060+ 00:00 app [scheduler.1]:ファイル "/app/cinemas/cineplex.py"、行1、 2016-11-17T17:57:06.075173 + 00:00 app [scheduler.1]:映画館から。モデルインポート動画 2016-11-17T17:57:06.075196 + 00:00 app [scheduler.1]:ファイル "/app/cinemas/models.py"、行5、 2016-11-17T17:57:06.075295 + 00:00 app [scheduler.1]:クラスムービー(models.Model): 2016-11-17T17:57:06.075297 + 00:00 app [scheduler.1]:ファイル " /app/.heroku/python/lib/python3.5/site-packages/base.py "、行105、新規 2016-11-17T17:57:06.075414 + 00:00 app [scheduler.1]:app_config = apps.get_containing_app_config(module) 2016-11-17T17:57:06.075440 + 00:00 app [scheduler.1]:ファイル "/app/.heroku/python/lib/python3。 get_containing_app_config2016-11-17T17:57:06.075585 + 00:00 app [scheduler.1]:self.check_apps_ready() の5/site-packages/django/apps/registry.py "行237 -17T17:57:06.075586 + 00:00 app [scheduler.1]:ファイル "/app/.heroku/python/lib/python3.5/site-packages/django/apps/registry.py"、124行目check_apps_ready 2016-11-17T17:57:06.075703 + 00:00 app [scheduler.1]:raise AppRegistryNotReady( "アプリがまだロードされていません") 2016-11-17T17:57:06.075726 + 00:00 app [sch eduler.1]:django.core.exceptions.AppRegistryNotReady:アプリケーションはまだ読み込まれていません。

モデルオブジェクトが含まれていないとCronジョブが正常に動作します。モデルオブジェクトを使用して毎日このジョブを実行する必要がありますか?あなただけのDjangoのパッケージ、モデル、などをインポートすることができないためです

おかげ

答えて

2

; Django内部では、manage.pyからトリガされた初期化が必要です。自分ですべてを試して再作成するのではなく、私は常にカスタムコマンド(https://docs.djangoproject.com/en/1.10/howto/custom-management-commands/参照)として長く実行される非Webコマンドを書きます。たとえば、アプリがcinemasの場合、

  • ./cinemas/management/commands/scheduler.pyを作成します。そのクラスにそのファイルに
  • 、サブクラスdjango.core.management.base.BaseCommand(そのサブクラスがCommand呼び出さなければならない)
  • handle()をオーバーライドします。あなたはsched.start()
  • を呼びたい場所をあなたのケースでは、それはあなたのProcfileはその後に役立ちますscheduler: python manage.py scheduler

希望を持つことになります。

+0

ありがとうございます!これは私のために働く:) –

0

あなたはDjangoのドキュメントit says

あなたはジャンゴのコンポーネントを使用している場合は、「スタンドアロンでは、あなたのsceduler.py

import django 
django.setup() 

の先頭に次の行を追加することで問題を解決することができますたとえば、いくつかのDjangoテンプレートを読み込んでレンダリングするPythonスクリプトを作成するか、またはORMを使ってデータを取得するなど、設定を行うことに加えてもう1つ必要なステップがあります。

DJANGO_SETTINGS_MODULEを設定した後、またはconfigure()を呼び出した後で、django.setup()を呼び出して設定を読み込み、Djangoのアプリケーションレジストリに値を設定する必要があります。たとえば:

import django 
from django.conf import settings 
from myapp import myapp_defaults 

settings.configure(default_settings=myapp_defaults, DEBUG=True) 
django.setup() 

# Now this script or any imported module can use any part of Django it needs. 
from myapp import models 

私は私のスケジューラにそれを追加していない設定変数としてDJANGO_SETTINGS_MODULEを設定します。

関連する問題