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")
原文地址:https://www.cnblogs.com/robert-zhou/p/10570006.html