博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Djiango django跨域 cookie session
阅读量:4677 次
发布时间:2019-06-09

本文共 5342 字,大约阅读时间需要 17 分钟。

一、django跨域问题

1、什么时跨域

  通常情况下,A网页访问B服务器资源时,满足以下三个条件其一就是跨域访问

  1. 协议不同
  2. 端口不同
  3. 主机不同

2、django解决跨域

安装django-cors-headers模块在settings.py中配置# 注册appINSTALLED_APPS = [    ...    'corsheaders']# 添加中间件MIDDLEWARE = [    ...    'corsheaders.middleware.CorsMiddleware']# 允许跨域源CORS_ORIGIN_ALLOW_ALL = True

二、文件上传

浏览器

后台

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'    })

三、文件下载

浏览器

下载

后台

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对象操作Cookieresponse = HttpResponse('所有的响应都是HttpResponse对象')# 设置cookie:key、vaule与过期时间response.set_cookie(key, value, max_age)# 删除cookie:keyresponse.delete_cookie(key)# 设置加盐cookie:key、vaule与盐字符串(就是简易的加密)response.set_signed_cookie(key, value, salt)# 通过request对象获取Cookie# 获取key对应的valuerequest.COOKIES.get(key, None)# 获取加盐后的key对应的valuerequest.get_signed_cookie(key, salt)

附:

了解:set_cookie方法的其他参数1. expires:过期时间,格式为字符串类型的时间2. path:作用路径,/代表所有路径下均起作用3. domain:作用域名4. secure:布尔类型,浏览器是否通过HTTPS方式回传cookie5. httponly:布尔类型,JS能否直接访问该条cookie

3、cookie运用案例

需求

1. /index/访问主页(可直接访问),主页中存在四个转跳    -- 登录(/login/)    -- 个人主页(/user/)    -- 订单详情(/order/)    -- 注销(/logout/)2. 进入个人主页、订单详情页面时,如果未登录,需先登录,然后自动回到个人主页或订单详情页面,反之直接进入
# views.pyfrom 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_checkdef order(request):    print(request.COOKIES)    usr = request.COOKIES.get('usr', None)    return render(request, 'order.html', locals())@login_checkdef 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
View Code

五、session

1、session简介

  a、什么是session:在后台通常以密文形式存放key、value形式数据,一个会话存放为数据库的一条字段

  b、session的作用:结合cookie使用,解决cookie的不安全性
  c、session简介:session是存放在服务器端的key-value形式的状态数据

2、session的常用基本操作

# 1. 设置request.session['key1'] = 'value1'request.session['key2'] = 'value2'# 过程:# i) 生成一个随机字符串,作为主键# ii) 在django_session表中插入有三个字段的一条数据(一条数据对应一个浏览器会话)    # -- session_key:主键-随机字符串    # -- session_data:该会话拥有的所有key-value形成的大字典的加密字符串    # -- expire_date:过去时间,默认14天# iii) 往浏览器中写入一条cookie,sessionid=主键的随机字符串#2. 获取request.session.get('key', None)#3. 删除request.session.delete()  # 只删除当前会话对应的一条记录request.session.flush()   # 除了删除当前会话对应的一条记录外,还删除对应浏览器中的cookie#4. 其他request.session.session_key   # 获取当前会话对应的session_keyrequest.session.exists('session_key')  # 判断某session_key是否存在request.session.clear_expired()   # 情况所有过去的Session
# settings.py配置# 1. 数据库存储# SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)## 2. 缓存存储# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎# SESSION_CACHE_ALIAS = 'default'  # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置## 3. 文件存储# SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎# SESSION_FILE_PATH = '/'  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()## 4. 缓存 + 数据库存储# SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  # 引擎## 5. 加密Cookie# SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'  # 引擎## SESSION_COOKIE_NAME = "sessionid"  # cookie的key名,值为随机字符串# SESSION_COOKIE_PATH = "/"  # 作用路径,/代表所有路径下均起作用)# SESSION_COOKIE_DOMAIN = None  # 作用域名# SESSION_COOKIE_SECURE = False  # 布尔类型,浏览器是否通过HTTPS方式回传cookie# SESSION_COOKIE_HTTPONLY = True  # 布尔类型,JS能否直接访问该条cookie# SESSION_COOKIE_AGE = 1209600  # 数据库session字段的过期时间# SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 浏览器关闭后cookie是否过期,默认False不过期# SESSION_SAVE_EVERY_REQUEST = False  # 每一次请求,是否更新session字段的过期时间,默认False不更新

 

转载于:https://www.cnblogs.com/peng-zhao/p/10520758.html

你可能感兴趣的文章
APP自动化测试
查看>>
HTML中让表单input等文本框为只读不可编辑的方法
查看>>
nodejs做中间层,向后端取数据
查看>>
IntelliJ IDEA 2017 MySQL5 绿色版 Spring 4 Mybatis 3 配置步骤详解(二)
查看>>
Design Pattern --- Strategy
查看>>
mui列表跳转到详情页优化方案
查看>>
一些简单有用的方法合集
查看>>
Neutron 架构 - 每天5分钟玩转 OpenStack(67)
查看>>
详解JS设计模式
查看>>
CPSR寄存器
查看>>
Java基础50题test7—处理字符串
查看>>
保险行业电话外呼型呼叫中心方案
查看>>
自建型呼叫中心
查看>>
input file 文件上传,js控制上传文件的大小和格式
查看>>
Day 6 函数与模块
查看>>
WebApi请求原理
查看>>
[Node.js] node-persist: localStorage on the server
查看>>
jquery.event 研究学习之bind篇
查看>>
LOJ #108. 多项式乘法
查看>>
libusb开发指南
查看>>