一、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
View Code

相关文章:

  • 2022-12-23
  • 2021-07-13
  • 2021-12-31
  • 2022-02-01
  • 2021-07-06
  • 2022-03-10
  • 2021-11-05
  • 2021-12-28
猜你喜欢
  • 2022-12-23
  • 2022-02-16
  • 2021-08-29
  • 2021-10-10
  • 2021-11-21
  • 2021-12-30
  • 2022-12-23
相关资源
相似解决方案