跨域问题,ajax上传下载文件,cookie实现登录验证,session实现登录验证,

同台服务器端口不同,协议不同,服务器不同

1. 前台与后台有跨域问题, 解决跨域

安装django-cors-headers模块

settings.py中配置

# 注册app

INSTALLED_APPS = [

...

'corsheaders'

]

# 添加中间件


MIDDLEWARE = [

...

'corsheaders.middleware.CorsMiddleware'

]

# 允许跨域源

CORS_ORIGIN_ALLOW_ALL = True

2. 前台代码

$.ajax({

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

    type: 'post',

    data: {

        usr: 'abc',

        pwd: '123'

    },

    success: function (data) {

        console.log(data);

        // 可以完成页面的局部刷新




















<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<link rel="stylesheet" href="./bootstrap-3.3.7-dist/css/bootstrap.css">
<body>
<h2 class="h2">主页</h2>
<form>
<input type="file" class="upload" multiple> 因为协议不同发送请求要全部链接
<input type="button" class="btn-primary" value="提交">
</form>
<a href="http://127.0.0.1:8000/download/">download</a>
<a class="btn-primary">下载</a>
</body>
<script src="bootstrap-3.3.7-dist/js/jq.js">
</script>
<script>
$('.btn-primary').click(function () {

var filedata=$('.upload').get(0).files;
for (var i = 0;i<filedata.length;i++){
var formdata=new FormData(); 格式
formdata.append('file',filedata[i]);
console.log(formdata);
$.ajax({
url:'http://127.0.0.1:8000/upload/',
type:'post',
data:formdata,
contentType: false, 类型
processData: false, 响应头
success(data){
console.log(data)
}
})


}



})
$('.btn-primary').click(function () {
window.location.href='http://127.0.0.1:8000/download/'
})
</script>
</html>

ef upload(request):
files=request.FILES.get('file',None)
# for i in files:
with open(files.name,'wb')as f:
for line in files:
f.write(line)

return HttpResponse('ok')

def download(request):
file= open('5.服务器端2.py','rb')

response=FileResponse(file)
response['Content-Type'] = 'application/octet-stream' 响应头
response['Content-Disposition'] = 'attachment;filename="%s"' % file.name
return response

## cookie介绍

```python

# 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

session

```python

'''

# 在视图函数中通过request对象操作session

# 1. 设置session

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. 获取session

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

# 3. 删除session

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

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

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

request.session.clear_expired()  # 情况所有过去的Session

# 5. 了解

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

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

## session的settings配置

```python

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

'''

实现登录验证

cookie以明文的形式设置,通过访问判断是否登录,同时用装饰器实现转向登录界面时携带原链接地址

session以密文形式,在数据库有三个值,key,值,和失效时间。每个会话窗只会有一个key不变,但是在浏览器删除session会再次添加

登陆成功 对应的值与不成功对应的值不同,通过判断值来进行判断

def outter(func):
def inner(request,*args,**kwargs):
# if not request.COOKIES.get('is_login',None):
if not request.session.get('is_login', None):
path=request.get_full_path()
return_path='/login/?return=%s'%path
return redirect(return_path)
return func(request,*args,**kwargs)
return inner

def zhuye(request):
return redirect('/index')
@outter
def car(request):
# usr = request.COOKIES.get('usr', None)
usr = request.session.get('usr', None)
return render(request, 'car.html', locals())
def login(request):
if request.method=='GET':
response=render(request,'login.html')
return render(request,'login.html')
if request.method=='POST':
usr=request.POST.get('usr',None)
pwd=request.POST.get('pwd', None)
path=request.GET.get('return','/index')
if usr=='zzf' and pwd=='1996':
response=redirect(path)
request.session['usr']='zzf'
request.session['is_login'] = True
print(request.session.get('usr',None))
# response.set_cookie('usr','zzf')
# response.set_cookie('is_login', True,max_age=5)
return response
request.session['usr'] = None
request.session['is_login'] = False
print(request.session.get('usr', None))
return redirect('/index')
@outter
def space(request):
# usr=request.COOKIES.get('usr',None)
usr = request.session.get('usr', None)
return render(request,'space.html',locals())

def index(request):
return render(request,'index.html')

def loginout(request):
response = redirect('/')
# response.delete_cookie('usr')
# response.delete_cookie('is_login')
request.session.flush()
return response
原文地址:https://www.cnblogs.com/wrqysrt/p/10519538.html