Python3.5 學習二十一

 

 

 

 

本節內容概要:html

 

上節回顧及補充知識點:前端

1、請求週期:web

  URL-》路由-》函數或類-》返回字符串或者模板ajax

  Form表單提交:數據庫

  提交-》url-函數或者類中的方法django

          -....(執行)後端

          HttpResponse('......')瀏覽器

          render(request,'index.html')服務器

          redirect('/index/')cookie

  返回給用戶>>>>>用戶 永遠都是渲染處理完成的字符串

  當接收到一個redirect時,自動發起另一個請求

  Ajax:

  $.ajax({

    url:'/index/',

    data:{'k':'v'},$(form對象).serilize()

    type:'POST',

    dataType:'JSON':

    traditional:true,(寫了這個,才能將$(form對象).serilize()列表的值拿到)

    success:function(d){

    

    }

    error:{

    }

  })

  提交-》url-》函數或類中的方法

          -....(執行)

          HttpResponse('......')

          render(request,'index.html')

          不可使用redirect。。。。。。

  返回一個字符串能夠,只能ajax後面本身作跳轉

  

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. 默認值

    /index/  {'web':'root'}  爲函數傳遞一個值的默認值

    def func(request,web):

      print(name)

      return HttpResponse('OK')

  g.命名空間  namespace 用於include時定義名字的,和name起名字類似的意義

  

底下寫錯了,應爲:

 v=reverse('author-polls:detail',kwargs={'pk':11})

{% url 'publisher:detail' pk=12 pp=99 %}

 

3、視圖系統

  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  都不加括號

 

五、MODEL數據庫操做

  A、建立類 創建數據庫表

  class User(models.Model):

    username = models.CharField(max_length=32)

    email=models.EmailField()  

  (Django Admin:有驗證功能)

  User.objects.create(username='',email='dfadfasdfasdf')

  User.objects.filter(id=1).update(email='666')

  (無驗證功能)

   B、一對多操做

  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 in user_list:

    obj.username,obj.email,obj.user_type_id,obj.user_type.id,obj.user_type.name

  user=User.objects.get(id=1)  單個對象

  user.

  User.objects.all().values("username","user_type__name")  跨表取數據的雙下劃線方式

  

  C、多對多操做:

  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,6])  set跟列表時,不加*號,只保留當前這些列出來的關係

  obj.m.all()

  #多個組的對象,當前用戶全部的組

  obj.m.filter(name='CTO')

  

 

Views模塊補充知識點:

請求的其餘信息:

不只發送數據,還要發送請求頭

下面咱們來看一下請求頭中都有些什麼內容能夠被使用:

請求的東西都存放在request中,因此根據request對象找到建立他的類WSGIRequest進行查看:

print(type(request))

#封裝了全部用戶請求的信息

print(request.environ)  返回全部原生數據

若是是經常使用的,則能夠調用request.GET或者request.POST請求處理數據

若是不在其中,只能本身經過environ處理原生數據了

for k,v in request.environ.items():

  print(k,v)

能夠看到全部請求相關的信息,以字典方式存放

print (request.environ['HTTP_USER_AGENT'])

 

 模板Template知識點補充:

模板的繼承:

母版:master.html

 

繼承的子網頁:extends

 

 母版能夠在CSS樣式和JS引入的後面分別跟一個block塊,爲了子頁面能夠自定義樣式和JS腳本的地方。

 

子頁面中寫block內容的順序與顯示無關,能夠隨意寫了

 一個子頁面只能繼承一個母版

 

模板的引入:include

 

 

一個頁面只能繼承一個母版,但能夠include多個html

include的文件也是支持渲染的,Django會先拼湊整合起帶各類模板語言標籤的文件,最終渲染成一個html

OpenStack後臺管理中就有大量的include調用

 

模板語言內置函數了解

自定義Simple tag:步驟

一、在應用中建立一個叫templatetag的目錄,不能叫其餘名字

二、在目錄中建立任意取名的py文件

三、在py文件中寫函數,函數名定義前面要加裝飾器,先要建立一個template對象,命名必須叫register

register = template.Libary()

四、經過它去生成一個裝飾器

@register.simple_tag

def func(a1,a2...)

這兩部的步驟代碼如圖所示:

 

五、使用自定義函數前須要註冊當前APP

六、想在哪一個html頁面使用這個自定義函數時,須要在html的頂部load一下 {% load xxoo%}

g、調用時只能用{%  %}

h、傳參使用空格,多個空格也不要緊。

 

 

調用自帶函數

 

調用自定義函數:

 

 自定義時有兩種方式:

@register.simple_tag   優勢:能夠多個參數,能夠帶空格  缺點:不能做爲if條件

@register.filter      缺點:只能最多兩個參數,不能有空格  優勢:能夠應用於{% if  %}的條件

調用方式同自帶函數:{{」參數1」|函數名:」參數2」}}

若是要傳多個參數,只能拼湊多個參數成一個字符串傳給這兩個參數中:

{{「參數1」|函數名:「參數2,參數3」}}

{{」參數1」|」函數名:數字}}

 

 

*********PS:若是既有用到extends又用到load,在頁面頂部先寫extends語句,再寫load **********

 

自定義分頁:

 

前置說明 django自帶保護,以免XSS攻擊:

若是要將html部分標記語言放到後端生成後返回給前端,不能在前端直接顯示成html內容,只會以字符串形式顯示出來

若是要想轉換成html內容讓瀏覽器解析標記語言並顯示結果,須要說明一下:

兩種方式:1 前端 寫一個filter過濾

前端:{{  content|safe }}

or     2 後端將字符串包裝

from django.utils.safestring import mark_safe

page_str = "...."

page_str = mark_safe(page_str)

 

 

分頁邏輯:

 

上一個、下一個、跳轉:

 最後能夠把分頁代碼整合成一個class類,使用的時候初始化並調用類中的方法便可

若是調用對象的方法,不想加括號的辦法,在方法的命名上方增長:@property

在後臺分頁回傳字符串的類方法中增長url參數後,能夠真正將這部分分頁代碼作成一個模塊,用於各個地方了。

將類提取出來單獨存放,之後能夠方便的引入調用。

代碼已有,能夠針對該類進行使用練習。

 

Cookie:

存儲在了客戶端瀏覽器本地文件中的一個與用戶有關的鍵值對,

經過審查元素->network,發一次請求,找到cookies,就能看到請求的cookies內容

 

 

 

 

 

註銷時,能夠從新設置Cookie的超時時間,讓退出後失效。

設置Cookie:response.set_cookie("")

讀取Cookie:request.cookies.get("")

基於Cookie的數據顯示條目:

Cookie在服務器端、客戶端均可以讀寫

可使用jQuery的插件Jquery.cookie簡單調用,代碼以下:

 

Cookie 加密:

加密加鹽相似hashlib加密方式:

 

 用裝飾器實現用戶認證:

多頁面中不須要單獨每一個頁面再認證了

FBV裝飾器寫法:

 

CBV裝飾器寫法:

 

 或

 

 

類中裝飾器能夠在函數方法名前寫,更能夠直接在類名前寫

 

做業題:

  主機管理:

  一、單表操做

  二、一對多

  三、多對多

  要求:

    a.刪除對話框

    b.修改、添加時,使用新URL的方式

    c.基於cookie進行用戶認證(本身寫裝飾器)

    d.定製顯示數據條數

    e.分頁

  預習:

    Form組件:http://www.cnblogs.com/wupeiqi/articles/6144178.html

    Models操做:http://www.cnblogs.com/wupeiqi/articles/6216618.html

相關文章
相關標籤/搜索