django 12天(跨域,文件上传,下载)

跨域

什么是跨域
1.协议不同
2.端口不同
3.主机不同 如何解决跨域
1.安装django-cors-headers模块
2.在settings.py中配置
INSTALLED_APPS = [
'corsheaders'
]
3.添加中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware'
]
4.允许跨域源
CORS_ORIGIN_ALLOW_ALL = True 发送请求的时候,后台都会接受
后台发现是跨域的话,并不会返回数据给前台
需要加响应头才可以返回给前台
解决方法如上

前后端分离

前台:存放html
后台:与数据库连接,校验前台数据,返回url,告知前台要返回哪一个html

后台

from django.http import JsonResponse

def login(request):
if request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'abc' and pwd == "123":
return JsonResponse({
'status': 1,
'user': user
})
return JsonResponse({
'status': 2,
'user': 0
})

前台

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆</title>
<link rel="stylesheet" href="./bs-3.3.7/css/bootstrap.css">#本地导入要加.
</head>
<body>
<h2 id="current">用户</h2>
<h1>登陆</h1>
<form action="" id="form">
用户名:<input type="text" name="user" id="user">
密码:<input type="password" name="pwd" id="pwd">
<input id='btn' type="button" value="登陆">
</form>
</body>
<script src="./bs-3.3.7/js/jquery-3.3.1.js"></script>
<script src="./bs-3.3.7/js/bootstrap.js"></script>
<script>
$('#btn').click(function () {
$.ajax({
url: 'http://127.0.0.1:8888/login/',
type: 'post',
data:{
user:$('#user').val(),
pwd:$('#pwd').val()
},
success: function (data) {
alert(data.user);
$('#current').text(data.user)
}
})
})
</script>
</html>

文件上传


前台:
<form>
<input class="file" type="file">
<button type="button" class="upload">上传</button>
</form>
<script>
$('.upload').click(function () {
var form_data = new FormData();
var file = $('.file')[0].files[0];#files是js的语法,故$('.file')[0]取到js对象
form_data.append('file', file);
$.ajax({
url: '跨域上传地址',
type: 'post',
data: form_data,
contentType: false, // 不设置内容类型
processData: false, // 不预处理数据
success: function (data) {
console.log(data)
}
})
})
</script> 后台:
def upload(request):
file = request.FILES.get('file', None)#request.FILES取文件对象,get取最后一个
#get_list取出文件列表
with open(file.name, 'wb') as f:
for line in file:
f.write(line)
return JsonResponse({
'status': 'OK',
'msg': 'upload success'
})

文件下载


