python第一百零八天---Django 3

来源:http://www.cnblogs.com/uge3/archive/2017/08/21/7406867.html
-Advertisement-
Play Games

1 1、請求周期 2 url> 路由 > 函數或類 > 返回字元串或者模板語言? 3 4 Form表單提交: 5 提交 -> url > 函數或類中的方法 6 - .... 7 HttpResponse('....') 8 render(request,'index.html') 9 redirec ...



上節內容回顧:
  1 1、請求周期
  2       url> 路由 > 函數或類 > 返回字元串或者模板語言?
  3 
  4       Form表單提交:
  5          提交 -> url > 函數或類中的方法
  6                         - ....
  7                         HttpResponse('....')
  8                         render(request,'index.html')
  9                         redirect('/index/')
 10            用戶  <    <  返回字元串
 11           (當接受到redirect時)自動發起另外一個請求
 12           --> url   .....
 13 
 14       Ajax:
 15          $.ajax({
 16             url: '/index/',
 17             data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form對象).serilize()
 18             type: 'POST',
 19             dataType: 'JSON':
 20             traditional: true,
 21             success:function(d){
 22                location.reload()              # 刷新
 23                location.href = "某個地址"     # 跳轉
 24             }
 25          })
 26          提交 -> url -> 函數或類中的方法
 27                      HttpResponse('{}')
 28                      render(request, 'index.html', {'name': 'v1'})
 29                      <h1>{{ name }}</h1> -->
 30                      <h1>v1</h1>
 31 
 32                      XXXXXXX redirect...
 33          用戶 <<<<<  字元串
 34 
 35 
 36    2、路由系統URL
 37       a. /index/                               ->  函數或類
 38       b. /index/(\d+)                        ->  函數或類
 39       c. /index/(?P<nid>\d+)               ->  函數或類
 40       d. /index/(?P<nid>\d+) name='root'         ->  函數或類
 41          reverse()
 42          {% url 'root' 1%}
 43       e. /crm/    include('app01.urls')        -> 路由分發
 44 
 45       f. 預設值
 46          url(r'^index/', views.index, {'name': 'root'}),#在url設置預設值
 47 
 48          def index(request,name):#相關函數需要設置接收的形參
 49             print(name)
 50             return HttpResponse('OK')
 51 
 52       g. 命名空間
 53 
 54          /admin/    include('app01.urls',namespace='m1')
 55          /crm/      include('app01.urls',namespace='m1')
 56 
 57          app01.urls
 58          /index/    name = 'n1'
 59 
 60 
 61          reverser('m1:n1')
 62 
 63    3、後臺取數據
 64       def func(request):
 65          request.POST
 66          request.GET
 67          request.FILES
 68          request.getlist
 69          request.method
 70          request.path_info
 71 
 72          return render,HttpResponse,redirect
 73 
 74    4、模板語言
 75       render(request, 'index.html')
 76       # for
 77       # if
 78       # 索引.   keys  values items    all
 79 
 80    5、 資料庫 models操作
 81        #創建一個表結構
 82       class User(models.Model):
 83          username = models.CharField(max_length=32)
 84          email = models.EmailField()
 85 
 86       有驗證功能
 87          Django Admin
 88       無驗證功能:
 89          User.objects.create(username='root',email='asdfasdfasdfasdf')
 90          User.objects.filter(id=1).update(email='666')
 91 
 92 
 93         #創建一個表結構  用戶屬性表
 94       class UserType(models.Model):
 95          name = models.CharField(max_length=32)
 96 
 97         #創建一個表結構  用戶信息表
 98       class User(models.Model):
 99          username = models.CharField(max_length=32)
100          email = models.EmailField()
101          user_type = models.ForeignKey("UserType")#外鍵 關聯 UserType 表
102 
103       user_list = User.objects.all()#獲取User表,所有記錄
104       for obj user_list:
105          obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id
106 
107       user = User.objects.get(id=1)#獲取ID為1 的記錄 為對象
108       user.
109 
110       User.objects.all().values("username","user_type__name",)#獲取所有記錄 的username 和 跨表的name
111 
112 
113 
114       class UserType(models.Model):
115          name = models.CharField(max_length=32)
116 
117         #創建一個表結構  用戶信息表
118       class User(models.Model):
119          username = models.CharField(max_length=32)
120          email = models.EmailField()
121          user_type = models.ForeignKey("UserType")#外鍵 關聯
122          m = models.ManyToMany('UserGroup')#與 UserGroup 的 第三張關聯表 多對多
123 
124         #創建一個表結構  用戶組表 多對多
125       class UserGroup(models.Model):
126          name = ....
127 
128 
129 
130       obj = User.objects.get(id=1)#獲取記錄對象
131       obj.m.add(2)#對第三張表進行添加關聯
132       obj.m.add(2,3)
133       obj.m.add(*[1,2,3])
134 
135       obj.m.remove(...)#對第三張表進行刪除關聯
136 
137       obj.m.clear()#清除當前記錄的所有關聯關係
138 
139       obj.m.set([1,2,3,4,5])#設置關聯  (重新所有的設置)
140 
141       # 多個組,UserGroup對象
142       obj.m.all()#
143       obj.m.filter(name='CTO')#篩選出其中的一個組對象
View Code

 




