zoukankan      html  css  js  c++  java
  • 跨域问题,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
  • 相关阅读:
    UML类图几种关系的总结
    date long 互相转换
    tortoise更新后eclipse项目挂掉,报错找不到类
    eclipse快捷键
    ECLIPSE 环境变量配置,MAVEN本地仓库
    Android _关于fragment切换重新加载的解决分享给大家
    Java_反射机制详解
    Java_try,catch,finally return之间的执行顺序
    Java_单例模式
    Android_设置全屏的方法
  • 原文地址:https://www.cnblogs.com/wrqysrt/p/10519538.html
Copyright © 2011-2022 走看看