• 跨域问题,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
  • 相关阅读:
    poj 3666 Making the Grade
    poj 3186 Treats for the Cows (区间dp)
    hdu 1074 Doing Homework(状压)
    CodeForces 489C Given Length and Sum of Digits...
    CodeForces 163A Substring and Subsequence
    CodeForces 366C Dima and Salad
    CodeForces 180C Letter
    CodeForces
    hdu 2859 Phalanx
    socket接收大数据流
  • 原文地址:https://www.cnblogs.com/wrqysrt/p/10519538.html
Copyright © 2020-2023  润新知