2

我正在 django 中开发一个应用程序,并且正在使用backbone.js。url 使用骨干路由器路由。我的 HTML 在一个静态页面中,当我单击一个链接时,例如href="/user/home",加载了一个页面,如果我用 url 刷新浏览器(发送 http 请求),我会收到错误 404,因为 django url 没有那个 url。

我有一个使用 facebook (django_facebook) 登录的场景,每当我点击 Facebook 登录链接时,我都会得到一个空白页面(就像任何其他无效 url 会因为这个 *splats 而做的那样——{"*action" : "defaultRoute"}见下面的代码),当我刷新浏览器时,它可以工作(打开 fb 选项卡进行登录。)因为我url(r'^facebook/', include('django_facebook.urls'))在 URLS.PY 中有 ,。

我的问题是如何单击链接并打开 fb 选项卡或弹出窗口,因为在这种情况下它不起作用,我必须在浏览器中点击 url 才能工作。

骨干网.js路由器

Api.Routers.MainRouter = Backbone.Router.extend({
routes: {
    ":user/messages/:action/:target": "messagesAction",
    ":user/challenge/:action/:target" : "gameScores",
    ":user/challenge/:action/:target/:bet" : "challengeResult",
    ":user/challenge/:action": "challengeAction",
    ":user/:action" : "userAction",
    ":user/friends/:action/:target" : "friendsAction",
    "*action" : "defaultRoute"
},
messagesAction: function (user, action, target) {
    myScrollAction = action;
    conversationAction (action);
    //HIGHTLIGHT FOOT NAV
    $(".selected").removeClass("selected");
    $("#nav-messages").parents("li").addClass("selected");

    $(".message-friend-name").html(target.replace(/%20/g, " "))
},
challengeResult: function (user, action, target, bet) {
    defaultRouterAction (action);
    myScrollAction = action;
    ...

谢谢。

4

1 回答 1

0

所以听起来你在这里问了两个问题。

第一个问题涉及这样一个事实,即您的 Backbone 路由器中有您的 Django 应用程序没有的路由。

因此,当路由器接管时,它实际上会将新历史推送到浏览器的历史堆栈中(除非您在 IE8 和 9 中使用哈希片段时)。这意味着当您点击重新加载时,您的浏览器将向服务器请求该资源。

为了防止 404 发生,您要么不使用历史对象,要么确保 Backbone 路由器中存在的所有路由也都镜像到 Django URL 配置中。

您遇到的第二个问题是关于使用 Facebook 登录。您应该将问题的这一部分分开并重新提出,因为它也与您正在使用的 Django 插件有关,如果您这样做,您将获得更好的牵引力。

于 2012-12-06T19:36:58.960 回答