【问题标题】:Passing RSS feeds to django view using AJAX使用 AJAX 将 RSS 提要传递给 django 视图
【发布时间】:2015-04-23 15:06:20
【问题描述】:

我对 ajax 很陌生。以下是我的用例: 我正在开发一个附带项目,将显示不同运动的新闻和分数。为了执行相同的操作,我使用来自不同来源的 RSS 提要。我能够使用“feedparser”插件在 django 视图中获取和解析 rss 提要,并将与上下文相同的内容传递给相应的模板。以下是我的视图函数和模板(用于板球)。

def cricket(request):
    feeds_cric = feedparser.parse('http://www.espncricinfo.com/rss/content/story/feeds/0.xml') #espncricinfo feed.
    feeds_cric_scores = feedparser.parse('http://static.cricinfo.com/rss/livescores.xml') #espncricinfo feed.
    context = {'feeds_cric': feeds_cric,'feeds_cric_scores' : feeds_cric_scores}
    return render(request,'scorecenter/cricket.html', context)

下面是对应的模板。

{% extends "scorecenter/index.html" %}
{% block content %}
    <ul>
        {% for entry in feeds_cric.entries %}
        <li><a href="{{ entry.link }}">{{ entry.title }}</a></li>
        <p>{{ entry.description }}</p>
        {% endfor %}
    </ul>

{% endblock content %}

{% block score %}
    <ul>
        {% for entry in feeds_cric_scores.entries %}
        <li><a href="{{ entry.link }}">{{ entry.title }}</a></li>
        <!-- <p>{{ entry.description }}</p> -->
        {% endfor %}
    </ul>
{% endblock score %}    

下面是 index.html 文件。

现在,我想使用 AJAX 仅重新加载页面的某些块,而不是重新加载和重定向整个页面。我写了一个脚本来检查

<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container-fluid">
            <div class="navbar-header">
                <a class="navbar-brand" href="#">Allscores</a>
            </div>
            <div>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#" onclick="urlChecker('cricket')">Cricket</a></li>
                    <li><a href="#" onclick="urlChecker('football')">Football</a></li>
                    <li><a href="#" onclick="urlChecker('basketball')">Basketball</a></li>
                    <li><a href="#" onclick="urlChecker('tennis')">Tennis</a></li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="navbar navbar-default" id="empty_nav"></div>

    <div class="testingData">This should be updated</div>

    <div class="row">
        <div class="col-sm-8" id="news">

            <h3>Latest News</h3>
            {% block content %}
            {% endblock content %}

        </div>
        <div class="col-sm-4" id="scores">

            <h3>Latest scores</h3>
            {% block score %}
            {% endblock score %}

        </div>
    </div>

    <div id="footer">
        Copyright © acllscores.com
    </div>
</body>

在我的 urlChecker() 脚本中,我检查单击了哪个锚标记并分配相应的 url。以下是脚本:

function urlChecker (route) {
    switch(route) {
        case 'cricket':
            $.post( "/scorecenter/cricket/", function( data ) {
                $( ".result" ).html( data );
            });
            break;
        case 'football':
            $.post( "/scorecenter/football/", function( data ) {
                $( ".testingData" ).html( data );
            });
            break;
        case 'tennis':
            $.post( "/scorecenter/tennis/", function( data ) {
                $( ".testingData" ).html( data );
            });
            break;
        case 'basketball':
            $.post( "/scorecenter/basketball/", function( data ) {
                $( ".testingData" ).html( data );
            });
            break;

    }
}

更新: 添加 urls 文件:

urlpatterns = patterns('',
    url(r'^$', views.index,name='index'),
    url(r'^test/$', views.test,name='test'),

    url(r'^cricket/$', views.cricket,name='cricket'),
    url(r'^basketball/$', views.basketball,name='basketball'),
    url(r'^football/$', views.football,name='football'),
    url(r'^tennis/$', views.tennis,name='tennis'),

)

我不明白如何使用 ajax 将提要数据发布到我的模板。 请帮忙

【问题讨论】:

  • 您在发布到的 URL 上是否有实际的端点(例如 /scorecenter/basketball/)?如果有,它们长什么样?此外,index.html 示例上方的文本似乎在“...检查...”。您目前遇到什么错误?
  • 嗨,是的,我有指向 URL 的端点。使用 urls.py 文件的内容更新问题。目前我通过调试能够理解的是,我的视图函数没有向 ajax 调用返回任何数据,对 url '127.0.0.1:8000/scorecenter/cricket' 的请求处于挂起状态。
  • 刚刚看到您更新的评论。如果您的端点视图通过直接通过其 url 打开它们来工作,那么接下来检查浏览器的开发工具,ajax 请求返回的状态代码。我在下面的答案中写了一些可能与问题相关的点。

标签: javascript ajax django rss


【解决方案1】:

从 Ajax 的角度来看

根据您在问题中所写的内容,发送GET 请求比发送POST 请求更合适。您不会向这些端点发送需要存储的任何信息,而只想从它们检索更新。这不会改变您的代码,您可以使用 $.get() 而不是 $.post()


从 Django 的角度来看

发送GET 请求也更容易,因为您不需要考虑☞ Django's CSRF protection。发出其他 ajax 请求(如 POSTDELETE 等)也不是那么难,但它需要一个额外的步骤,涉及在每个请求中发送 CSRF 令牌(在链接文档中有详细记录)。


呈现来自 Ajax 请求的结果

目前,您用于呈现 Ajax 结果的模板可能存在概念性问题,例如scorecenter/cricket.html。在最顶部,您从index.html 扩展,这意味着每个请求不仅会返回您要插入的html 块,还会返回属于index.html 的任何内容。

此外,由于您将通过 Javascript 将结果插入到已加载的网站中,因此您无需定义模板块。让这些模板仅渲染您想要插入到 DOM 中的带有 $('.testingData').html(data) 的 html。


Ajax 请求的调试问题

在开发您的网站时,在您的浏览器中打开开发者工具并在其中激活控制台(Firefox 和 Chrome 都可以)。每当 Ajax 请求失败时,它都会在那里显示一个错误,然后您可以自省。

常见错误是404(如果找不到端点)、400403(如果请求未经授权)或500(如果服务器在处理您的请求时出错)。 ☞ More complete list of status codes

请随时更新您的问题以提供更多详细信息。由于这是一个非常广泛的主题,因此请准备好它可能会被社区关闭。在这种情况下,您可以随时搜索更具体的问题,或者如果您没有找到答案,请将其放入新问题中。

【讨论】:

  • 您好,感谢您提供详细且内容丰富的回复。我现在正在使用 get() 方法。正在加载模板并从我的视图函数传递提要对象,截至目前收到 500 错误。如果无法解决错误,将更新。
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多