首先 angular4 和django 1.11.1交互 有跨域问题 所以先关闭cors 和csrf验证

一.解决跨域问题 cors

github django-cors-headers

1)安装corsheaders

  1. pip install django-cors-headers

  

2)配置 settings.py

D:\Python27\Lib\site-packages\django\bin\app\app\settings.py

搜索 INSTALLED_APPS   添加  corsheaders

'corsheaders',

3)搜索   MIDDLEWARE  添加 (顺序不能乱)

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. # 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. 'corsheaders.middleware.CorsMiddleware',
  10.  
  11. ]

4)同时添加 MIDDLEWARE_CLASSES

PS: #注释掉的是csrf 验证

  1. MIDDLEWARE_CLASSES = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'corsheaders.middleware.CorsMiddleware',
  5. 'django.middleware.common.CommonMiddleware',
  6. # 'django.middleware.csrf.CsrfViewMiddleware',
  7. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  8. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  9. 'django.contrib.messages.middleware.MessageMiddleware',
  10. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  11. ]

5)后续其它参数  

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_ALLOW_ALL = True

允许跨域的域名列表 现在表示所有都可以
CORS_ORIGIN_WHITELIST = (
'*'
)

CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)

CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)

二.关闭csrf 验证

找到settings.py 搜索 django.middleware.csrf.CsrfViewMiddleware 前面加# PyCharm快捷键  ctrl + /

这样就关闭了所有的csrf验证

参考路径: D:\Python27\Lib\site-packages\django\bin\app\app\settings.py

前端方面

组件内代码    D:\wamp\angular4\xxx\src\app\register\register.component.ts

1)导入HttpClient 和HttpErrorResponse

  1. import {HttpClient, HttpErrorResponse} from '@angular/common/http'

2)提供http

  1. constructor(private http: HttpClient) { }

3)完成模板提交函数onSubmit(value){}

①value就是模板里表单的值 regForm.vaue

②然后进行json序列化 JSON.stringify(value)

  1. const data =JSON.stringify(value); 

③发送给后端 django 这里就有跨域的问题 需要关闭django cors 和csrf 验证

const data =JSON.stringify(value);         定义的json数据
let url = 'http://127.0.0.1:8000/formgetdata';     发送的后台接口地址

this.http.post(url,data,{

responseType:'json'

}).subscribe()

④接收后台传递的json

只有JSON序列化的才能看到 JSON.stringify(data)

取得json的值的话 就是data.username

也就是说先看到JSON.stringify(data) 有什么字段 才能用data.字段值获取到

.subscribe(

data => {

console.log('请求成功!'+ data )

let datalist = JSON.stringify(data);

console.log(data.username)

console.log(data.password)

console.log(data.message)

}

)

 

  

使用this.http.post(url,data,option) 发送post请求

顶部导入

import {HttpClient, HttpErrorResponse} from '@angular/common/http'

constructor(private http: HttpClient) { }

  1. onsubmit(value){
  2. console.dir(value);
  3. console.dir(JSON.stringify(value));
  4.  
  5. const data =JSON.stringify(value);
  6. this.http.post('http://127.0.0.1:8000/formgetdata',data,{
  7. responseType:'text'
  8. }).subscribe(
  9. data =>{
  10. console.log('请求成功!')
  11.  
  12. },
  13. (err : HttpErrorResponse) => {
  14. if(err.error instanceof Error){
  15. // 前端报错
  16. console.log("前端报错-错误信息:",err.error.message)
  17. }
  18. else {
  19. //后端错误
  20. console.log(`后端报错-响应码: ${err.status}, body was: ${err.error}`);
  21. }
  22.  
  23. }
  24.  
  25. );
  26.  
  27. }

整体结构

 

 

组件内模板写法 D:\wamp\angular4\xxx\src\app\register\register.component.html

1)输入input 双向绑定 [(ngModel)]="名字"  名字就是name属性值

2)表单值 收集提交 form 绑定ngSubmit

① 先定义表单名称 #regForm ="ngForm"

② 收集表单信息 regForm.value

③ 传递给组件 (ngSubmit)="onsubmit(regForm.value)" 组件内定义onsubmit函数

