一、django跨域问题
1、什么时跨域
通常情况下,A网页访问B服务器资源时,满足以下三个条件其一就是跨域访问
1. 协议不同
2. 端口不同
3. 主机不同
2、django解决跨域
安装django-cors-headers模块 在settings.py中配置 # 注册app INSTALLED_APPS = [ ... 'corsheaders' ] # 添加中间件 MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware' ] # 允许跨域源 CORS_ORIGIN_ALLOW_ALL = True
二、文件上传
浏览器
<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]; 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) 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
1、cookie简介
a、什么是cookie:前端浏览器以明文形式存放的具有key、value信息特征的字符串
b、cookie的作用:在前后台均可以访问并设置cookie,从而解决http协议的无状态特点导致先后两次请求无逻辑可寻问题(如:不同用户登录后,再进入个人主页,明显是有信息区别的)
c、cookie简介:随着浏览器的发展,很多浏览器不再对cookie个数加以限制,但仍存在大小的限制,一般为4k;但为了达到传输的高效,服务器的解析速度,还是建议开发者严格控制cookie个数
d、cookie初始:为页面文档document的一个字符串属性:document.cookie = 'key=value;'
2、cookie的基本操作方法
# Django用HttpResponse对象操作Cookie response = HttpResponse('所有的响应都是HttpResponse对象') # 设置cookie:key、vaule与过期时间 response.set_cookie(key, value, max_age) # 删除cookie:key response.delete_cookie(key) # 设置加盐cookie:key、vaule与盐字符串(就是简易的加密) response.set_signed_cookie(key, value, salt) # 通过request对象获取Cookie # 获取key对应的value request.COOKIES.get(key, None) # 获取加盐后的key对应的value request.get_signed_cookie(key, salt)
附:
了解:set_cookie方法的其他参数 1. expires:过期时间,格式为字符串类型的时间 2. path:作用路径,/代表所有路径下均起作用 3. domain:作用域名 4. secure:布尔类型,浏览器是否通过HTTPS方式回传cookie 5. httponly:布尔类型,JS能否直接访问该条cookie
3、cookie运用案例
需求
1. /index/访问主页(可直接访问),主页中存在四个转跳 -- 登录(/login/) -- 个人主页(/user/) -- 订单详情(/order/) -- 注销(/logout/) 2. 进入个人主页、订单详情页面时,如果未登录,需先登录,然后自动回到个人主页或订单详情页面,反之直接进入
# views.py from django.shortcuts import render, redirect, HttpResponse # 确认登录装饰器 def login_check(func): def inner(request, *args, **kwargs): is_login = request.COOKIES.get('is_login', False) # 确定当前被装饰的请求,登录完毕可以跳转回去 url = request.get_full_path() if is_login: return func(request, *args, **kwargs) else: # 将回跳的路径作为参数(登录的表单action需要空着不写) return redirect('/login/?back_url=%s' % url) return inner # 主页 def index(request): return render(request, 'index.html') # 登录页面 def login(request): if request.method == "GET": return render(request, 'login.html') if request.method == "POST": # 获取回跳的地址 back_url = request.GET.get('back_url', '/index/') usr = request.POST.get('usr', None) pwd = request.POST.get('pwd', None) if usr == 'abc' and pwd == '123': # 确定回跳 response = redirect(back_url) # 登录成功获取cookie for i in range(500): response.set_cookie('usr%i' % i, usr) response.set_cookie('is_login', True) return response @login_check def order(request): print(request.COOKIES) usr = request.COOKIES.get('usr', None) return render(request, 'order.html', locals()) @login_check def user(request): usr = request.COOKIES.get('usr', None) return render(request, 'user.html', locals()) def logout(request): response = HttpResponse('注销成功') response.delete_cookie('is_login') response.delete_cookie('usr') return response