目录

1.csrf介绍

2.django实现csrf_token认证

3.django实现文件上传

csrf介绍

什么是csrf?

csrf:跨站请求伪造。攻击者通过HTTP请求将数据传送到服务器,从而盗取会话的cookie。

盗取会话cookie之后,攻击者不仅可以获取用户的信息,还可以修改该cookie关联的账户信息。

django实现csrf_token认证

1.form表单实现csrf_token认证

直接写上{% csrf_token %}

<form action="">
{% csrf_token %}
<input type="text" name="username">
<input type="submit">
</form>

2.ajax实现csrf_token认证

方式1

在html里,写了个{% csrf token %},其实翻译过来,就是生成了个input标签

input标签是这个样子的:

<input type="hidden" name="csrfmiddlewaretoken" value="BzOzpsnD1zqiZMm3jp1TdW2knEI2BvxwEXrsJbZTIdqL1Kj6P7o4pN38sTn8K5ia">

我们在js中获取属性name为csrfmiddlewaretokan的那个input标签的value的值

然后通过ajax中的data传递过去

// 方式1
<input type="text" name="username">
<button id="btn">确认</button> {% csrf_token %} <script src="{% static 'plugins/jquery.js' %}"></script>
<script> var uname = $('#username').val();
// 方式1
// 通过input标签的name属性获取csrfmiddlewaretoken的值
var token = $('[name="csrfmiddlewaretoken"]').val(); $.ajax({
url:'/ajax_login',
type:'post',
data:{uname:uname,csrfmiddlewaretoken:token}
success:function (res) {
alert(res)
}
})
</script>

方式2

这种方式和方式1差不多,只是在data中csrfmiddlewaretoken的值 变成了{{ csrf_token }}

在django中可以通过双大括号取值

<input type="text" name="username">
<button id="btn">确认</button> {% csrf_token %} <script src="{% static 'plugins/jquery.js' %}"></script> <script> var uname = $('#username').val(); $.ajax({
url:'/ajax_login',
type:'post',
// 方式2
// 直接拿到csrfmiddlewaretoken中value属性对应的值
data:{uname:uname,csrfmiddlewaretoken:'{{ csrf_token }}'},
success:function (res) {
alert(res)
}
}) </script>

方式3

data里不在写csrfmiddlewaretoken,而是写在ajax中的header里

这种方法的csrf认证是写在cookie里的 cookie里的csrf和input标签里value的csrf是不一样的

<input type="text" name="username">
<button id="btn">确认</button> {% csrf_token %} <script src="{% static 'plugins/jquery.js' %}"></script> <script> var uname = $('#username').val(); $.ajax({
url:'/ajax_login',
type:'post',
data:{uname:uname},
headers:{
'X-CSRFToken':$.cookie('csrftoken') // 这个csrftoken是cookie中的csrftoken,并非csrfmiddlewaretoken的值,两者本身是同一个之,但是二者的加密方式不同,所以加密出来的结果不相同
},
success:function (res) {
alert(res)
}
}) </script>

django实现文件上传

1.form表单实现文件上传

<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %} 用户名:<input type="text" name="username" > <!-- type类型设置为file,multiple代表可以上传多个文件 -->
头像:<input type="file" name="avatar" multiple> <input type="submit"> </form>

2.ajax实现文件上传

从html获取数据,在js中获取定义成变量

然后放到formdata中

在ajax中的data直接传formdata即可,注意加processData和ContentType

用户名:<input type="text" name="username" id="username">

头像:<input type="file" name="avatar" id="avatar">
<button id="ajax_btn">上传</button> <script>
$('#ajax_btn').click(function () { var uname = $('#username').val();
var file_obj = $('#avatar')[0].files[0]; // 文件对象 var formdata = new FormData(); // 创建formdata对象,用来获取表单数据,方便进行提交数据
formdata.append('username',uname); // 获取input框输入的用户名
formdata.append('csrfmiddlewaretoken','{{ csrf_token }}'); // 获取csrf_token值
formdata.append('avatar',file_obj); // 获取用户上传的文件对象 $.ajax({
url:'/login/',
type:'post',
data:formdata,
processData: false , // 不处理数据
contentType: false, // 不设置内容类型
success:function (res) {
console.log(res);
}
})
})
</script>

3.文件上传的views.py(form表单和ajax都用这套视图函数)

