Django 之 登录cookie使用

1.原理

     一个简单的view 中的  登录方法:

def login(request):
    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('password')
        if user == '123' and pwd == '123':
            ret=redirect('/home/')
            ret.set_cookie('is_login','1')
            return ret
    return render(request, 'login.html')

      cookie 是服务器让浏览器 保存在 浏览器本地的 一组键值对  http协议是无状态的 每次请求 都是无关联的,没有状态,

       用cookie 来保存状态

      在对一个页面 进行post 请求时  ,如果账号密码正确,服务器就给 post 的这个页面   

         在响应头设置一个 响应cookie ,然后重定向访问home这 个页面时,  就带上那个cookie放在请求头去访问

     

这是一个需要登录 才能得到的页面:

def home(request):
    # print(request.COOKIES) {'is_login': '1'}
    if request.COOKIES.get('is_login') == '1':
        return HttpResponse('hello')
    return HttpResponse(' not login')

2.加装饰器  来设置cookie 校验 

# 写一个装饰器
def login_required(fn):
    def inner(request,*args,**kwargs):
        if not request.COOKIES.get('is_login') == '1':
            return redirect('/login/')
        ret=fn(request,*args,**kwargs)       #这里执行原来函数的功能
        return ret                           #return 原来函数的 返回值
    return inner                             #return inner函数出去 执行

@login_required
def index(request):
   return HttpResponse('这是index')

  login_required(fn)   fn为 index 函数 传入  在inner函数 内 加上 校验 后再执行,用ret来接收  index 的返回值并返回

  最后把 inner 函数 return 出去 执行    @login_required的作用相当于 index=login_required(index)

  然后index() 执行

 2.优化版:  对于重定向哪个网址  做判断

def login(request):
    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('password')
        if user == '123' and pwd == '123':
            next=request.GET.get('next')                       2.拿到action中想要去的网址
            ret=redirect(next)                                 3.重定向去网址
            ret.set_cookie('is_login','1')
            return ret
    return render(request, 'login.html')

def login_required(fn):
    def inner(request,*args,**kwargs):
        if not request.COOKIES.get('is_login') == '1':
            next=request.path_info
            return redirect('/login/?next={}'.format(next))   1.获得想要去的网址重定向到login.html  
        ret=fn(request,*args,**kwargs)                         此时form表单的action 已经获得想要去的url路径      
        return ret                           
    return inner                            
@login_required
def home(request):
    return HttpResponse('这是home')
@login_required
def index(request):
   return HttpResponse('这是index')
def logout(request):   #删除cookie
    ret=redirect('login')
    ret.delete_cookie()
    return ret

   return render(request, 'login.html')  render把request传入login页面          action 动态的改变 url 

    在login网页中    <form action="{{ request.get_full_path }}" method="post">  获得url路径  再提交时post 路径为想要的url

3.加密的cookie   session会话使用

    1.cookie保存在浏览器上的 不安全   2.cookie 的长度受到限制   3.session保存在服务器上,依赖于cookie

     设置   request.session['is_login']='1'   或request.sesion.setdefault(key,value)   

     获取   if not request.session.get('is_login') == '1':   request.session['key']

     配置数据库 python manage.py migrate   增加一个django_session的表   含有 session_key    value    失效时间 expired() 字段

     2.session的一些用法:

     request.session.session_key          request.session.clear_expired()  request.session.exists(session_key)

     request.session.delete()  删除所有session会话   不会删浏览器 上的cookie                       .flush()  全部删除

     request.session.set_expired()         0关闭浏览器就失效    ,datetime设置时间之后失效,      int是数秒后失效   

     3.清除过期的session:  request.session.clear_expired()

      from django.conf import global setting   全局设置 里配置session 

       session_cookie_name = ' sessionid'         session.engine='默认session_key存的数据库'

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值