Cookie、Session和分页

为什么使用Cookie:因为HTTP请求是没有状态的,每一次请求都是独立的。

什么是Cookie:Cookie就是保存在浏览器上的键值对,服务端控制着响应,在响应里添加一个键值对,让浏览器在本地保存,下一次请求的时候,自动携带这个键值对,是在浏览器端设置的,浏览器端也可以禁用Cookie。

Cookie的设置,以及使用装饰器验证浏览器的登录状态

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def login(request):
    if request.method == "POST":
        name = request.POST.get("name")
        pwd = request.POST.get("pwd")
        if name == 'alex' and  pwd == '123123':
            next = request.GET.get('next')
            print(next)
            if next:
                res = redirect(next)
                res.set_signed_cookie("is_login","1",salt="s10nb",max_age=10)
                return res
            res =  redirect('/app01/home/')
            res.set_signed_cookie("is_login","1",salt="s10nb" ,max_age=10)
            return res
    return render(request, 'app01/login.html')
def  home(request):
    res = request.get_signed_cookie("is_login",default="0",salt="s10nb")
    if res == '1':
        return render(request, 'app01/home.html')
    else :
        return  redirect('/app01/login/')

def timmer(func):
    def wrapper(request):
        res = request.get_signed_cookie("is_login",default="0",salt="s10nb")
        if res == '1':
           ret = func(request)
           return ret
        else :
            next_url = request.path_info
            print(next_url)
            return  redirect('/app01/login/?next={}'.format(next_url))
    return wrapper
@timmer
def index(request):
    return render(request, 'app01/index.html')

 默认关闭浏览器,Cookie值就失效,可以设置时长max_age=7*24*60*60(七天失效)

注销登录

def logout(request):
    rep = redict("/app01/login/")
    rep.delete_cookie('is_login')
    return rep

 Session

Session是保存在浏览器上的键值对,必须依赖Session,服务端生成的Cookie返回到浏览器,跟Cookie匹配的Session保存在服务器端,下次再登录时,根据Cookie获取Seeion值,存储的数据多,较为安全。

设置Session

 request.session['is_login']='1'

 获取Session值

首先获取Cookie的随机字符串,根据字符串的值去数据库取Seeion的数据,解密,把Session值反序列化成字典,然后在字典里可以根据key取值。

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def login(request):
    if request.method == "POST":
        name = request.POST.get("name")
        pwd = request.POST.get("pwd")
        if name == 'alex' and  pwd == '123123':
            next = request.GET.get('next')
            print(next)
            if next:
                res = redirect(next)
                request.session['is_login']='1'
                return res
            res =  redirect('/app02/home/')
            request.session['is_login']='1'
            return res
    return render(request, 'app02/login.html')
def  home(request):
    res = request.session.get('is_login')
    if res == '1':
        return render(request, 'app02/home.html')
    else :
        return  redirect('/app02/login/')

def timmer(func):
    def wrapper(request):
        res = request.session.get('is_login')
        if res == '1':
           ret = func(request)
           return ret
        else :
            next_url = request.path_info
            print(next_url)
            return  redirect('/app02/login/?next={}'.format(next_url))
    return wrapper
@timmer
def index(request):
    return render(request, 'app02/index.html')

 注销登录,删除Session和Cookie数据

def logout(request):
    request.session.flush()   # request.session.delete()只删除session不删除cookie
    return redirect("/app02/login")

 request.session.set_expiry(value)

value如果是整数,就是多少秒之后失效

value如果是datatime或者timemelta,session就会在这个时间后失效

value如果是0,关闭浏览器就失效。

SESSION_COOKIE_AGE=129600  session的Cookie失效日期默认为2周。

SESSION_SAVE_EVERY_REQUEST = True    设置后,每一次的请求都重新保存session

默认session修改后才重新保存

自定义分页

首选数据库批量创建数据

import  os,sys
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ajax_demo.settings")
    import django
    django.setup()
    from app01  import models
    objs = [models.Userinfo(name="第{}个".format(i))  for i  in range(105)]
    models.Userinfo.objects.bulk_create(objs,10)

 views.py

#分页
def  page_s(request):
    objs = models.Userinfo.objects.all()
    page_line = len(objs)
    m,n = divmod(page_line,10)
    page_sum = m
    if n>0:
        page_sum = m+1
    # page_sum=[i for i  in range(1,page_sum+1)]
    Page_sum = page_sum+1
    page_id = request.GET.get('page_id')
    page_start = 0
    page_end = 10
    pro_page_id = 0
    net_page_id = 2
    page_sum_start = 1
    page_sum_end = 11
    if page_sum<11:
        page_sum_end=page_sum
    if page_id :
        page_id = int(page_id)
        page_start = (page_id-1)*10
        page_end = (page_id)*10
        pro_page_id = page_id-1
        net_page_id = page_id+1
        if page_id - 5 >0 and page_id +5 <=page_sum:
            page_sum_start = page_id -5
            page_sum_end = page_id +5
        if page_id +5 >page_sum:
            page_sum_start = page_sum-10
            page_sum_end = page_sum
    page_sum =[i for i in range(page_sum_start,page_sum_end+1)]
    print(page_start,page_end)
    objs = objs[page_start:page_end]
    print(objs)
    return render(request,'page_s.html',
                  {"objs":objs,
                   "page_sum":page_sum,
                   "pro_page_id":pro_page_id,
                   "net_page_id":net_page_id,
                   "Page_sum":Page_sum})

 page_s.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<table>
    <thead>
    <tr>
        <td></td>
    </tr>
    </thead>
    <tbody>
    {% for obj in objs %}

        <tr>
            <td>
                {{ obj.name }}
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>
<nav aria-label="Page navigation" class="pull-right">
    <ul class="pagination">
        <li>
            <a href="/page_s/?page_id={{ pro_page_id }}" class="btn {% if pro_page_id == 0  %} disabled {% endif %} "  aria-label="Previous">
                <span aria-hidden="true">«</span>
            </a>
        </li>
        {% for page_sigle in page_sum  %}
        <li><a href="/page_s/?page_id={{ page_sigle }}">{{ page_sigle }}</a></li>
        {% endfor %}
        <li>
            <a href="/page_s/?page_id={{ net_page_id }}"  class="btn {% if net_page_id == Page_sum  %} disabled {% endif %} aria-label="Next">
                <span aria-hidden="true">»</span>
            </a>
        </li>
    </ul>
</nav>
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>

猜你喜欢

转载自www.cnblogs.com/weidaijie/p/9934655.html