后端 django

准备工作 顶部导入

import json

from django.shortcuts import render

from django.http import HttpResponse

1.配置路由 urls.py

参考路径:D:\Python27\Lib\site-packages\django\bin\app\app\urls.py

找到   urlpatterns  配置   url(r'^formgetdata',view.formgetdata)

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^$',view.hello),
  4. url(r'^formgetdata',view.formgetdata)
  5. ]

2.配置视图 view.py  

D:\Python27\Lib\site-packages\django\bin\app\app\view.py

这里需要实现的就是两个功能

1)接收angular4发送来的表单数据

查看数据是否接收到: request.body

接收表单数据:

datalist = request.body.decode('utf-8')

data = json.loads(datalist)

username = data['username']

password = data['password']

参考资料

https://stackoverflow.com/questions/29780060/trying-to-parse-request-body-from-post-in-django

2) 返回json数据给前端

res ={"username":username ,"password":password ,"message":"后台成功接收表单信息!后台请求成功"}

return HttpResponse(json.dumps(res),content_type="application/json")

上面两点完整代码截图

实例代码参考

  1. # -*- coding: utf-8 -*-
  2. #from django.http import HttpResponse
  3. import json
  4. from django.shortcuts import render
  5. from django.http import HttpResponse
  6. import simplejson
  7.  
  8. def hello(request):
  9. context = {}
  10. context['hello'] = 'Hello world! {{ hello }} 传值'
  11. return render(request,'hello.html',context)
  12.  
  13. def formgetdata(request):
  14. if request.method == 'POST':
  15.  
  16. print request.body
  17.  
  18. dataunicode = request.body.decode('utf-8')
  19. data = json.loads(dataunicode)
  20. username =data['username']
  21. password =data['password']
  22. print data
  23. print username
  24.  
  25. res={'username':username,"password":password,"message":"后台成功接收表单信息!后台请求成功"}
  26. return HttpResponse(json.dumps(res),content_type="application/json")
  27.  
  28. else:
  29. return HttpResponse('请求失败')

  

提示

request.body 数据都在这里可以找到

接上面的内容,把前端接受到的数据写入到数据库里

接收数据写入数据库

1.首先确定 urls.py 是否路由匹配上

D:\Python27\Lib\site-packages\django\bin\app\app\urls.py

  1. url(r'^formgetdata',view.formgetdata),
  2. url(r'^user', view.user),

 比如

 

2.定义view.py

D:\Python27\Lib\site-packages\django\bin\app\app\urls.py

这里为了方便调用models.py文件创建的数据库表,引入models模块在头部

这样

import models

查询表数据 就是这样

data =models.Member.objects.values()
return HttpResponse(data)

这里的Member就是创建的数据库表

3.创建models.py文件,创建数据库表和定义字段

以下是models.py实例 创建表中的字段

python manage.py makemigrations

python manage.py migrate --database=mysql    #mysql为定义的数据库

上面的数据库定义 在settings.py 中 查找   DATABASES 然后想下面定义一组mysql数据库

D:\Python27\Lib\site-packages\django\bin\app\app\settings.py

实例代码参考 这里default设置成mysql了,在使用中为了避免麻烦

  1. DATABASES = {
  2. # 'default': {
  3. # 'ENGINE': 'django.db.backends.sqlite3',
  4. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. # },
  6.  
  7. 'default': {
  8. 'ENGINE': 'django.db.backends.mysql',
  9. 'HOST': '192.168.1.103',
  10. 'POST': '3306',
  11. 'NAME': 'xxx', # 数据库名称
  12. 'USER': 'root',
  13. 'PASSWORD': '数据库密码',
  14. 'OPTIONS': {
  15. 'init_command': "SET sql_mode ='STRICT_TRANS_TABLES' "
  16. }
  17. },
  18. 'mysql': {
  19. 'ENGINE': 'django.db.backends.mysql',
  20. 'HOST': '192.168.1.103',
  21. 'POST': '3306',
  22. 'NAME': 'xxx', # 数据库名称
  23. 'USER': 'root',
  24. 'PASSWORD': '数据库密码',
  25. 'OPTIONS': {
  26. 'init_command': "SET sql_mode ='STRICT_TRANS_TABLES' "
  27. }
  28. }
  29.  
  30. }

  

