Почему мой фрагмент django не работает? - PullRequest
1 голос
/ 30 июля 2011

Я собрал функцию для связи с новостями с django в качестве фильтра.Он работает на dev_appserver, но на рабочем сервере возвращает None Можете ли вы сказать мне, почему он не работает?Должен ли я исследовать предложение "исключение" кода, в котором он в данный момент только проходит?

def news(n):
    url = os.environ.get('HTTP_HOST') if os.environ.get('HTTP_HOST') else os.environ['SERVER_NAME']
    tld = url[url.rfind('.'):]    
    try:        
        if url == 'localhost:8080':
            result = urlfetch.fetch('http://news.google.se/?output=rss')    
        elif tld != '.com' and tld != '.se' and tld != '.cl' :
            result = urlfetch.fetch('http://news.google.com'+tld+'/?output=rss') 
        else:      
            result = urlfetch.fetch('http://news.google.com/?output=rss')        
        if result.status_code == 200:
            dom = minidom.parseString(result.content)
            item_node = dom.getElementsByTagName("item")
            try:
                random_1=random.choice(item_node)
                rss1_link = random_1.childNodes[1].firstChild.data
                rss1_text = random_1.childNodes[0].firstChild.data
                return mark_safe('<a href="%s">%s</a>' % (rss1_link, rss1_text))
            except IndexError,e:
                return ''
    except urlfetch.Error, e:
        pass

register.filter(news)

Обновление: теперь он возвращает пустую строку в производственном процессе, но локально это работает.Это что-то еще, что статус 200 на производстве:

def news(n):
    url = os.environ.get('HTTP_HOST') if os.environ.get('HTTP_HOST') else os.environ['SERVER_NAME']
    tld = url[url.rfind('.'):]    
    try:        
        if url == 'localhost:8080':
            result = urlfetch.fetch('http://news.google.se/?output=rss')    
        elif tld != '.com' and tld != '.se' and tld != '.cl' :
            result = urlfetch.fetch('http://news.google.com'+tld+'/?output=rss') 
        else:        
            result = urlfetch.fetch('http://news.google.com/?output=rss')        
        if result.status_code == 200:
            dom = minidom.parseString(result.content)
            item_node = dom.getElementsByTagName("item")
            try:
                random_1=random.choice(item_node)
                rss1_link = random_1.childNodes[1].firstChild.data
                rss1_text = random_1.childNodes[0].firstChild.data
                return mark_safe('<a href="%s">%s</a>' % (rss1_link, rss1_text))        
            except IndexError,e:
                return ''
        else:
            return ''
    except urlfetch.Error, e:
        logging.error(str(e))
        return ''

РЕДАКТИРОВАТЬ: Вот самое простое воспроизведение, которое возвращает статус 200 локально и статус 503 на производстве

def status(n):
    try:             
        result = urlfetch.fetch('http://news.google.com/?output=rss')       
        return str(result.status_code)
    except urlfetch.Error, e:
        return 'error'

Обновление: вот решениеЯ сейчас пользуюсь.Это все еще нуждается в улучшении, так как есть возможность выбора 2 одинаковых новостей:

import random
def updateFeed(url):#to do, get srv from url and find number of entries
    srv = os.environ.get('HTTP_HOST') if os.environ.get('HTTP_HOST') else os.environ['SERVER_NAME']
    tld = srv[srv.rfind('.'):] 
    url = 'http://news.google.com/?output=rss'
    if srv.endswith('.com.br'):
        url = 'http://news.google.com.br/?output=rss'
    elif srv == 'localhost:8080' or srv.endswith('alltfunkar.com'):
        url = 'http://news.google.se/?output=rss'
    elif tld != '.com' and tld != '.se' and tld != '.cl' :
        url = 'http://news.google.com'+tld+'/?output=rss'
    query_args = { 'q': url, 'v':'1.0', 'num': '15', 'output': 'json' }
    qs = urllib.urlencode(query_args)
    loader = 'http://ajax.googleapis.com/ajax/services/feed/load'
    loadurl = '%s?%s' % (loader, qs)
    logging.info(loadurl)
    result = urlfetch.fetch(url=loadurl,headers={'Referer': '...'})
    if result.status_code == 200:
        news = simplejson.loads(result.content) 

        """ not working, using random.randrange instead
        some_key = random.choice(news.keys())
        something = news[some_key]
        """
        i = random.randrange(0,10)#to do: instead of 10, it should be number of entries
        title = news[u'responseData'][u'feed'][u'entries'][i][u'title']
        link = news[u'responseData'][u'feed'][u'entries'][i][u'link']
    return mark_safe('<a href="%s">%s</a>' % (link, title))

1 Ответ

2 голосов
/ 30 июля 2011

Python-функции, которые явно return ничего не возвращают, None.Если этот код возвращает None на вашем производственном сервере, возможно, это происходит потому, что он попадает в последний блок except: pass, как вы упомянули.

Не читая реальный код (которого у меня нет), я 'скажем, замените это pass на return '', чтобы безопасно проглотить urlfetch.Error или , решить, что вы хотите, чтобы произошло в этом случае, и реализовать новый код для этого блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...