前台:浏览器写好了
<a href="http://127.0.0.1:8121/download/">下载</a>
<button type="button" class="download">下载</button>
<script>
$('.download').click(function () {
location.href = 'http://127.0.0.1:8121/download/'
})
</script> 后台:
def download(request):
file = open('123.zip', 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="%s"' % file.name
return response

cookie

什么是cookie
cookie就是存放于浏览器客户端的键值对
原理:http请求是无状态,无连接的
-原理
是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器
-Cookie的覆盖
先写了一个键值对,后来再写,会把原来的值覆盖掉 -登录认证装饰器,登录之后才能访问固定的页面
def login_auth(func):
def inner(request, *args, **kwargs):
# 拿到之前访问的路径
# 这个不行,因为取不到数据部分
# url=request.path
url = request.get_full_path() is_login = request.COOKIES.get('is_login')
if is_login:
res = func(request, *args, **kwargs)
return res
else:
return redirect('/login/?next=%s' % url)
return inner
-cookie的其他属性
-加盐cooke
-超时时间max_age,传一个秒的时间
-超时时间expires,传一个datatime对象
-path='/',可以设置路径,设置路径之后,path='/index/',只有访问index的时候,才会携带cookie过来
-domain 设置域名下有效domain='map.baidu.com'
-secure=False, (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
-httponly=True 只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) 设置cookie (obj.set_cookie('age',18) obj为httpresponse对象)
def set_mycookie(request):
if request.method=="GET":
obj = HttpResponse('ok')
name = '周波'.encode('utf-8').decode('latin-1')#cookie设置为中文会报错,因为中文不能通过'latin-1'编码
obj.set_cookie('user',name)
obj.set_cookie('age',18)
return obj 获得cookie(request.COOKIES.get('age'))
def get_mycookie(request):
if request.method=="GET":
print(type(request.COOKIES))#字典类型
print(request.COOKIES)
age = request.COOKIES.get('age')#获得
user= request.COOKIES.get('user').encode('latin-1').decode('utf-8')#反解出中文
print(age,user)
return HttpResponse('ok') 删除cookie(obj.delete_cookie obj为httpresponse对象)
def del_mycookie(request):
if request.method=="GET":
obj = HttpResponse('ok')
obj.delete_cookie('age')
return obj

session(会议,会话)

什么是session
存放于服务器上的键值对(默认存放于数据库中)
存放格式:
session_key session_value(也就是cookie加密) max_age(过期时间) session必须跟cookie连用 为什么要用session:
解决cookie不安全的问题 获得cookie,对cookie进行加密,随机生成一个session_key,存放于数据库中,用户访问携带session_key,通过中间件,访问数据库,获得对应的session值 session的使用: 设置session(requeset.session['pwd'] = '213')
request.session['name']='lqz'
写完语句后,发生了三件事
1 生成随机字符串:dfasfasdfa
2 去数据库存储
3 写入cookie(set_cookie('sessionid','dfasfasdfa')) 因为session会在数据库存储
使用时需要先进行数据库迁移:makemigrations ,migrate
在数据库中生成 取session
name=request.session['name']
-取到cookie的随机字符串
-取session表中根据随机字符串查询,查询出session_data这个字典,然后把字典中name返回 -删除值
- 取出cookie,随机字符串,去数据库删除随机字符串是当前值的记录
request.session.delete()
-既删除cookie,又删除数据库
request.session.flush() -session其他属性
-request.session.setdefault('k1',123) # 存在则不设置 -取到随机字符串,浏览器带过来的cookie的值
print(request.session.session_key)
内部
request.COOKIES.get('sessionid')
-清空失效的session
request.session.clear_expired()
-校验sessionid是否存在
request.session.exists("session_key")

django 12天(跨域,文件上传,下载,cookie,session)的更多相关文章

  1. 利用Django REST framework快速实现文件上传下载功能

    安装包 pip install Pillow 设置 首先在settings.py中定义MEDIA_ROOT与MEDIA_URL.例如: MEDIA_ROOT = os.path.join(BASE_D ...

  2. (H5)FormData+AJAX+SpringMVC跨域异步上传文件

    最近都没时间整理资料了,一入职就要弄懂业务,整天被业务弄得血崩. 总结下今天弄了一个早上的跨域异步上传文件.主要用到技术有HTML5的FormData,AJAX,Spring MVC. 首先看下上传页 ...

  3. 前后端分离跨服务器文件上传-Java SpringMVC版

    近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...

  4. Django:学习笔记(8)——文件上传

    Django:学习笔记(8)——文件上传 文件上传前端处理 本模块使用到的前端Ajax库为Axio,其地址为GitHub官网. 关于文件上传 上传文件就是把客户端的文件发送给服务器端. 在常见情况(不 ...

  5. Django文件上传下载与富文本编辑框

    django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...

  6. .Net Core 图片文件上传下载

    当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口. ...

  7. java+大文件上传下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  8. Retrofit2文件上传下载及其进度显示

    序 前面一篇文章介绍了Retrofit2的基本使用,这篇文章接着介绍使用Retrofit2实现文件上传和文件下载,以及上传下载过程中如何实现进度的显示. 文件上传 定义接口 1 2 3 @Multip ...

  9. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

随机推荐

  1. [题解](最短路)luogu_P5122 Fine Dining

    首先理解这里的美味值相当于给你更多时间让你经过这个草垛的, 也就是在经过草垛时可以给你的时间减少w[i],这样能否比最短路不慢 然而我们并不容易知道怎么走才是最好的,所以要想办法避免找这个方案 我们新 ...

  2. Django (九) 项目开发流程&项目架构

    项目开发流程&项目架构 1. 软件开发的一般流程 1. 需求分析及确认: 由需求分析工程师与客户确认甚至挖掘需求.输出需求说明文档. ​ 2. 概要设计及详细设计: 开发对需求进行概要设计,包 ...

  3. 【bzoj1726】Roadblocks

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1578  Solved: 795[ ...

  4. Codeforces Round #542(Div. 2) B.Two Cakes

    链接:https://codeforces.com/contest/1130/problem/B 题意: 给定n和 2 * n个数,表示i位置卖ai层蛋糕, 有两个人在1号,必须严格按照1-n的顺序买 ...

  5. oratop

    1.下载: 目前,Oratop是在MOS上免费下载.每个db 版本和 os 版本都有对应的程序:The tool is a compiled c program. 不需要编译,直接运行.   (下载文 ...

  6. audio、video的控制

    W3C上面给的是js控制相关的播放与暂停,不过在实际开发中我们多会选择JQ来操作的,毕竟方便很多,而play()和pause()用于js play并不是jQuery的函数,而是DOM元素的函数,所以我 ...

  7. IDEA自定义设置快捷键输出你想要的语句!

    转载,侵权必删 用Eclipse时间长了, 就习惯之前的快捷键! 当然, IDEA不愧是Java开发的”利器”! 写起代码就是一个字 – “爽”! 建议大家可以去尝试一下! 当然, 在IDEA中输出S ...

  8. msyql 死锁

    1.使用 show processlist; 查询当前进程; 找到Command 状态是query 并且Time 时间很长的id kill掉即可 2.select * from information ...

  9. 页面在Native端滚动时模拟原生的弹性滚动效果

    width: 100%;overflow: scroll;overflow-y: hidden;-webkit-overflow-scrolling: touch;   ---- 对应的滚动内容内添加 ...

  10. javascript 流程控制及函数

    回顾 基本语法 在html的使用 <script></script> 注释 ///* */ 指令结束符 ;换行 输出 console.log()document.write() ...