angular 4 和django 1.11.1 前后端交互 总结的更多相关文章

  1. Django之META与前后端交互

    Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...

  2. Django(Python)前后端交互

    使用Django中自带的模板 前端通过form 表单向后端提交数据 # /template/demo/demo.html {% if result == 1 %} <p> 插入成功 < ...

  3. 微信小程序-前后端交互

    前台手机验证码登录 <view>手机号:</view> <input value="{{phone}}" bindinput="bindPh ...

  4. Servlet实现前后端交互的原理及过程解析

    在日常调试项目时,总是利用tomcat去启动项目,并进行前后端联调,但对于前后端的请求响应的交互原理及过程并不是特别清晰. 为什么在前端发出相应请求,就能跳转到后端通过程序得到结果再响应到前端页面呢? ...

  5. js前后端交互

    1.前后端交互模式 2.promise用法 (1)异步调用 (2)ajax回顾 (3).promise 优点:可以解决回调地狱(多层异步调用嵌套问题)(解决代码可读性低的问题) 提供简洁的api (4 ...

  6. Python 利用三个简易模块熟悉前后端交互流程

    准备工作 在学习Django之前,先动手撸一个简单的WEB框架来熟悉一下前后端交互的整体流程 本次用到的模块: 1.wsgiref,这是一个Python自带的模块,用于构建路由与视图 2.pymysq ...

  7. Node之简单的前后端交互

    node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...

  8. 前后端交互实现(nginx,json,以及datatable的问题相关)

    1.同源问题解决 首先,在同一个域下搭建网络域名访问,需要nginx软件,下载之后修改部分配置 然后再终端下cmd  nginx.exe命令,或者打开nginx.exe文件,会运行nginx一闪而过, ...

  9. springboot+mybatis+thymeleaf项目搭建及前后端交互

    前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将 ...

随机推荐

  1. Google+ 团队的 Android UI 测试

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/android-blog/Google%2B%20%E5%9B%A2%E9 ...

  2. vim less vi 不显示富文本 ESC

    如图: 使用 less -r xxx.log 即可显示如下

  3. 开源的.NET系统推荐

    C# 源码 AForge.NET     RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的 ...

  4. Ubuntu上安装git和创建工作区和提交文件!!!

    1.安装git: sudo apt-get install git 2.创建工作区: 创建一个文件夹,sudo mkdir 文件文件夹.告诉git这是个工作区文件夹,sudo git init 文件夹 ...

  5. 每天一个linux命令(2):cd命令

    1.作用 cd(Change Directory 改变目录)命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home direc ...

  6. orocos_kdl学习(一):坐标系变换

    KDL中提供了点(point).坐标系(frame).刚体速度(twist),以及6维力/力矩(wrench)等基本几何元素,具体可以参考 Geometric primitives 文档. Creat ...

  7. 11G新特性 -- Multicolumn Statistics (Column groups)

    默认oracle会收集表中各个列的统计信息,但是会忽略列之间的关联关系.在大多情况下,优化器假设在复杂查询中的列之间是独立的.当where子句后指定了一个表的多个列条件时,优化器通常会将多个列的选择性 ...

  8. 12C -- ORA-65048 ORA-65048

    创建common user的时候报错: $ sqlplus '/as sysdba' SQL*Plus: Release 12.2.0.1.0 Production on Tue Apr 18 11: ...

  9. CEO退休

    早上刚来公司就收到群发邮件,说CEO退休了,在公司服务了22年.以后还是会part time做vice chairman.其实在公司也没打过几次照面...就知道是个和善的老人,祝他退休生活幸福! 我的 ...

  10. Windows 使用 Gogs 搭建 Git 服务器

    随便说两句 之前有使用 Gitblit 在Windows搭建Git服务器,用的也挺好的,可能安装起来略麻烦一点.现在全用 Gogs 在windows搭建Git服务器,主要是因界面好看,管理更方便一些. ...