自学Django之路---Day5.Cookie、Response、会话技术

9 篇文章 0 订阅
6 篇文章 0 订阅

数据库的迁移

迁移

Response

可以指定状态码、内容等。

重定向

HttpResponseRedirect(简写 redirect)

def buy(request):
    if random.randrange(10) > 5:
        return HttpResponseRedirect('/App/hello/')

    return HttpResponse('成功')

JsonResponse(简写 redirect)

  • 以json格式返回数据

Cookies

名称释义
Cookie客户端会话技术(数据存储在客户端),键值对存储,支持过期时间,
Session服务端会话技术,数据存储在服务器中,默认Session存储在内存中,Django中默认会把Session持久化到数据库中,数据使用了base64(并在前面添加了混淆串),依赖于Cookie
Token服务端会话技术,由于session依赖cookie,而后者又依赖于浏览器

Cookie

views:
def login(request):
    return render(request, 'login.html')


def dologin(request):
    uname = request.POST.get('uname')
    response = HttpResponseRedirect(reverse('App:home_page'))
    response.set_cookie('uname', uname)

    return response


def homepage(request):
    uname = request.COOKIES.get('uname')
    if uname:
        return HttpResponse(uname)

    return render(request, 'goto.html')
login.html:
<form action="{% url 'App:do_login' %}" method="post">
    <span>用户名:</span> <input type="text" placeholder="请输入用户名" name="uname">
    <br>
    <button>登录</button>
</form>

goto.html:
<h3>没有cookie,正在跳转到登录页面...</h3>
<a href="{% url 'App:Login' %}">点击跳转</a>

我们首先输入/App/login/进到登录界面,输入用户名后,会发送一个post请求给dologin,
在dologin中设置了cookie,并重定向到homepage,如果能提取到cookie那么就输出;如果
没提取到(可能是直接访问了homepage),那么就会跳转到goto.html进而返回login页面。

但是关闭浏览器上述的cookie就失效了
这就需要看一下其他的参数(默认不支持中文):

参数释义
max_age指定秒数

上面写的程序cookie在浏览器中是明文的,如果想加密,则需要把

  • response.set_cookie(‘uname’, uname)

换成:

  • response.set_signed_cookie(‘content’, uname, ‘Rock’)
    那么在解密时,要用request.get_signed_cookie(‘uname’, salt=‘Rock’)

添加退出登录功能

home.html:
<h2>欢迎回来{{ uname }}</h2>
<a href="{% url 'App:logout' %}">退出</a>

views:
def homepage(request):
    # uname = request.COOKIES.get('uname')
    try:
        uname = request.get_signed_cookie('uname', salt='Rock')
        if uname:
            return render(request, 'home.html', context={'uname': uname})
    except Exception as e:
        return render(request,'goto.html')


def logout(request):
    response = HttpResponseRedirect(reverse('App:Login'))
    response.delete_cookie('uname')

    return response

流程:登录后进入到home界面,点击退出选项时:

  • 输入/App/login/,进入login view,render登录页面,输入用户名,点击登录
  • 访问do_login view,这是个POST请求,因而设置cookie,设置成功后重定向home_page
  • 访问home_page view,提取出uname cookie,若有则render home.html
  • 进入到home.html,浏览器获得logout的url
  • 然后进入到logout view,收到request请求,生成了一个重定向response(这个是要发回给浏览器的)
  • 浏览器收到后,cookie已经被删掉了,接着去访问login
  • 这时如果再去访问homepage,由于没有cookie,就会发生异常,返回至login页面

Session

views:

def login(request):
    if request.method == 'GET':
        return render(request, 'two_login.html')
    elif request.method == 'POST':
        username = request.POST.get('username')
        request.session['username'] = username

        return HttpResponse('登录成功')


def mine(request):
    username = request.session.get('username')

    return render(request, 'two_mine.html', context=locals())


def logout(request):
    response = redirect(reverse('two:mine'))
    # response.delete_cookie('sessionid')
    # del request.session['username']
    request.session.flush()

    return response
  • response.delete_cookie(‘sessionid’) 删除Cookie
  • del request.session[‘username’] 删掉数据库中session(但还会有残留)
  • request.session.flush() 最彻底

有些偷懒了…
会话技术

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值