django 12天(跨域,文件上传,下载,cookie,session)
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")