Django之提交表单与前后端交互的方法


Posted in Python onJuly 19, 2019

Django之META与前后端交互

1 提交表单之GET

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

GET 请求过程
前端通过ajax发起GET请求,json格式数据
var data = { 
  "name": "test", 
  "age": 1 
}; 
$.ajax({ 
  type: 'GET', 
  url: /your/url/, 
  data: data, # 最终会被转化为查询字符串跟在url后面: /your/url/?name=test&age=1 
  dataType: 'json', # 注意:这里是指服务端返回json格式的数据 
  success: function(data) { # 这里的data就是json格式的数据 
  }, 
  error: function(xhr, type) { 
  } 
}); 
后端接受GET请求数据
name = request.GET.get('name', '') 
age = int(request.GET.get('age', '0'))

2 提交表单之POST

方式一:

前端发送POST请求:
var data = {} 
# 如果页面并没有表单,只是input框,请求也只是发送这些值,那么可以直接获取放到data中 
data['name'] = $('#name').val()  
# 如果页面有表单,那么可以利用jquery的serialize()方法获取表单的全部数据 
data = $('#form1').serialize();  
$.ajax({ 
  type: 'POST', 
  url: /your/url/, 
  data: data, #request Header中默认是Content-Type:application/x-www-form-urlencoded
  dataType: 'json', # 注意:期望服务器返回的数据类型 
  success: function(data) { # 这里的data就是json格式的数据 
  }, 
  error: function(xhr, type) { 
  } 
});
注: ajax中没有指明content-type类型,请求头中默认是Content-Type:application/x-www-form-urlencoded,因此参数会编码为 name=xx&age=1 提交到后端,后端作为表单数据处理

后端接受请求表单数据:
name = request.POST.get('name', '') 
age = int(request.POST.get('age', '0')) 


方式二:

前端通过POST提交JSON数据
# POST一个json数据  
var data = { 
  “name”: "test", 
  "age", 1 
} 
$.ajax({ 
  type: 'POST', 
  url: /your/url/, 
  data: JSON.stringify(data), # json对象转化为字符串 
  #request Header注明content-type:'application/json; charset=UTF-8'
  contentType: 'application/json; charset=UTF-8', 
  dataType: 'json', # 注意:期望服务端返回json格式的数据 
  success: function(data) { # 这里的data就是json格式的数据 
  }, 
  error: function(xhr, type) { 
  } 
}); 
注: 如果要给后端传递json数据,就需要增加content-type参数,告诉后端,传递过来的数据格式,并
且需要将data转为字符串进行传递。实际上,服务端接收到后,发现是json格式,做的操作就是将字符串转为json对象。
另外,不转为字符串,即使加了content-type的参数,也默认会转成name=xx&age=1,使后端无法获取正确的json。

后端接受数据:
data = request.get_json()
另外,如果前端提交的数据格式不能被识别,可以用request.get_data()接收数据。

3 request.META组成

request.META是python中一个字典,包含了本次所有HTTP请求的Header信息,比如ip,浏览器
  Agent。注意Header信息的完整列表取决于用户所发送的Header信息与服务端设置的header信息,常见的键值对有:
(1) HTTP_USER_AGENT,用户浏览器的user-agent字符串,例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
(2) REMOTE_ADDR客户端ip,如"12.345.67.89" ,如果申请是经过代理服务器的话,那么它可能是
以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90")

  request.META是python一个普通字典,当键不存在时,访问会触发一个KeyError异常。一般采用
  try/execpt语句或者用python中get()方法来处理,设置默认返回,友好的响应客户端。

4 request.META调用设计

(1)要获取用户浏览器信息,写法通常可以:
def ua_display(request):
  info = request.META.get('HTTP_USER_AGENT', 'unknown')
  return HttpResponse("Your browser is %s" % info)

 (2) 采用try/execpt语句防止阻塞程序
def ua_display_2(request):
  try:
    info = request.META['HTTP_USER_AGENT']
  except KeyError:
    info = 'unknown'
  return HttpResponse("Your browser is %s" % info)

