zoukankan      html  css  js  c++  java
  • web框架Django(翻页、cookie)

    第二十一章

    cookie

    1、获取Cookie:

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

    2、设置Cookie:

    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内置分页   Paginator

    二、自定义分页

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

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

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

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

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

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

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

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

    3、设定显示多少页号

    4、获取当前数据总条数

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

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

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

    8、输出分页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][下一页]

    上节内容回顾:
        1、请求周期
            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...
                用户    <<<<<  字符串
            
        
        2、路由系统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')
        
        3、
            def func(request):
                request.POST
                request.GET
                request.FILES
                request.getlist
                request.method
                request.path_info
                
                return render,HttpResponse,redirect
                
        4、
            render(request, 'index.html')
            # for
            # if
            # 索引.   keys  values items    all
            
        5、
            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

    A wise man thinks all that he says, a fool says all that he thinks.
  • 相关阅读:
    eWebEditor漏洞
    远程连接SQL Server
    eWebEditor漏洞
    【Demo 0009】绘图对象调色板
    【Demo 0001】 获取命令行参数
    【Demo 0007】绘图对象 画笔
    【Demo 0005】Win32 程序结构封装
    【Demo 0006】图形绘制基础
    【Demo 0008】绘图对象–画刷
    【Demo 0004】Windows 消息机制(2)
  • 原文地址:https://www.cnblogs.com/BernieChen/p/6253095.html
Copyright © 2011-2022 走看看