我即将为客户端启动 AngularJS 项目,为服务器端启动 Django 项目。
让他们像最好的朋友一样工作的最佳做法是什么(静态文件,身份验证,部署等)
答案 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('}]}');
});