Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲国产成人九九综合,日韩一区二区三区免费,99久久久国产精品免费播放器

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          分頁器 + 繪制驗證碼 + 驗證碼驗證 + 富文本

          分頁器 + 繪制驗證碼 + 驗證碼驗證 + 富文本 + 網頁緩存機制

          頁器

          • 優化加載
          • Paginator
          • 將數據源分割成一頁一頁的數據
          • Page
          • 具體的某一頁數據

          分頁加載實現

          • 從請求中接收page_number參數
          • 查詢顯示
          • 使用bootstrap
          • 粘貼樣式
          • class
          • 頁碼問題
          • 迭代頁面范圍
          • 上一頁下一頁
          • 注意是否存在上一頁,下一頁

          views.py:

          def get_students(request):

          students=Student.objects.all()

          # 指定頁數

          page_num=int(request.GET.get("page", 1))

          # 將學生進行分頁

          paginator=Paginator(students, 10)

          # 獲取指定頁面的學生

          page=paginator.page(page_num)

          data={

          "students": page.object_list,

          "page_object": page,

          "page_range": paginator.page_range,

          }

          return render(request, 'StudentList.html', context=data)

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15

          繪制驗證碼的步驟

          • 繪制驗證碼

          # 繪制驗證碼

          def get_verify_code(request):

          # 設置畫布大小

          image_size=(200, 100)

          # 設置畫布背景顏色

          image_color=get_color()

          # 生成畫布

          image=Image.new("RGB", image_size, image_color)

          # 導入字體 設置字體大小

          image_font=ImageFont.truetype('/home/intro/django/day07/DjangoAdvanced/static/fonts/ADOBEARABIC-BOLD.OTF',

          size=60)

          # 生成畫筆

          image_draw=ImageDraw.Draw(image, "RGB")

          # 字符串庫

          source_str="1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"

          dest_str=""

          # 取四次字符

          for i in range(4):

          r=random.randrange(len(source_str))

          dest_str +=source_str[r]

          # 將dest_str存到session中

          request.session['verifycode']=dest_str

          # 起點,需要畫的內容,實例化字體

          # image_draw.text((20, 30), "q", font=image_font)

          # image_draw.text((65, 30), "W", font=image_font)

          # image_draw.text((110, 30), "e", font=image_font)

          # image_draw.text((155, 30), "R", font=image_font)

          for i in range(4):

          image_draw.text((20 + 45 * i, 20), dest_str[i], fill=get_color(), font=image_font)

          # 干擾點

          for i in range(1000):

          image_draw.point((random.randrange(200), random.randrange(100)), fill=get_color())

          # 實例化一個IO流

          buffer=BytesIO()

          # 將圖片存儲到流中 格式是png

          image.save(buffer, "png")

          return HttpResponse(buffer.getvalue(), content_type="image/png")

          # 生成隨機顏色

          def get_color():

          r=random.randrange(256)

          g=random.randrange(256)

          b=random.randrange(256)

          return (r, g, b)

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 登錄時 驗證驗證碼

          # 返回登錄界面

          def user_login(request):

          return render(request, 'UserLogin.html')

          # 執行登錄

          def do_user_login(request):

          #獲取用戶輸入的驗證碼

          verify_code=request.POST.get("verifycode")

          #系統生成的驗證碼

          dest_code=request.session.get('verifycode')

          #判斷輸入的驗證碼是否正確,并且忽略大小寫

          if verify_code.lower()==dest_code.lower():

          return HttpResponse('驗證成功')

          return HttpResponse("驗證失敗")

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17

          富文本(略)

          緩存機制

          • 瀏覽器有這樣一個緩存機制
          • 當頁面發生差量更新的時候,局部更新的時候,是根據url判定是夠發生了更新的

          創建本地緩存的表

          python manage.py createcachetable cachetable

          • 1

          # 使用裝飾器 緩存時間為20s

          @cache_page(20)

          def get_sleeping(request):

          sleep(5)

          print("學習,斷片了")

          return HttpResponse("我不是故意的")

          # 不使用裝飾器 自己寫緩存

          def get_last(request):

          # 從緩存中獲取緩存

          result=cache.get("get_last")

          # 如果存在直接返回

          if result:

          return HttpResponse(result)

          # 睡6s

          sleep(6)

          print("你完了")

          students=Student.objects.all()

          data={

          "students": students,

          }

          #渲染模板 返回數據

          result=loader.get_template('StudentList.html').render(context=data)

          #保存緩存 cache.set(緩存名, 緩存數據, 緩存時長)

          cache.set(request.META.get("REMOTE_ADDR") + 'get_last', result, timeout=20)

          return HttpResponse(result)

          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30

          homework

          • 使用markdown插件

          過本案例的學習,對于入門級的讀者來說是個不錯的學習體驗,對于有基礎的讀者可以開拓思路。案例效果如下:

          案例制作的思路是先將主頁面制作好,然后以另存為的方法制作其他3個分頁。其中,通過對類(.white)的靜態傳遞,實現導航超鏈接背景色的改變。

          首頁index.html的代碼如下:

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="UTF-8">

          <title></title>

          <link rel="stylesheet" type="text/css" href="css/b5.css"/>

          </head>

          <body>

          <div class="nav">

          <ul>

          <li class="white"><a href="tab1.html">首頁</a></li>

          <li><a href="news.html">新聞</a></li>

          <li><a href="sport.html">體育</a></li>

          <li><a href="music.html">音樂</a></li>

          </ul>

          </div>

          <div class="nav-cont">

          <img src="images/pic1.jpg"/>

          </div>

          </body>

          </html>

          分頁news.html的代碼如下,其他分頁類似。

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="UTF-8">

          <title></title>

          <link rel="stylesheet" type="text/css" href="css/b5.css"/>

          </head>

          <body>

          <div class="nav">

          <ul>

          <li><a href="tab1.html">首頁</a></li>

          <li class="white"><a href="news.html">新聞</a></li>

          <li><a href="sport.html">體育</a></li>

          <li><a href="music.html">音樂</a></li>

          </ul>

          </div>

          <div class="nav-cont">

          <img src="images/pic2.jpg"/>

          </div>

          </body>

          </html>

          外部樣式文件b5.css的代碼如下:

          @charset "utf-8";

          *{

          margin:0px;

          padding:0px;

          }

          body{

          font-size:14px;

          }

          ul{

          list-style-type:none;

          }

          .nav{

          width:800px;

          height:30px;

          margin: 30pxauto 0px auto;

          border-bottom:solid 1px #09f;

          }

          .nav ul li{

          float:left;

          width:70px;

          margin: 0px 5px 0px 0px;

          }

          .nav ul li a{

          display: block;

          height:30px;

          color:#333;

          text-decoration: none;

          border-top:solid 1px #09f;

          border-left:solid 1px #09f;

          border-right:solid 1px #09f;

          text-align: center;

          line-height:30px;

          background:#8cd4fd;

          }

          .nav .white a{

          background:#fff;

          }

          .nav-cont{

          width:768px;

          height:200px;

          margin: 0px auto;

          border-bottom:solid 1px #09f;

          border-left:solid 1px #09f;

          border-right:solid 1px #09f;

          padding:10px 15px;

          }

          至此,案例制作完成。

          昨天介紹了Oracle分頁實現方案,那么,mysql又是如何實現分頁呢?

          參考官網:https://dev.mysql.com/doc/refman/5.7/en/select.html


          mysql分頁實現

          MySQL中實現分頁查詢:在數據量較小的情況下可使用limit查詢來實現分頁查詢,在數據量大的情況下使用建立主鍵或唯一索引來實現,另外可通過order by對其排序。

          The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

          • Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.
          • Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

          1、limit分頁實現

          先看一下limit語法

          SELECT * FROM TABLE
              [ORDER BY {col_name | expr | position}
                [ASC | DESC], ... [WITH ROLLUP]]
              [LIMIT {[offset,] row_count | row_count OFFSET offset}]

          LIMIT子句可以被用于強制 SELECT 語句返回指定的記錄數。LIMIT接受一個或兩個數字參數。參數必須是一個整數常量。
          如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)。

          1.1、傳統實現方式

          一般情況下,客戶端通過傳遞 pageNo(頁碼)、pageSize(每頁條數)兩個參數去分頁查詢數據庫中的數據,在數據量較小(元組百/千級)時使用 MySQL自帶的 limit 來解決這個問題

          --pageNo:頁碼
          --pagesize:每頁顯示的條數
          select * from table limit (pageNo-1)*pageSize,pageSize;

          1.2、建立主鍵或者唯一索引(高效)

          在數據量較小的時候簡單的使用 limit 進行數據分頁在性能上面不會有明顯的緩慢,但是數據量達到了 萬級到百萬級 sql語句的性能將會影響數據的返回。這時需要利用主鍵或者唯一索引進行數據分頁;

          --pageNo:頁碼
          --pagesize:每頁顯示的條數
          --假設主鍵或者唯一索引為 t_id
          select * from table where t_id > (pageNo-1)*pageSize limit pageSize; 

          1.3、基于數據再排序

          當需要返回的信息為順序或者倒序時,對上面的語句基于數據再排序。order by ASC/DESC 順序或倒序 默認為順序

           select * from table where t_id > (pageNo-1)*pageSize order by t_id limit pageSize; 



          2、查詢顯示行號(實現類似Oracle數據庫的ROWNUM())

          Oracle中有專門的rownum()顯示行號的函數,而MySQL沒有專門的顯示行號函數,但可以通過用@rownum自定義變量顯示行號。

          一般實現過程如下:

          SELECT 
            (@rownum :=@rownum + 1) AS rownum,
            t.* 
          FROM
            table t,
            (SELECT @rownum :=0) AS rn



          3、實例演示

          3.1、環境準備

          CREATE TABLE t (
          	EMPNO BIGINT ( 4 ) NOT NULL,
          	ENAME VARCHAR ( 10 ),
          	JOB VARCHAR ( 9 ),
          	MGR BIGINT ( 4 ),
          	HIREDATE date,
          	SAL BIGINT ( 10 ),
          	COMM BIGINT ( 10 ),
          	DEPTNO BIGINT ( 2 ),
          	PRIMARY KEY ( `EMPNO` ) 
          ) ENGINE=INNODB;
          INSERT INTO t VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', NULL, '20');
          INSERT INTO t VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30');
          INSERT INTO t VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30');
          INSERT INTO t VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', NULL, '20');
          INSERT INTO t VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30');
          INSERT INTO t VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', NULL, '30');
          INSERT INTO t VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', NULL, '10');
          INSERT INTO t VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000', NULL, '20');
          INSERT INTO t VALUES ('7839', 'KING', 'PRESIDENT', NULL, '1981-11-17', '5000', NULL, '10');
          INSERT INTO t VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500', '0', '30');
          INSERT INTO t VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100', NULL, '20');
          INSERT INTO t VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', NULL, '30');
          INSERT INTO t VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', NULL, '20');
          INSERT INTO t VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', NULL, '10');
          commit;

          3.2、limit分頁

          --查詢第一頁,每頁顯示5條數據
          select * from t order by empno desc limit (1-1)*5,5;
          
          --查詢第二頁,每頁顯示4條數據
          select * from t order by empno desc limit (2-1)*4,4; 

          3.3、查詢顯示行號

          --查詢第二頁,每頁顯示4條數據,并在第一列加上行號
          select (@rownum :=@rownum + 1) AS rownum,t.* from t,
            (SELECT @rownum :=0) AS rn 
          order by t.empno desc 
          limit 4,4; 



          覺得有用的朋友多幫忙轉發哦!后面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~


          主站蜘蛛池模板: 午夜在线视频一区二区三区 | 91视频一区二区| 国产成人一区二区三区高清 | 日本免费精品一区二区三区| 免费一区二区无码东京热| 亚洲第一区二区快射影院| 中文字幕精品亚洲无线码一区| 在线观看一区二区精品视频| 一区二区三区免费电影| 国产无码一区二区在线| 亚洲AV无码一区二区大桥未久| 国产精品视频第一区二区三区| 内射少妇一区27P| 激情无码亚洲一区二区三区| 亚洲一区二区三区四区视频| 亚洲国产综合无码一区| 国产在线不卡一区二区三区| 免费国产在线精品一区| 国产日韩精品一区二区在线观看 | 亚洲成AV人片一区二区| 男人的天堂精品国产一区| 无码少妇一区二区三区芒果| 亚洲av无一区二区三区| 国产Av一区二区精品久久| 伊人久久精品一区二区三区| 欧美日本精品一区二区三区| 精品一区二区三区四区在线播放| 久久福利一区二区| 亚洲天堂一区二区三区| 无码人妻啪啪一区二区| 视频在线观看一区二区| 国产日韩AV免费无码一区二区| 亚洲AV色香蕉一区二区| 性盈盈影院免费视频观看在线一区| 日本一区二三区好的精华液| 女人和拘做受全程看视频日本综合a一区二区视频 | 人妻少妇久久中文字幕一区二区 | 卡通动漫中文字幕第一区| 日韩一本之道一区中文字幕| 中文字幕一区二区日产乱码| 久久er99热精品一区二区|