60

我即将开始一个项目,客户端使用AngularJS,服务器端使用Django

使它们像最好的朋友一样工作的最佳实践是什么(静态文件、身份验证、部署等)

4

2 回答 2

56

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

urls.py的操作顺序几乎总是首先是 Django REST 框架 URL(尽可能严格地编写),然后是一个通用模式,它将所有其他内容指向我的STATIC_ROOT目录中的基本 AngularJS 应用程序模板,用于本地测试/开发场景:

if settings.DEBUG:
    urlpatterns += patterns('django.contrib.staticfiles.views',
        url(r'', 'serve', {
            'document_root': settings.STATIC_ROOT, 
            'path': '/base.html'}
        ),
    )

通过将所有不匹配的请求指向同一个应用程序/模板,您可以开始使用 URL 和路由的 history-hack 方法,如果您更愿意使用主题标签。如果您只打算坚持使用主题标签,那么您的最终 URL 匹配可能会更严格(例如,将/(URL root) 与匹配r'^$')。

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

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

为了最大限度地提高 angular-django-rest-resource 对资源的查询的灵活性,我将为REST 框架安装django-filter后端,如此所述。这允许 JS 资源请求受参数(例如/polls/?author=345&finished=1)约束的 Django 对象。

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

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

于 2013-08-12T20:57:02.287 回答
7

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

基本上是为了让 Django 能够使用 {{ xyz }} 变量和 Angular 一起使用 {[{ xyz }]} 变量:

app.config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('{[{');
    $interpolateProvider.endSymbol('}]}');
});
于 2014-12-03T22:07:09.030 回答