为什么我的Django代码片段不工作?
我写了一个函数,用来通过django过滤新闻项目。这个函数在开发环境下运行正常,但在生产环境中却返回了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'
更新:这是我目前使用的解决方案。它仍然需要改进,因为有可能选择到两个相同的新闻项目:
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
在Python中,如果一个函数没有明确地使用return
返回任何东西,它默认会返回None
。如果你的代码在生产服务器上返回None
,很可能是因为它执行到了最后的except: pass
这一块,就像你提到的那样。
虽然我没有看具体的代码,但我建议把pass
换成return ''
,这样可以安全地处理urlfetch.Error
,或者你可以决定在这种情况下想要发生什么,并为这一块写一些新的代码。