Django与angular2

我想要将Angular 2与Django集成在一起,我有一些问题需要解决。

  1. 如何将Angular 2的插值语法从{{ }}更改为(( ))或类似的东西?

  2. 我怎样才能从cookie添加CSRF令牌到每个HTTPpost?

在Angular 1中,我做了这样的事情:

 .config(function($httpProvider) { $httpProvider.defaults.xsrfCookieName = 'csrftoken'; $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; }); 
  1. 将Angular 2与Django集成是一个好主意吗?

我会build议一个不同的方法来整体devise你的基于Angular2的项目。

基于Angular2的应用程序被用作在浏览器中运行的完全包含的应用程序(类似于移动应用程序在移动操作系统上运行的概念)。 你的Angular2应用程序和后端应该有一个非常清晰和突然的分离。

考虑到这一点,你当然可以使用Django作为你的后端,而不是传统的Django应用程序将服务器端渲染的表单和页面使用框架的方式。

相反,你宁愿devise你的后端,以便公开一个JSON有效载荷的RESTful API接口(POST / PUT用于创build和更新对象,GET获取/列表等)。然后,你的Angular2应用程序将使用该API来创build面向用户的体验。

提交时,用于创build对象的Angular2表单将向包含JSON格式的数据的后端发出HTTP POST请求作为其有效内容(而不是从HTML表单提交产生的​​传统表单编码数据)

用于创buildRESTful后端API的良好工具选项是Django REST Framework或Tastypie 。

对于身份validation,您可以使用JWT(JSON Web Tokens),并且有支持Django REST Framework的良好附加组件 。

该体系结构有一个主要优势:将来,如果系统的演变需要真正的本地移动客户端(例如Android或iOS应用程序),则应该能够为这些本机应用程序使用完全相同的RESTful API。

该体系结构也有缺陷,如无法使用Django的表单处理善待开箱即用。

考虑到上述情况,以下是对您的原始问题的回答:

  1. 如何将angular2的插值语法从{{}}更改为(())或类似的东西。

使用我build议的方法就没有必要这样做了。

  1. 我怎样才能从cookie添加到每个http文章的csrf标记?

如果使用JWT,则不需要CSRFvalidation。 如果使用基于会话的身份validation,您仍然需要它,但是您可以使用HTTP标头来传递它,就像Langley所build议的那样。

  1. 将Angular2与Django集成是一个好主意吗?

主观,但我会说是的,绝对。 但是,您需要确保清楚地将后端与前端分开。 后端不应该使用服务器端生成的HTML片段或HTML表单进行响应。 这应该都在您的Angular2应用程序内处理。

嗯。 我最近面临的三个问题。

    1. 是。 这绝对是一个好主意。 既然你拥有许多python库的后台来执行你喜欢的任何动作,并结合了angular的强大function。 :d
    1. 按照Langley的build议,使用更新的默认请求选项注入自己的HTTP提供程序。 编辑:我最近发现一个更好的解决scheme,使用angular2 cookie服务。 通过提供XSRFStrategy注入您CSRSFToken 😉

缺点是你需要额外的库: NPM:Angular2-cookie

 import { Injectable } from '@angular/core'; import { CookieService } from 'angular2-cookie/services/cookies.service'; import { HttpModule, Headers, BaseRequestOptions, RequestOptions, XSRFStrategy, CookieXSRFStrategy } from '@angular/http'; @Injectable() export class DefaultRequestOptions extends BaseRequestOptions{ headers:Headers = new Headers({ 'Content-Type': 'application/json' }); } @NgModule({ imports: [... HttpModule], declarations: [ AppComponent, ..., ], bootstrap: [AppComponent], providers: [... CookieService, { provide: RequestOptions, useClass: DefaultRequestOptions }, { provide: XSRFStrategy, useFactory: (cookieService) => { return new CookieXSRFStrategy('csrftoken', 'X-CSRFToken'); }, deps: [CookieService] } ] }) export class AppModule { constructor(){ // ther you go ;-) } } 

在您的' @angular度/编译器 '模块中的静态默认插值configuration

 import { DEFAULT_INTERPOLATION_CONFIG } from '@angular/compiler' // These values will be used if not provided by your Component.interpolation DEFAULT_INTERPOLATION_CONFIG.start = '{$'; DEFAULT_INTERPOLATION_CONFIG.end= '$}'; 

Django中有一个verbatim标记,
可以用来忽略verbatim块内的{{}}标记
在这里检查

1-您不能更改angular度的模板语法。

2,我不认为Angular的API是前面提到的,只是简单地设置一个variables,但是有自动的方法,检查这个问题:

如何使Angular 2发送所有请求作为application / x-www-form-urlencoded

你可以做一些非常相似的事情,除非你设置了X-CSRFToken头,而是用这样的手工抓取cookie值:

https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie

3-这个问题是打开得到一个真正的答案。 我个人不会,也许我会尝试@Zyzle在后端使用Django的想法,但开始混合两个框架的前端sintaxis,我不会推荐它。