当前位置:  开发笔记 > 编程语言 > 正文

Django与Angular 2

如何解决《Django与Angular2》经验,为你挑选了2个好方法。

我想将Angular 2与Django集成,我还有一些问题需要解决.

    如何将Angular 2的插值语法更改{{ }}(( ))或类似的?

    如何将cookie中的CSRF令牌添加到每个HTTP帖子?

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

.config(function($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
});

    将Angular 2与Django集成是一个好主意吗?

David M... 131

我建议对基于Angular2的项目的整体设计采用不同的方法.

基于Angular2的应用程序旨在用作在浏览器中运行的完全包含的应用程序(概念上类似于移动应用程序在移动OS上运行的方式).您的Angular2应用程序和后端之间应该有一个非常清晰和突然的分离.

考虑到这一点,您当然可以将Django用于后端,但不能像传统Django应用程序将框架与服务器端呈现的表单和页面一样使用.

相反,您宁愿设计后端,以便它暴露具有JSON有效负载的RESTful API接口(POST/PUT用于创建和更新对象,GET用于获取/列表等)然后您的Angular2应用程序将使用该API来创建面向用户的体验.

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

用于创建RESTful后端API的良好工具选项是Django REST Framework或Tastypie.

对于身份验证,您可以使用JWT(JSON Web令牌),并且Django REST Framework 有很好的附加组件可以支持它.

该架构有一个主要优势:在未来,如果您的系统发展需要真正的原生移动客户端(例如Android或iOS应用程序),您应该能够为这些本机应用程序使用完全相同的RESTful API.

该体系结构也有缺点,例如无法使用Django表单 - 处理开箱即用的优点.

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

    如何将angular2的插值语法从{{}}更改为(())或类似的内容.

使用我建议的方法没有必要这样做.

    如何将cookie中的csrf令牌添加到每个http帖子?

如果使用JWT,则不需要CSRF验证.如果使用基于会话的身份验证,您仍然需要它,但您可以使用HTTP标头传递它,正如Langley建议的那样.

    将Angular2与Django集成是一个很好的想法吗?

主观但我肯定会说是的.但是,您需要确保清楚地将后端与前端分开.后端不应响应服务器端生成的HTML代码段或HTML表单.这应该都在你的Angular2应用程序中处理.



1> David M...:

我建议对基于Angular2的项目的整体设计采用不同的方法.

基于Angular2的应用程序旨在用作在浏览器中运行的完全包含的应用程序(概念上类似于移动应用程序在移动OS上运行的方式).您的Angular2应用程序和后端之间应该有一个非常清晰和突然的分离.

考虑到这一点,您当然可以将Django用于后端,但不能像传统Django应用程序将框架与服务器端呈现的表单和页面一样使用.

相反,您宁愿设计后端,以便它暴露具有JSON有效负载的RESTful API接口(POST/PUT用于创建和更新对象,GET用于获取/列表等)然后您的Angular2应用程序将使用该API来创建面向用户的体验.

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

用于创建RESTful后端API的良好工具选项是Django REST Framework或Tastypie.

对于身份验证,您可以使用JWT(JSON Web令牌),并且Django REST Framework 有很好的附加组件可以支持它.

该架构有一个主要优势:在未来,如果您的系统发展需要真正的原生移动客户端(例如Android或iOS应用程序),您应该能够为这些本机应用程序使用完全相同的RESTful API.

该体系结构也有缺点,例如无法使用Django表单 - 处理开箱即用的优点.

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

    如何将angular2的插值语法从{{}}更改为(())或类似的内容.

使用我建议的方法没有必要这样做.

    如何将cookie中的csrf令牌添加到每个http帖子?

如果使用JWT,则不需要CSRF验证.如果使用基于会话的身份验证,您仍然需要它,但您可以使用HTTP标头传递它,正如Langley建议的那样.

    将Angular2与Django集成是一个很好的想法吗?

主观但我肯定会说是的.但是,您需要确保清楚地将后端与前端分开.后端不应响应服务器端生成的HTML代码段或HTML表单.这应该都在你的Angular2应用程序中处理.


如果在HttpOnly cookie中使用JWT(包含csrf_token)(以防止它被XSS窃取),则需要在每个请求的标头中使用csrf_token.然后在服务器端比较来自请求标头和cookie的csrf_token - 如果它们匹配则一切正常,服务器可以执行请求操作.
@dave_k_smith有许多选项可用于使用Python创建REST API,在特定工具之上,这里概述了重要的概念

2> 小智..:

嗯.我最近遇到的所有三个问题.

    是.这绝对是一个好主意.因为你拥有许多python库的强大功能作为后端来执行你喜欢的任何动作以及角度的力量.:d

    正如Langley建议的那样,通过注入您自己的HTTP-Provider和更新的默认请求选项来工作. 编辑:我最近发现了一个使用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/compiler "模块中的插值配置.

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= '$}';

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有