知識點:
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')#獲取 cookies中的值
                  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
                #裝飾dispatch 後, 等於對類中的每一個函數進行了裝飾
            @method_decorator(auth,name='dispatch')#類中的 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 'master.html' %}#  繼承母版(子級只能繼承一個母版)  master.html 為母版文件
                {% block title %}xxxxx{% endblock %}#  在母版 設置   子級中對應 可添加子級的專屬內容
            include
                {% include 'tag.html' %}#組件  tag.html為組件  (子級可以加入多個組件)

- 自定義函數
simple_tag
a. app下創建templatetags目錄
b. 任意xxoo.py文件
c. 創建template對象 register
- from django.utils.safestring import matk_safe
register=template.Library()
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)
    示例:
    views.py
 1 from  utils import pagination
 2 LIST = []
 3 for i in range(500):
 4     LIST.append(i)
 5 
 6 def user_list(request):
 7     current_page = request.GET.get('p', 1)#頁面預設第一頁
 8     current_page = int(current_page)#轉數字
 9 
10     val = request.COOKIES.get('per_page_count',10) #預設每頁 10
11     print(val)
12     val = int(val)
13     page_obj = pagination.Page(current_page,len(LIST),val)#創建類對象 傳入  當前頁面數值  列表長度   每頁顯示記錄數
14     #記錄數據    開始記錄數   結束記錄數
15     data = LIST[page_obj.start:page_obj.end]#  數據記錄進行切片取出
16 
17     page_str = page_obj.page_str("/user_list/")#開始計算顯示的頁面
18 
19     return render(request, 'user_list.html', {'li': data,'page_str': page_str})
View Code

  pagination.py

 1 __author__ = 'Administrator'
 2 from django.utils.safestring import mark_safe
 3 
 4 
 5 class Page:
 6     #             當前所在頁面   記錄條數統計  頁面顯示記錄數   顯示的頁面數量
 7     def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
 8         self.current_page = current_page#當前當前所在頁面
 9         self.data_count = data_count#記錄條數統計
