session与cookie

前后台分离开发的概念

1.前台页面运行在前台服务器上,负责页面的渲染(静态文件的加载)与转跳

2.后台代码运行在后台服务器上,负责数据的处理(提供数据请求的接口)

跨域请求数据

1.前台与后台有跨域问题,解决跨域安装django-cors-headers模块

在settings.py中配置

注册app

INSTALLED_APPS = ['corsheaders']

添加中间件

MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware'']

允许跨域源

CORS_ORIGIN_ALLOW_ALL= True

前台代码

$.ajax({

url:'http://127.0.0.1:8801/login/',

type:'post',

data:{

usr:'usr',

pwd:'pwd'}

success:function(data){

console.log(data)}

})

后台代码

def login(request):

  if request.method == 'post':

    usr = request.POST.get('usr',None)

    pwd = request.POST.get('pwd',None)

    if usr == 'abc' and pwd == '123':

      return JsonResponse({'status':'ok','usr':usr})

    return JsonResponse({'status':'error','usr',None})

文件上传

浏览器

<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,//不预处理数据

sunccess:function(data){

console.log(data)}

})

})

</script>

后台:

def upload(request):

  file = request.FILES.get('file',None)

  if file:

    with open(file.name,'wb')as f:

      for line in file:

        f.write(line)

   return JsonReponse({'status':'ok','msg':'upload success'})

文件下载

<a href="http://127.0.0.1:8001/download/">下载</a>

<button type="button" class="download">下载</button>

<script>

  $('.download').click(function(){

  loaction.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['Conten-Disposition'] = 'attachment;filename="%s"' %file.name

return response

cookie介绍

Django用HttpResponse对象操作Cookie

response = HttpResponse('所有的响应都是HttpResponse对象')

设置cookie:key,value与过期时间

response.set_cookie(key,value,max_age)

删除cookie:key

response.delete_cookie(key)

设置加盐cookie:key,value与盐字符串(就是简单的加密)

response.set_signed_cookie(key,value,salt)

通过response对象获取Cookie

获取key对应的value

response.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

session介绍

1.设置session

request.session['key1']=value1

request.session['key2']=value2

过程:

1.生成一个随机字符串,作为主键

2.在sdjango_session表中插入有三个字段的一条数据

一条数据对应一个浏览器会话

session_key:主键-随机字符串

session_data:该回话拥有的所有key_value形成的大字典的加密字符串

expire_date:过期时间,默认为14天

3.往浏览器中写入一条cookie,sessionid=主键的随机字符串

2.获取session

request.session.get('key',None)

3.删除session

request.session.delete() 只删除了当前会话对应的一条记录

request.session.flush() 除了删除当前会话对应的一条记录外,还删除对应浏览器中的cookie,建议使用

4.清除django-session表中所有过期的session字段

requst.session.clear_expired()清除所有过期的Session

5.了解

request.session.session_key 获取当前会话对应的session_key

request.session.exists('session_key')判断某session_key是否存在

session的settings配置

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 = False
# 浏览器关闭后cookie是否过期,默认False不过期,建议True
# SESSION_SAVE_EVERY_REQUEST = False
# 每一次请求,是否更新session字段的过期时间,
默认False不更新,建议True

原文地址:https://www.cnblogs.com/suncunxu/p/10519116.html