Python2—0729笔记

本文深入讲解了Cookie和Session的工作原理及应用,展示了如何在Django框架中使用它们进行用户认证和状态保持,包括创建项目、设置URLs、编写视图函数、处理登录状态等关键步骤。

4.1-4.2 cookie和session


客户端存cookie

服务端存session

http协议是短链接

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

https://www.cnblogs.com/onda/p/7442591.html

功能:网页上登陆账号以后,再打开其他页面也不需要再输入用户名密码。退出登录以后,打开网页,需要重新登陆。

实现:

创建page 项目

urls.py

代码

from django.conf.urls import url

from django.contrib import admin

from demo01 import views

urlpatterns = \[

    url(r'^admin/', admin.site.urls),

    url(r'^test', views.Test),

    url(r'^session', views.Session),

    url(r'^del\_session', views.Del\_Se),

    url(r'^login', views.login_demo),

    url(r'^index', views.index_demo),

\]

views.py

代码

import json

from django.shortcuts import render,HttpResponse,redirect

from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

from demo01 import models

def Test(request):

    data_li=\['john', 'paul', 'george', 'ringo'\]

    data\_obj\_li=models.UserInfo.objects.all()

    p=Paginator(data\_obj\_li,2)

    print('数据总数:',p.count)

    print('数据页数:',p.num_pages)

    print('数据页数:',p.page_range)

    print('是否有下一页:',p.page(2).has_next())

    print('是否有上一页:',p.page(2).has_previous())

    print('是否有其他页:',p.page(2).has\_other\_pages())

    print('下一页的页码:',p.page(2).next\_page\_number())

    print('上一页的页码:',p.page(2).previous\_page\_number())

    request.session\['login'\]=data_li

    page=int(request.GET.get('page',1))

    try:

        data\_obj\_li = p.page(page)

    except PageNotAnInteger:

        data\_obj\_li = p.page(1)

    except EmptyPage:

        data\_obj\_li = p.page(p.num_pages)

    # return HttpResponse('ok')

    return render(request,'test.html',locals())

def Session(request):

    get_session=request.session.get('login',False)

    if get_session:

        cookie_content=request.COOKIES

        session_content=request.session

    return render(request,'session.html',locals())

    # return HttpResponse(json.dumps(get_session))

def Del_Se(request):

    request.session.clear()

    get_session=request.session.get('login',11)

    return HttpResponse(json.dumps(get_session))

def login_demo(request):

    if request.method == 'GET':

        #第一次访问

        return render(request,'login.html')

    else:

        username=request.POST.get('username',False)

        password=request.POST.get('password',False)

        if not username or not password:

            #用户名密码是空

            return HttpResponse('用户名密码不能为空')

        else:

            user_obj=models.UserInfo.objects.filter(UserName=username,

                                           PassWord=password

                                           )

            if user_obj.first():

                #登录成功

                request.session\['login'\] = serializers.serialize("json",user_obj)

                return redirect('/index')

            else:

                #登录失败

                return HttpResponse('用户名密码错误')

def index_demo(request):

    if request.session.get('login',False):

        return HttpResponse('欢迎登录阿铭python系统')

    else:

        return redirect('/login')

login.html

代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<div>

    <form method="post">

        用户名:<input type="text" name="username">

        密码:<input type="text" name="password">

        <input type="submit"  value="提交">

    </form>

</div>

</body>

</html>

session.html

代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

    <div>

    COOKIE:{{ cookie_content }}

        </div>

    <div>

    SESSION:{{ session_content }}

        </div>

    <a href="/test">返回</a>

</body>

</html>

test.html

代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

    <table  >

        <thead>

            <tr>

                <th>用户名</th>

                <th>密码</th>

                <th>人名</th>

            </tr>

        </thead>

        <tbody>

            {% for item in data\_obj\_li %}

                <tr>

                    <td>{{ item.UserName }}</td>

                    <td>{{ item.PassWord }}</td>

                    <td>{{ item.Name }}</td>

                </tr>

            {% endfor %}

        </tbody>

    </table>

<div>

    <ul class="pagination" id="pager">

             {% if data\_obj\_li.has_previous %}

                <li class="previous"><a href="/test/?page={{ data\_obj\_li.previous\_page\_number }}">上一页</a></li>

             {% else %}

                <li class="previous disabled"><a href="#">上一页</a></li>

             {% endif %}

             {% for num in p.page_range %}

                 {% if num == page %}

                   <li class="item active"><a href="/test/?page={{ num }}">{{ num }}</a></li>

                 {% else %}

                   <li class="item"><a href="/test/?page={{ num }}">{{ num }}</a></li>

                 {% endif %}

             {% endfor %}

             {% if data\_obj\_li.has_next %}

                <li class="next"><a href="/test/?page={{ data\_obj\_li.next\_page\_number }}">下一页</a></li>

             {% else %}

                <li class="next disabled"><a href="#">下一页</a></li>

             {% endif %}

        </ul>

</div>

    <a href="/session">跳转到session页面</a>

    <a href="/del_session">删除session</a>

</body>

</html>

models.py

代码

from django.db import models

\# Create your models here.

class UserInfo(models.Model):

    UserName=models.CharField(max\_length=32,null=True,blank=True,verbose\_name='用户名')

    PassWord=models.CharField(max\_length=32,null=True,blank=True,verbose\_name='密码')

    Name=models.CharField(max\_length=32,null=True,blank=True,verbose\_name='真名')

(venv) C:\Users\shenj\PycharmProjects\page>python manage.py makemigrations

(venv) C:\Users\shenj\PycharmProjects\page>python manage.py migrate

demo01_userinfo[db]

运行

访问127.0.0.1:8000/login/

访问127.0.0.1:8000/session

访问127.0.0.1:8000/del_session

清空session

访问127.0.0.1:8000/session

session 被清空

转载于:https://my.oschina.net/u/3959701/blog/3080517

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值