在AngularJS中使用带Django的html5Mode true

时间:2015-03-11 17:50:35

标签: django angularjs

我正在使用AngularJS应用Django Rest Framework。但是,我已经设置了我的项目,以便Angular页面在我的设置的templates文件夹中提供,以便

url(r'^$', index)

def index(request):
    return render(request, 'index.html', {})

我在Django的/网址上运行了角度应用,并设置了我的ngRoutes,如下所示:

var sgApp = angular.module('sgApp', [
        'ngRoute',
    ]);

sgApp.config(['$routeProvider','$locationProvider',
    function($routeProvider, $locationProvider){
        $routeProvider.when('/',{
            templateUrl: '/static/partials/index.html'
        });
        $locationProvider.html5Mode(true);
    }
]);

但是,当我尝试访问localhost:8000/some-random-url这样的无效网址时,它会重定向到Django内置的404页面。我有办法解决这个问题吗?或者我是否必须从其余框架中完全抽象角度应用程序?

2 个答案:

答案 0 :(得分:4)

您需要在angularjs路由器中添加默认路由值(otherwhise

sgApp.config(['$routeProvider','$locationProvider',
    function($routeProvider, $locationProvider){
        $routeProvider.when('/',{
            templateUrl: '/static/partials/index.html'
        })
        .otherwise({
            redirectTo: '/'
         });

        $locationProvider.html5Mode(true);
    }
]);

然后将其添加到urls.py

的底部
url(r'^.*$', index),

这意味着如果请求的网址与之前的网址规则不匹配,请重定向到index。请注意*

中的^.*$

答案 1 :(得分:1)

对于Django / DRF,一系列路由的索引路由为.*$为最后一个:

urlpatterns = patterns(
    '',
    url(r'^api/v1/', include(router.urls)),
    url(r'^api/v1/', include('agents.urls')),
    url(r'^api/v1/', include('utils.urls')),
    url(r'^api/v1/', include('authentication.urls')),
    url(r'^api/v1/', include('products.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^accounts/login', LoginView.as_view(), name='login'),
    url(r'^.*$', IndexView.as_view(), name='index'),
)
handler404 = 'views.handle_page_not_found_404'

其中index是最后一条路线。