2015-07-13 2 views
0

У меня есть процессор контекста, который управляется базой данных.Контекстные процессоры только обновление при перезапуске сервера

def on_air(request):    
    on_air = OnAir()    
    return {      
     'on_air': {    
      'now': on_air.now(), 
      'next': on_air.next(), 
     },       
    } 

Edit: Вот класс ONAIR

from collections import defaultdict 

from datetime import datetime, time 

from .models import ShowPage 


def schedule(): 
    schedule = defaultdict(list) 
    shows = ShowPage.objects.order_by(
     'weekday_start', 
     'saturday_start', 
     'sunday_start').all() 

    for show in shows: 
     for day in ('weekday', 'saturday', 'sunday',): 
      if getattr(show, '{day}_start'.format(day=day)): 
       schedule[day].append({ 
        'show': show, 
        'start': getattr(show, '{day}_start'.format(day=day)), 
        'end': getattr(show, '{day}_end'.format(day=day)), 
       }) 

    return schedule 


class OnAir: 

    def __init__(self, schedule=schedule()): 
     self.schedule = schedule 
     self.isoweekday = datetime.now().isoweekday() 
     self.current_time = datetime.now().time() 

    def now(self): 
     shows = [item for item in self.schedule[self._today()] 
       if item['start'] <= self.current_time 
       and item['end'] > self.current_time] 

     val = None 
     if shows: 
      val = shows[0] 
     else: 
      if self.current_time > time(12, 0): 
       # If no shows are found and it is after midday, 
       # then it means that the last show wraps over into the new day, 
       # eg. from 11pm to 1am the next morning 
       val = self._last_show_of_the_day(self._today()) 
      else: 
       # It is the crack of dawn and yesterday's last show 
       # started at say 11pm and carried through to say 3am today 
       val = self._last_show_of_the_day(self._yesterday()) 

     return val['show'] if val else None 

    def next(self): 
     shows = [item for item in self.schedule[self._today()] 
       if item['start'] > self.current_time] 

     val = None 
     if shows: 
      val = shows[0] 
     else: 
      val = self._first_show_of_the_day(self._tomorrow()) 

     return val['show'] if val else None 

    def _isoweekday_to_key(self, isoweekday): 
     if isoweekday == 0: 
      isoweekday = 7 

     if isoweekday == 8: 
      isoweekday = 1 

     val = 'weekday' 

     if isoweekday == 6: 
      val = 'saturday' 

     if isoweekday == 7: 
      val = 'sunday' 

     return val 

    def _today(self): 
     return self._isoweekday_to_key(self.isoweekday) 

    def _yesterday(self): 
     return self._isoweekday_to_key(self.isoweekday - 1) 

    def _tomorrow(self): 
     return self._isoweekday_to_key(self.isoweekday + 1) 

    def _first_show_of_the_day(self, today): 
     today = self.schedule[today] 
     return today[0] if today else None 

    def _last_show_of_the_day(self, today): 
     today = self.schedule[today] 
     return today[-1] if today else None 

Если я обновить базу данных и обновите страницу, ничего не меняет. Я должен перезапустить сервер dev, чтобы мои изменения появлялись.

Как это исправить?

+1

В коде, который вы указали, нет ничего, что могло бы гарантировать состояние между запросами. Вам нужно будет показать свой класс «OnAir». – Alasdair

+0

Я поделился классом OnAir ... – Lee

ответ

3

Проблема заключается в методе __init__ вашего класса OnAir.

class OnAir: 
    def __init__(self, schedule=schedule()): 

schedule() вычисляется один раз, когда модуль загружен, а не каждый раз, когда создается экземпляр OnAir, как вы могли бы ожидать.

Вы можете исправить это, изменив значение по умолчанию на None, а затем создав расписание внутри метода __init__.

class OnAir: 
    def __init__(self, schedule=None): 
     if schedule is None: 
      schedule = schedule() 
     ...