第二十一章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語言 分頁實例
總結,分頁時須要作三件事:
上節內容回顧: 一、請求週期 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