【发布时间】:2013-08-11 12:24:04
【问题描述】:
我即将开始一个项目,客户端使用 AngularJS,服务器端使用 Django。
让他们像最好的朋友一样工作的最佳实践是什么(静态文件、身份验证、部署等)
【问题讨论】:
我即将开始一个项目,客户端使用 AngularJS,服务器端使用 Django。
让他们像最好的朋友一样工作的最佳实践是什么(静态文件、身份验证、部署等)
【问题讨论】:
有一些方法可以从 Django 模板为您的客户端模板提供动力,以进行有趣的优化;然而,鉴于 Django 和 AngularJS 的模板语言之间的相似性,在这里几乎不值得付出努力。对于大多数此类项目,我会将 AngularJS 的静态服务与 Django REST Framework 配对。
我的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 根)与 r'^$' 匹配)。
在生产中,我将使用反向代理或慢客户端 HTTP 服务器(如 nginx)来提供 AngularJS(静态)内容,将 REST 服务请求代理到 Django WSGI 应用程序。
为了与 Django REST 框架进行通信,我更喜欢使用类类 JS 对象来编组与 AngularJS 应用程序和 Django REST 框架之间的数据。为此,我使用angular-django-rest-resource 生成代表我在 REST 框架视图中公开的 Django 模型类的类。
为了最大限度地提高 angular-django-rest-resource 查询资源的灵活性,我将为 REST 框架安装 django-filter 后端,如 here 所述。这允许 JS 资源请求受参数约束的 Django 对象(例如/polls/?author=345&finished=1)。
如果您在提供 AngularJS 主模板的不同服务器域上部署 Django 和 REST 操作(例如,如果您在不同的 Internet 域上使用第三方 CDN 来处理 HTML) ,那么允许对这些资源的跨域请求很重要。为此,我推荐django-cors-headers 中间件。
我希望这会有所帮助。这不是最佳实践集,但它对我有用。
【讨论】:
request.user 公开给 Django REST 框架,您可以有条件地公开请求的数据。我还没有尝试过的一种方法是使用每个序列化的 JSON 响应发送身份验证信息,如this article 中所述。鉴于您使用的是 Django,您还可以在 Django REST 框架之外创建自定义视图,这可能更好地将用户或会话信息传达给您的 AngularJS 应用程序。
为防止 Angularjs 与 Django 混淆,请参阅: https://docs.angularjs.org/api/ng/provider/$interpolateProvider
基本上让 Django 可以使用 {{ xyz }} 变量和 angular 一起使用 {[{ xyz }]} 变量:
app.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
【讨论】: