冰冻三尺非一日之寒--web框架Django(翻页、cookie)

第二十一章html

cookiepython

一、获取Cookie:jquery

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    参数:
        default: 默认值
           salt: 加密盐
        max_age: 后台控制过时时间

二、设置Cookie:ajax

rep = HttpResponse(...) 或 rep = render(request, ...)
 
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
    参数:
        key,              键
        value='',         值
        max_age=None,     超时时间
        expires=None,     超时时间(IE requires expires, so set it if hasn't been already.)
        path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie能够被任何url的页面访问
        domain=None,      Cookie生效的域名
        secure=False,     https传输
        httponly=False    只能http协议传输,没法被JavaScript获取(不是绝对,底层抓包能够获取到也能够被覆盖)

因为cookie保存在客户端的电脑上,因此,JavaScript和jquery也能够操做cookie。数据库

<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

 

分页:django

1、Django内置分页   Paginator浏览器

2、自定义分页缓存

分页功能在每一个网站都是必要的,对于分页来讲,其实就是根据用户的输入计算出应该在数据库表中的起始位置。cookie

一、设定每页显示数据条数session

二、用户输入页码(第一页、第二页...)

三、根据设定的每页显示条数和当前页码,计算出须要取数据表的起始位置

四、在数据表中根据起始位置取值,页面上输出数据

需求又来了,须要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]

一、设定每页显示数据条数

二、用户输入页码(第一页、第二页...)

三、设定显示多少页号

四、获取当前数据总条数

五、根据设定显示多少页号和数据总条数计算出,总页数

六、根据设定的每页显示条数和当前页码,计算出须要取数据表的起始位置

七、在数据表中根据起始位置取值,页面上输出数据

八、输出分页html,如:[上一页][1][2][3][4][5][下一页]

#!/usr/bin/env python
# _*_coding:utf-8_*_
from django.utils.safestring import mark_safe
 
class PageInfo(object):
    def __init__(self,current,totalItem,peritems=5):
        self.__current=current
        self.__peritems=peritems
        self.__totalItem=totalItem
    def From(self):
        return (self.__current-1)*self.__peritems
    def To(self):
        return self.__current*self.__peritems
    def TotalPage(self):  #总页数
        result=divmod(self.__totalItem,self.__peritems)
        if result[1]==0:
            return result[0]
        else:
            return result[0]+1
 
def Custompager(baseurl,currentPage,totalpage):  #基础页,当前页,总页数
    perPager=11
    #总页数<11
    #0 -- totalpage
    #总页数>11
        #当前页大于5 currentPage-5 -- currentPage+5
            #currentPage+5是否超过总页数,超过总页数,end就是总页数
        #当前页小于5 0 -- 11
    begin=0
    end=0
    if totalpage <= 11:
        begin=0
        end=totalpage
    else:
        if currentPage>5:
            begin=currentPage-5
            end=currentPage+5
            if end > totalpage:
                end=totalpage
        else:
            begin=0
            end=11
    pager_list=[]
    if currentPage<=1:
        first="<a href=''>首页</a>"
    else:
        first="<a href='%s%d'>首页</a>" % (baseurl,1)
    pager_list.append(first)
 
    if currentPage<=1:
        prev="<a href=''>上一页</a>"
    else:
        prev="<a href='%s%d'>上一页</a>" % (baseurl,currentPage-1)
    pager_list.append(prev)
 
    for i in range(begin+1,end+1):
        if i == currentPage:
            temp="<a href='%s%d' class='selected'>%d</a>" % (baseurl,i,i)
        else:
            temp="<a href='%s%d'>%d</a>" % (baseurl,i,i)
        pager_list.append(temp)
    if currentPage>=totalpage:
        next="<a href='#'>下一页</a>"
    else:
        next="<a href='%s%d'>下一页</a>" % (baseurl,currentPage+1)
    pager_list.append(next)
    if currentPage>=totalpage:
        last="<a href=''>末页</a>"
    else:
        last="<a href='%s%d'>末页</a>" % (baseurl,totalpage)
    pager_list.append(last)
    result=''.join(pager_list)
    return mark_safe(result)   #把字符串转成html语言

分页实例
分页实例

总结,分页时须要作三件事:

  • 建立处理分页数据的类
  • 根据分页数据获取数据
  • 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]

 

上节内容回顾:    一、请求周期        url> 路由 > 函数或类 > 返回字符串或者模板语言?                Form表单提交:            提交 -> url > 函数或类中的方法                                 - ....                                HttpResponse('....')                                render(request,'index.html')                                redirect('/index/')             用户  <    <  返回字符串             (当接受到redirect时)自动发起另一个请求             --> url   .....                     Ajax:            $.ajax({                url: '/index/',                data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form对象).serilize()                 type: 'POST',                dataType: 'JSON':                traditional: true,                success:function(d){                    location.reload()              # 刷新                    location.href = "某个地址"     # 跳转                }            })            提交 -> url -> 函数或类中的方法                             HttpResponse('{}')                            render(request, 'index.html', {'name': 'v1'})                            <h1>{{ name }}</h1> -->                             <h1>v1</h1>                                                        XXXXXXX redirect...            用户    <<<<<  字符串                二、路由系统URL        a. /index/                               ->  函数或类        b. /index/(\d+)                            ->  函数或类        c. /index/(?P<nid>\d+)                   ->  函数或类        d. /index/(?P<nid>\d+) name='root'          ->  函数或类            reverse()            {% url 'root' 1%}        e. /crm/    include('app01.urls')        -> 路由分发                f. 默认值            url(r'^index/', views.index, {'name': 'root'}),                    def index(request,name):                print(name)                return HttpResponse('OK')            g. 命名空间                        /admin/    include('app01.urls',namespace='m1')            /crm/      include('app01.urls',namespace='m1')                        app01.urls            /index/    name = 'n1'                                    reverser('m1:n1')        三、        def func(request):            request.POST            request.GET            request.FILES            request.getlist            request.method            request.path_info                        return render,HttpResponse,redirect                四、        render(request, 'index.html')        # for        # if        # 索引.   keys  values items    all            五、        class User(models.Model):            username = models.CharField(max_length=32)            email = models.EmailField()                    有验证功能            Django Admin        无验证功能:            User.objects.create(username='root',email='asdfasdfasdfasdf')            User.objects.filter(id=1).update(email='666')                                class UserType(models.Model):            name = models.CharField(max_length=32)                        class User(models.Model):            username = models.CharField(max_length=32)            email = models.EmailField()            user_type = models.ForeignKey("UserType")                user_list = User.objects.all()        for obj user_list:            obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id                user = User.objects.get(id=1)        user.                User.objects.all().values("username","user_type__name",)                                class UserType(models.Model):            name = models.CharField(max_length=32)                        class User(models.Model):            username = models.CharField(max_length=32)            email = models.EmailField()            user_type = models.ForeignKey("UserType")            m = models.ManyToMany('UserGroup')                                class UserGroup(models.Model):            name = ....                                obj = User.objects.get(id=1)        obj.m.add(2)        obj.m.add(2,3)        obj.m.add(*[1,2,3])                obj.m.remove(...)                obj.m.clear()                        obj.m.set([1,2,3,4,5])                # 多个组,UserGroup对象        obj.m.all()        obj.m.filter(name='CTO')                        知识点:    URL        - 两个    Views        - 请求的其余信息        from django.core.handlers.wsgi import WSGIRequest        request.environ        request.environ['HTTP_USER_AGENT']        - 装饰器            FBV:                def auth(func):                    def inner(reqeust,*args,**kwargs):                        v = reqeust.COOKIES.get('username111')                        if not v:                            return redirect('/login/')                        return func(reqeust, *args,**kwargs)                    return inner                    CBV:                from django import views                from django.utils.decorators import method_decorator                @method_decorator(auth,name='dispatch')                class Order(views.View):                    # @method_decorator(auth)                    # def dispatch(self, request, *args, **kwargs):                    #     return super(Order,self).dispatch(request, *args, **kwargs)                    # @method_decorator(auth)                    def get(self,reqeust):                        v = reqeust.COOKIES.get('username111')                        return render(reqeust,'index.html',{'current_user': v})                    def post(self,reqeust):                        v = reqeust.COOKIES.get('username111')                        return render(reqeust,'index.html',{'current_user': v})    Templates        - 母版...html            extends            include        - 自定义函数            simple_tag                a. app下建立templatetags目录                b. 任意xxoo.py文件                c. 建立template对象 register                d.                     @register.simple_tag                    def func(a1,a2,a3....)                        return "asdfasd"                e. settings中注册APP                f. 顶部 {% load xxoo %}                g. {% 函数名 arg1 arg2 %}                缺点:                    不能做为if条件                优势:                    参数任意            filter                a. app下建立templatetags目录                b. 任意xxoo.py文件                c. 建立template对象 register                d.                     @register.filter                    def func(a1,a2)                        return "asdfasd"                e. settings中注册APP                f. 顶部 {% load xxoo %}                g. {{ 参数1|函数名:"参数二,参数三" }} {{ 参数1|函数名:数字 }}                缺点:                    最多两个参数,不能加空格                优势:                    能做为if条件                分页(自定义的分页)                XSS:            {{ page_str|safe }}                        mark_safe(page_str)        cookie        客户端浏览器上的一个文件            {"user": 'dachengzi'}        session :装饰器                Models        - 一大波操做            Form验证        -    缓存    中间件    信号    CSRF    Admin/ModelForm

相关文章
相关标签/搜索