将AngularJS与Django一起使用的最佳实践是什么?

时间:2013-08-09 14:20:27

标签: django rest angularjs

我即将为客户端启动 AngularJS 项目,为服务器端启动 Django 项目。

让他们像最好的朋友一样工作的最佳做​​法是什么(静态文件,身份验证,部署等)

2 个答案:

答案 0 :(得分:56)

有一些方法可以从Django模板为客户端模板供电,以进行有趣的优化;然而,鉴于Django和AngularJS的模板语言之间的相似性,这几乎不值得努力。对于大多数此类项目,我会将AngularJS的静态服务与Django REST Framework配对。

我的urls.py操作顺序几乎总是首先是Django REST Framework URL(尽可能严格地编写),然后是一个通用模式,它将我的基础AngularJS应用程序模板中的所有其他内容指向{{1} } dir for local testing / dev scenario:

STATIC_ROOT

通过将所有不匹配的请求指向同一个应用程序/模板,您可以开始使用URL和路由的历史记录方法(如果您更喜欢使用哈希标记)。如果您只打算坚持使用主题标签,那么您的最终网址匹配可能会更严格(例如,将if settings.DEBUG: urlpatterns += patterns('django.contrib.staticfiles.views', url(r'', 'serve', { 'document_root': settings.STATIC_ROOT, 'path': '/base.html'} ), ) (网址根目录)与/匹配。

在生产中,我将使用反向代理或慢客户端HTTP服务器(如nginx)来提供AngularJS(静态)内容,将REST服务请求代理到Django WSGI应用程序。

为了与Django REST Framework进行通信,我更喜欢使用类似于类的JS对象来封送与AngularJS应用程序和Django REST Framework之间的数据。为此,我使用angular-django-rest-resource生成表示我在REST Framework视图中公开的Django模型类的类。

为了获得angular-django-rest-resource可以为资源创建查询的最大灵活性,我将按照here所述为REST Framework安装 django-filter 后端。这允许JS资源请求受参数约束的Django对象(例如r'^$')。

如果您在服务于AngularJS主模板的单独服务器域上部署Django和REST操作(例如,如果您在不同的Internet域上使用第三方CDN用于HTML) ,那么允许跨域请求这些资源很重要。为此,我推荐django-cors-headers中间件。

我希望这会有所帮助。它不是 最佳实践集,但它对我有用。

答案 1 :(得分:7)

为防止Angularjs与Django混淆,请参阅: https://docs.angularjs.org/api/ng/provider/ $ interpolateProvider

基本上是为了让Django能够使用{{xyz}}变量和angular来同时使用{[{xyz}]}变量:

app.config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('{[{');
    $interpolateProvider.endSymbol('}]}');
});