冰凍三尺非一日之寒--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

相關文章
相關標籤/搜索