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. [Python]'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 错误

    f = open('C:\Users\xu\Desktop\ceshi.txt') 这时报标题的错误信息 f = open(r'C:\Users\xu\Desktop\ceshi.txt') 改成这个 ...

  2. JS的this原理

    转载阮一峰博客: www.ruanyifeng.com/blog/2018/06/javascript-this.html 一.问题的由来   学懂 JavaScript 语言,一个标志就是理解下面两 ...

  3. centos7版本对比之前版本的部分命令差异

    centos7版本下的命令和之前的centos版本的命令有些许不同,最近在电脑上用VBox安装了一个centos7版本.在做一些网卡配置和安装mysql的时候遇到了一些问题.在这里总结跟大家分享下. ...

  4. 如何在VirtualBox虚拟机中安装XP系统? 转

    关闭VM (windows 7 )的方法, 使用 退出 保持状态 开启VM (windows 7 )的方法, 选择启动 ######Iissue 1 网络连接不上,可以重新初始化 网络连接. #### ...

  5. java 美团面试常见问题总

    一 基础篇 1. System.out.println(3|9)输出什么? 2. 说一下转发(Forward)和重定向(Redirect)的区别 3. 在浏览器中输入url地址到显示主页的过程,整个过 ...

  6. js 打开新窗口

    以前老是用window.open方法打开浏览器新窗口,但是有的浏览器会阻止打开新窗口,一劳永逸的方式是通过js伪造a标签请求打开新窗口,代码如下: var atag = document.create ...

  7. nginx 配置步骤

    D:\myphp2017\nginx\conf.nginx.conf37行 吧localhost 改为www.ff.com41行取消注释44行 加D:\myphp2017\nginx\html45 在 ...

  8. BundleConfig包含js,css失败

    今天在做mvc项目的时候,引入了bootstrap样式.但是包含css和js的时候出错了 于是我查阅资料,好多人都说后缀名前面不能包含".",于是我把min前面的".&q ...

  9. git与GitHub(二)

    昨天在安装完git之后,出了一个问题,虽然暂时有解决的办法,但是由于电脑中了病毒并且配置低下等原因,这个问题的解决办法目前还有待考证.遇到的问题是这样的: 前提是想试一下git在命令行里的命令:于是: ...

  10. java.lang.ClassCastException android.widget.RelativeLayout LayoutParams 异常

    1.在xml布局文件如下所示: <RelativeLayout android:layout_width="match_parent" android:layout_heig ...