10         self.per_page_count = per_page_count#頁面顯示記錄數
11         self.pager_num = pager_num#顯示的頁面數量
12 
13     #開始的記錄數
14     @property#裝飾後 不用加()
15     def start(self):
16         return (self.current_page - 1) * self.per_page_count
17 
18     #結束記錄數
19     @property
20     def end(self):
21         return self.current_page * self.per_page_count
22 
23     #計算當前所有數據 需要的總頁面數
24     @property
25     def total_count(self):
26       #商  餘   商計算   記錄條數統計  頁面顯示記錄數
27         v, y = divmod(self.data_count, self.per_page_count)
28         if y:#如果有餘數
29             v += 1#頁面數需加1
30         return v
31 
32     #顯示頁面的方法函數 base_url為要跳轉到的頁面 ID
33     def page_str(self, base_url):
34         page_list = []#想要顯示的頁面列表
35         #當 所有的頁面數 小於  想要顯示的頁面數
36         if self.total_count < self.pager_num:
37             #從第一頁開始
38             start_index = 1
39             #到最後一頁
40             end_index = self.total_count + 1
41 
42         else:
43             ##當前所在頁面數 小於等於  想要顯示的頁面數的 +1 的一半  ( 總頁面數  大於 想要顯示的頁面數   應對最前面的頁面顯示)
44             if self.current_page <= (self.pager_num + 1) / 2:
45                 start_index = 1#第一頁面
46                 end_index = self.pager_num + 1#想要顯示的頁面
47             else:
48                 #開始頁面為選中頁面的 前面幾頁(想要顯示頁面的+1的一半數, 選中頁面保持中間位置 )
49                 start_index = self.current_page - (self.pager_num - 1) / 2
50                 end_index = self.current_page + (self.pager_num + 1) / 2
51                 #如果 當前所在頁面數 + 顯示頁面的 - 1 的一半 大於總頁面數,(應對最後面的顯示)
52                 if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
53                     start_index = self.total_count - self.pager_num + 1
54                     end_index = self.total_count + 1
55 
56         #如果當前為1時
57         if self.current_page == 1:
58             #上一頁不再跳轉
59             prev = '<a class="page" href="javascript:void(0);">上一頁</a>'
60         else:
61             prev = '<a class="page" href="%s?p=%s">上一頁</a>' % (base_url, self.current_page - 1,)
62         page_list.append(prev)
63         #迴圈  開始顯示頁面  結束顯示頁面
64         for i in range(int(start_index), int(end_index)):
65             #如果所選中的頁面,加CSS樣式
66             if i == self.current_page:
67                 temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
68             else:
69                 temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
70             page_list.append(temp)
71         #如果當前所在頁面 等於 最後的頁面
72         if self.current_page == self.total_count:
73              #下一頁不再跳轉
74             nex = '<a class="page" href="javascript:void(0);">下一頁</a>'
75         else:
76             nex = '<a class="page" href="%s?p=%s">下一頁</a>' % (base_url, self.current_page + 1,)
77         page_list.append(nex)
78         #跳轉頁面 input框
79         jump = """
80         <input type='text'  /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
81         <script>
82             function jumpTo(ths,base){
83                 var val = ths.previousSibling.value;
84                 location.href = base + val;
85             }
86         </script>
87         """ % (base_url,)
88 
89         page_list.append(jump)#加入列表
90 
91         page_str = mark_safe("".join(page_list))#拼接列表為長字元串
92 
93         return page_str
View Code

 user_list.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6     <style>
 7         .pagination .page{
 8             display: inline-block;
 9             padding: 5px;
10             background-color: cyan;
11             margin: 5px;
12         }
13         .pagination .page.active{
14             background-color: brown;
15             color: white;
16         }
17     </style>
18 </head>
19 <body>
20     <ul>
21         {% for item in li %}
22             {% include 'li.html' %}
23         {% endfor %}
24     </ul>
25 
26     <div>
27         <select id="ps" onchange="changePageSize(this)">
28             <option value="10">10</option>
29             <option value="30">30</option>
30             <option value="50">50</option>
31             <option value="100">100</option>
32         </select>
33     </div>
34 
35     <div class="pagination">
36         {{ page_str }}
37     </div>
38     <script src="/static/jquery-1.12.4.js"></script>
39     <script src="/static/jquery.cookie.js"></script>
40     <script>
41 
42         $(function(){
43 {#                var v = $.cookie('per_page_count', {'path': "/user_list/"});#}
44                 var v = $.cookie('per_page_count');
45                 $('#ps').val(v);
46         });
47 
48         function changePageSize(ths){
49             var v = $(ths).val();
50             console.log(v);
51             $.cookie('per_page_count',v, {'path': "/user_list/"});
52 
53             location.reload();
54         }
55     </script>
56 </body>
57 </html>
View Code

cookie
客戶端瀏覽器上的一個文件
 1 {"user": 'dachengzi'}
 2 
 3         request.COOKIES.get('username111')#獲取 COOKIES的內容
 4 
 5         response = render(request,'index.html')
 6         response = redirect('/index/')
 7         # 設置cookie,關閉瀏覽器失效
 8         response.set_cookie('key',"value")
 9 
10         # 設置cookie, N秒只有失效
11         response.set_cookie('username111',"value",max_age=10)
12 
13         # 設置cookie, 截止時間失效
14         import datetime
15         current_date = datetime.datetime.utcnow()#現在的時間
16         current_date = current_date + datetime.timedelta(seconds=5)#  加上5秒
17         response.set_cookie('username111',"value",expires=current_date)# 等 於5 稱後過期
18         response.set_cookie('username111',"value",max_age=10)
View Code

 




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.Hibernate概述Hibernate是一個實現了ORM思想的,開源的,輕量級的,內部封裝了JDBC操作的持久層框架. 實現了ORM思想的:不再重點關註sql語句的編寫 開源的:開放源代碼的 輕量級的:消耗的資源少(記憶體),依賴的jar包比較少註:ORM思想(O:object R:relati... ...
  • 一、SpringMVC概述 1.1 SpringMVC簡介 SpringMVC也叫Spring Web MVC,屬於表現層框架。SpringMVC是Spring框架的一部分,是在Spring3.0後發佈的。 1.2 第一個SpringMVC程式 需求:用戶提交一個請求,服務端處理器在接受到這個請求後 ...
  • 本節繼續探討Java 8中的函數式數據處理 - Stream API,主要討論各種強大方便的收集器,它們都有什麼用?如何使用?基本實現原理是什麼呢? ...
  • 1、查找字元位置函數: 2、提取子字元函數(雙位元組) 3、替換字元串 4、查詢字元串長度 5、比較字元函數 6、分割成數組函數 7、去除空格: 8、加空格函數 9、返回指定的字元或ascii 10、HTML代碼有關函數 11、字元大小寫轉換函數 12、資料庫相關函數 13、連接函數 ...
  • PHP內置的mail函數使用起來不夠方便,另外受其他語言的影響,博主更偏好面向對象的包管理模式,因此phpmailer成為了我用PHP發送郵件的首選,這裡分享給大家。 ...
  • 網上關於pexpect的介紹基本都類似於這樣http://blog.csdn.net/sdustliyang/article/details/23373485,但是並沒有關於下述問題的解釋 問題:可以ssh到主機,但是後面執行的命令無法生效 代碼如下: 可以看到ssh是成功連接的,但是ls /hom ...
  • Struts2.5 struts是開源框架。使用Struts的目的是為了幫助我們減少在運用MVC設計模型來開發Web應用的時間。如果我們想混合使用Servlets和JSP的優點來建立可擴展的應用,struts是一個不錯的選擇。 Struts 是Apache軟體基金會(ASF)贊助的一個開源項目。它最 ...
  • 上面的代碼實現的只是簡單而繁瑣的一種,後面的代碼會一直重覆,因此並沒有寫下去,後面的是我看視頻附帶的代碼,我也附上,較我寫的完整一些 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...