2012-12-06 82 views
2

我在django開發一個應用程序,並使用backbone.js。這些網址使用骨幹路由器進行路由。我的HTML是在一個靜態頁面,當我點擊一個鏈接,例如href="/user/home",一個頁面被加載,如果我刷新瀏覽器(發送一個HTTP請求)的URL,我得到錯誤404,因爲Django的URL沒有那個URL 。url dispatch using backbone.js

我有一個senario,我正在使用Facebook(django_facebook)登錄,每當我點擊鏈接Facebook登錄,我就會得到一個空白頁面(就像任何其他無效的URL會因爲這個* splats的方式 - - {"*action" : "defaultRoute"}見下面的代碼),當我刷新瀏覽器它的作品(打開fb標籤登錄。),因爲我有url(r'^facebook/', include('django_facebook.urls')),在URLS.PY.

我的問題是如何將點擊鏈接並具有開放FB選項卡或彈出窗口,因爲在這種情況下,它不工作,我不得不打網址在瀏覽器中爲它工作。

Backbone.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; 
    ... 

感謝。

+0

是不是應該在散列(#)之後附加的主幹路由?對我來說,似乎路由根本不起作用。 – migajek

+1

@ migajek只在不支持HTML5歷史記錄對象的瀏覽器中(IE8和IE9我在看着你) – tkone

回答

0

所以這聽起來像你在這裏問兩個問題。

第一個問題涉及到您的Django應用程序沒有您的Backbone路由器中的路由。因此,當路由器接管它時,實際上會將新的歷史記錄推入瀏覽器的歷史堆棧(除非在使用散列片段時位於IE8中)。這意味着您的瀏覽器在您重新加載時將從服務器請求該資源。

爲了防止404的發生,你要麼必須不使用歷史記錄對象或確保所有存在於你的骨幹路由器也都在你的Django URL配置鏡像的路由。

你有的第二個問題是使用Facebook登錄。你應該分開這個問題的部分並重新提問,因爲它也是關於你正在使用的Django插件,如果你這樣做,你會得到更好的牽引力。