day56:django:csrf_token&文件上传
目录
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&文件上传的更多相关文章
- python Django之文件上传
python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...
- Django(十七)文件上传
http://www.cnblogs.com/wupeiqi/articles/5703697.html - 文件上传 - 普通上传 - 自定义页面上传按钮 ...
- 框架----Django之文件上传
一.文件上传 1. 浏览器访问 http://127.0.0.1:8000/f1/ http://127.0.0.1:8000/f2/ 2. urls from django.conf.urls im ...
- Django的文件上传以及预览、存储
思路: 文件上传通过前端的input标签,input设置display:none属性. 内容显示需要让前端通过<img>标签读取图片内容,可以通过<label>标签连接< ...
- Django实现文件上传功能
文件上传 关注公众号"轻松学编程"了解更多. 1.创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置,MEDIA_ROOT=o ...
- Django普通文件上传
前端代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- django 的文件上传
template html(模板文件): <form enctype="multipart/form-data" method="POST" action ...
- Django处理文件上传File Uploads
HttpRequest.FILES 表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data <form enctype="m ...
- Django之文件上传
一.form表单上传文件 注意: 1.form上需要加enctype="multipart/form-data" 2.form提交的地址需要以/结尾 def form_file(r ...
随机推荐
- 初入Shell
shell 第1章 Shell概述 大数据程序员为什么要学习Shell呢? 1)需要看懂运维人员编写的Shell程序. 2)偶尔会编写一些简单Shell程序来管理集群.提高开发效率. 第2章 Shel ...
- 区块链入门到实战(32)之Solidity – 代码注释
Solidity 支持c风格和c++风格的注释. //之后到行尾的文本,都被看作注释,编译器忽略此内容 /* 与 */ 之间的文本被看作注释, 编译器忽略此内容 示例 注释示例. function g ...
- Java面试题(Redis篇)
Redis 179.redis 是什么?都有哪些使用场景? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. ...
- python编写汉诺塔 Hanoi
#hanoi.py count = 0 def hanoi(n, src, dst, mid): #src为原1号柱子 dst 目标3号柱子 mid中间2号过渡柱子 global count #对全局 ...
- Python中的协程,为什么说它的底层是生成器?
我们曾经在golang关于goroutine的文章当中简单介绍过 协程 的概念,我们再来简单review一下.协程又称为是微线程,英文名是Coroutine.它和线程一样可以调度,但是不同的是线程的启 ...
- 序列号,IMEI,IMSI,ICCID的含义
什么是序列号? 序列号是一串标识你手机出生证明以及身材特征的信息,甚至还可用来识别是否为官方翻新机.你可以简单的将这一串数字分割为:aabccdddeef 的形式.拿iPhone 4为例 aa = 工 ...
- slua中,绑定lua文件到Monobehavior的一种方法
slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法: public class LuaBeha ...
- 合并模拟器和真机的静态库动态库aggregate
创建Aggregate的target 在Build Phases 添加Run Script,内容为 scriptFile=${SRCROOT}/universalA.shsh ${scriptFile ...
- Python Embedded
文档 https://docs.python.org/3/extending/index.html https://www.codeproject.com/articles/11805/embeddi ...
- 搭建lnmp环境,nginx的配置文件/etc/nginx/nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...