(3) 想要看META中具体有哪些数据,采用python字典获取键值items方法
values = request.META.items()
info = []
for k,v in values:
  info.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v))

(4) 
      CONTENT_LENGTH  文本长度
      CONTENT_TYPE  数据类型
      HTTP_ACCEPT_ENCODING  编码
      HTTP_ACCEPT_LANGUAGE  语言
      HTTP_REFERER  引用页,如果有的话
      HTTP_USER_AGENT 客户机用户代理字符串
      QUERY_STRING 查询字符串,单一的未解析的字符串
      REMOTE_ADDR  客户机IP地址
      REMOTE_HOST  客户机hostname
      REQUEST_METHOD 请求方式,比如 GET 或 POST
      SERVER_NAME 服务器 hostname
      SERVER_PORT 服务器端口

信息如下:
ALLUSERSPROFILE C:\ProgramData
COMMONPROGRAMFILES C:\Program Files\Common Files
COMSPEC C:\windows\system32\cmd.exe
CONFIGSETROOT  C:\windows\ConfigSetRoot
CONTENT_LENGTH 
CONTENT_TYPE  text/plain
CSRF_COOKIE 8dLJLZyBH801ba24VdzYqJ81b5nqTxh0
DJANGO_SETTINGS_MODULE PythonProject.settings
FP_NO_HOST_CHECK  NO
GATEWAY_INTERFACE  CGI/1.1
HOMEDRIVE  C:
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING  gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE  zh-CN,zh;q=0.8
HTTP_CONNECTION keep-alive
HTTP_COOKIE csrftoken=8dLJLZyBH801ba24VdzYqJ81b5nqTxh0; sessionid=1rf6hmdw7k0zzsg8q3q1lw2j75gmoood
HTTP_HOST  127.0.0.1:8000
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
NUMBER_OF_PROCESSORS  4
OS Windows_NT
PATH  E:\Python;E:\Python\Scripts;C:\windows\system32;E:\Python
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PATH_INFO  /display_meta/
PROCESSOR_ARCHITECTURE AMD64
PROCESSOR_IDENTIFIER  Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL 6
PROCESSOR_REVISION 2a07
PROMPT $P$G
PSMODULEPATH  C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC C:\Users\Public
QUERY_STRING  
REMOTE_ADDR 127.0.0.1
REMOTE_HOST
REQUEST_METHOD GET
RUN_MAIN  true
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE WSGIServer/0.1 Python/2.7.5
SESSIONNAME Console
SHIM_MCCOMPAT  0x810000001
WINDOWS_TRACING_FLAGS  3
WINDOWS_TRACING_LOGFILE C:\BVTBin\Tests\installpackage\csilogfile.log
wsgi.errors ', mode 'w' at 0x00000000025C6150>
wsgi.file_wrapper  wsgiref.util.FileWrapper
wsgi.input 
wsgi.multiprocess  False
wsgi.multithread  True
wsgi.run_once  False
wsgi.url_scheme http
wsgi.version  (1, 0)

以上这篇Django之提交表单与前后端交互的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python单链表实现代码实例
Nov 21 Python
用python实现的线程池实例代码
Jan 06 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
python使用thrift教程的方法示例
Mar 21 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
Python的collections模块真的很好用
Mar 01 Python
关于Numpy之repeat、tile的用法总结
Jun 02 Python
python三子棋游戏
May 04 Python
解决Python3 抓取微信账单信息问题
Jul 19 #Python
Django 数据库同步操作技巧详解
Jul 19 #Python
浅谈Python中函数的定义及其调用方法
Jul 19 #Python
python 处理微信对账单数据的实例代码
Jul 19 #Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 #Python
python障碍式期权定价公式
Jul 19 #Python
python+numpy实现的基本矩阵操作示例
Jul 19 #Python
You might like
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
php操作MongoDB类实例
2015/06/17 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
python修改字典内key对应值的方法
2015/07/11 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
python如何删除文件、目录
2020/06/23 Python
如何卸载python插件
2020/07/08 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
学校消防演习方案
2014/02/19 职场文书
担保书怎么写
2014/04/01 职场文书
食品销售计划书
2014/04/26 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书