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

    技术2025-03-07  51

    数据库的迁移

    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(并在前面添加了混淆串),依赖于CookieToken服务端会话技术,由于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’) 删除Cookiedel request.session[‘username’] 删掉数据库中session(但还会有残留)request.session.flush() 最彻底

    有些偷懒了…

    Processed: 0.012, SQL: 9