通过request读取在前端js定义好的file_obj

然后通过文件对象.name 取出文件名 为接下来with open操作做准备

with open(文件名....)打开文件

for循环文件对象 将文件内容写入其他地方

def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
file_obj = request.FILES.get('avatar')
name = file_obj.name
with open(name, 'wb') as f:
# 方式1
# for i in file_obj: # \r\n

# 方式2
# for i in file_obj.chunks(): # \r\n
for i in file_obj.chunks(): # \r\n 读取65536B
f.write(i) return HttpResponse('ok')

day56:django:csrf_token&文件上传的更多相关文章

  1. python Django之文件上传

    python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...

  2. Django(十七)文件上传

    http://www.cnblogs.com/wupeiqi/articles/5703697.html - 文件上传        - 普通上传        - 自定义页面上传按钮        ...

  3. 框架----Django之文件上传

    一.文件上传 1. 浏览器访问 http://127.0.0.1:8000/f1/ http://127.0.0.1:8000/f2/ 2. urls from django.conf.urls im ...

  4. Django的文件上传以及预览、存储

    思路: 文件上传通过前端的input标签,input设置display:none属性. 内容显示需要让前端通过<img>标签读取图片内容,可以通过<label>标签连接< ...

  5. Django实现文件上传功能

    文件上传 关注公众号"轻松学编程"了解更多. 1.创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置,MEDIA_ROOT=o ...

  6. Django普通文件上传

    前端代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. django 的文件上传

    template html(模板文件): <form enctype="multipart/form-data" method="POST" action ...

  8. Django处理文件上传File Uploads

    HttpRequest.FILES 表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data <form enctype="m ...

  9. Django之文件上传

    一.form表单上传文件 注意: 1.form上需要加enctype="multipart/form-data" 2.form提交的地址需要以/结尾 def form_file(r ...

随机推荐

  1. TypeScript 安装及基础运行环境搭建

    安装 TypeScript npm install -g typescript 安装成功后,命令行输入 tsc -v 命令提示当前安装的 TypeScript 版本: 出现版本号即安装成功. 使用 V ...

  2. CF1203D2 Remove the Substring (hard version) 题解

    这题初赛让我白给了6分,于是我决定回来解决一下它. 说实话,看原题题面和看CCF代码真是两种完全不同的感受…… ------------思路分析: 把$s$串删去一部分之后,会把$s$串分成两部分,当 ...

  3. 力扣leetcode 435. 无重叠区间 - 贪心

    非常经典的区间贪心思想 -- 详见博文: 贪心思想之区间贪心 本题给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] ...

  4. Redis操作及集群搭建以及高可用配置

    NoSQL - Redis 缓存技术 Redis功能介绍 数据类型丰富 支持持久化 多种内存分配及回收策略 支持弱事务 支持高可用 支持分布式分片集群 企业缓存产品介绍 Memcached: 优点:高 ...

  5. Android开发工程师面试题总结。android开发面试经验

    1:Android中五种数据存储方式分别是什么?他们的特点?     (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQ ...

  6. Mybatis入门篇之基础CRUD

    前言 作为一个资深后端码农天天都要和数据库打交道,最早使用的是 Hiberate,一个封装性极强的持久性框架.自从接触到 Mybatis 就被它的灵活性所折服了,可以自己写 SQL,虽然轻量级,但是麻 ...

  7. 攻防世界——web新手练习区解题总结<3>(9-12题)

    第九题simple_php: 看题目说是php代码,那必定要用到php的知识,让我们先获取在线场景,得到如下网页 仔细看这个代码,意思大概是: 1.当a==0且a为真时输出flag1 2.当b为数字退 ...

  8. 【Pytorch-入门】windows下的环境搭建(经验证成功~)

    前言 实验需要,之前使的tensorflow[因为自己手边的服务器都是windows环境TT...],但身边的师兄们用的都是pytorch,自己查了查现在做科研基本上都是用的pytorch,而且现在p ...

  9. unity shader

    Unity新的shader叫做 基于物理渲染的shader,先介绍下新的shader具有的特性: Energy Conservation(能量守恒):这是一个基于物理的概念,它确保物体反射的光线不会比 ...

  10. 6 vue-element.ui 左侧导航栏

    <template> <div> <el-menu :default-active="'/'+activeIndex2" mode="ver ...