Django框架-cookie与session

Posted sunxiuwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架-cookie与session相关的知识,希望对你有一定的参考价值。

 

from django.shortcuts import redirect
from django.shortcuts import render
from login import models  # 获取类才能orm操作库

"""
cookie与session解决登录验证
1、models中创建UserInfo类    python  manage.py  makemigrations login /migrate login --database=login_db
2、urls.py全局中配置app的urls  url(r‘^login/$‘, include(‘app_name.urls‘))   from django.conf.urls import url,include
3、在app下的views.py 创建视图函数
需求:登录除登录页面外,都需要登录才行!!!
思路:
1、用户打开页面,判断用户是否登录,已登录则直接打开,未登录则跳到登录页面登录
2、用户登录完成后,跳转到用户第一次访问时想要的页面
3、故实现上步需要提前获取用户要访问的页面url地址,保存下来
4、用户第一次登录时给用户配置一个cookie设置一个key:value保存状态
"""


# 通过cookie解决登录验证
# 保存状态,服务器产生,让浏览器存放在浏览器端,一组组键值对,4096字节长度,不够大,不安全
# 校验登录装饰器
def check_login(func):
    def inner(request, *args, **kwargs):
        """获取用户想访问的url保存下来,判断cookie状态,确认用户是否登录"""
        print(request.path)
        return_url = request.path_info  # 获取用户第一次访问的url,不含域名及参数
        # if request.COOKIES.get(‘is_login‘, "") == ‘True‘:  # 获取cookie,比较值,如果符合,说明已经登录,跳转到用户需求页面
        if request.session.get(is_login, "") == True:  # session

            ret = func(request, *args, **kwargs)  # 忘了写request参数,from表单里忘了{%csrf_token%}
        else:
            # 如何不符合跳转登录,且将用户想访问的url拼接到登录url后面,博客园就是这么做的
            ret = redirect(/login/sigin/?ReturnUrl={}.format(return_url))
        return ret

    return inner


def login(request):
    """验证用户,及配置cookie"""
    err_msg = ""
    if request.method == POST:
        username = request.POST.get(username).strip()
        password = request.POST.get(password).strip()  # 获取前端传过来的用户名和密码
        if not username or not password:
            err_msg = "用户名或密码不能为空"
            return render(request, app_login.html, {err_msg: err_msg})
        db_select = models.UserInfo.objects.filter(name=username, password=password)
        if db_select:  # 如果正确的话,需要设置cookie相当于一个flag,设置cookie必须时response对象
            return_url = request.GET.get(ReturnUrl, /login/index/)  # 获取用户要访问的页面,如果一开始就直接登录页面的话,成功后我们设置自动跳到index
            ret = redirect(return_url)  # 跳转到用户未登录前要访问的页面
            # ret.set_cookie(‘is_login‘, ‘True‘)  # 设置cookie以dict形式保存,请求后可以F12查看
            request.session[is_login] = True  # session
            return ret  # 就跳到用户想的要的页面,否则回到登录页面
        else:  # 用户名密码错误的话,提示错误,还是返回登录页面
            err_msg = 用户名或密码错误,请重新登录
    return render(request, app_login.html, {err_msg: err_msg})


@check_login
def logout(request):  # 退出就跳到登录页面
    rep = redirect(to=/login/sigin/)
    # rep.delete_cookie(‘is_login‘)
    request.session.delete()   # session的删除方法
    return rep


@check_login
def index(request):
    return render(request, app_index.html)


@check_login
def home(request):
    return render(request, app_home.html)

# 问题?
# 为什么post请求中可以通过return_url = request.GET.get(‘ReturnUrl‘, ‘/login/index/‘)

 

以上是关于Django框架-cookie与session的主要内容,如果未能解决你的问题,请参考以下文章

django框架中的cookie与session

Django框架进阶7 forms组件(pycharm内置测试环境Python Console), cookie与session操作

Django 框架篇: Cookie 与 Session

Django框架--cookie和session

Django框架(十五)-- cookie和session组件

django框架的基础知识点《贰》