2009-05-15 3 views
1

У меня есть канал Atom создан в соответствии с http://docs.djangoproject.com/en/dev/ref/contrib/syndication/, который означает, что я что-то вродеПеренаправление Джанго кормить FeedBurner

(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}) 

в моем urls.py и что-то вроде

class MyFeed(Feed): 
    ... 

в моем feeds.py.

Я хотел бы redirect traffic от этого фида до FeedBurner. Я должен сделать это в Django, поскольку на моем сервере нет mod_rewrite.


Я предполагаю, что я должен изменить urls.py запись в

(r'^feeds/(?P<url>.*)/$', 'feeds.redirect', {'feed_dict': feeds}) 

и дополнения feeds.py с

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 

def redirect(request, **kwargs): 
    if request.META['HTTP_USER_AGENT'] == 'FeedBurner': 
     view = 'django.contrib.syndication.views.feed' 
     return HttpResponseRedirect(reverse(view, kwargs=kwargs)) 
    else: 
     return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeed') 

но это, кажется, не работает, как я получаю следующую ошибку (у вас есть изменить == на !=, чтобы увидеть это):

NoReverseMatch в/Корма/myfeed/

реверса '<function feed at 0x16a2430>' с аргументами '()' и именованных аргументов '{' URL ': u'myfeed', 'feed_dict': { 'myfeed': <class 'feeds.MyFeed'>} }' не найдено.

Как это можно решить?

ответ

2

Проблема заключается в том, что вы удалили ссылку django.contrib.syndication.views.feed с вашего urls.py.

Вместо использования обратного перенаправления на другой URL, попробуйте просто возвращая фид из существующего вида:

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.contrib.syndication.views import feed 

def redirect(request, **kwargs): 
    if request.META['HTTP_USER_AGENT'].startswith('FeedBurner'): 
     return feed(request, **kwargs) 
    else: 
     return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeed') 
+1

Пользовательский агент FeedBurner содержит номер версии и URL-адрес. Ваша проверка должна быть request.META ['HTTP_USER_AGENT']. Startswith ('FeedBurner'). –

+0

Я просто скопировал чек из вопроса ... но я обновил ответ с правильной проверкой –

0

Ну, я думаю, это поможет кому-то, кто задается вопросом, что это правильный способ сделать это in django 1.3+

from django.http import HttpResponseRedirect 
from feeds import MyFeed #your feed class, check https://docs.djangoproject.com/en/1.3/ref/contrib/syndication/ 

def burnedFeed(request, **kwargs): 
    if request.META['HTTP_USER_AGENT'].startswith('FeedBurner'): 
     feed = MyFeed() 
     return feed(request) 
    else: 
     return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeedName') 
Смежные вопросы