03212
<html lang="zh-cn" class="cye-disabled cye-nm"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="referrer" content="origin"> <title>Cookie Session和自定义分页 - 元少~ - 博客园</title> <meta property="og:description" content="cookie Cookie的由来 大家都知道HTTP协议是无状态的。 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不"> <link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=svlZeZMvc3He7PqOD4T7SOuQn0_kIfLBYiy3idqd35Y1"> <link type="text/css" rel="stylesheet" href="/blog/customcss/419604.css?v=NWIv029b14B3lY0hA9f2yv0t5mo%3d"> <link id="mobile-style" media="only screen and (max-width: 767px)" type="text/css" rel="stylesheet" href="/skins/BuildtoWin/bundle-BuildtoWin-mobile.css?v=Go8Bj0ZU9gZXuPSKWcSQabps3E1njgJKYz4DiOq6-N41"> <link title="RSS" type="application/rss+xml" rel="alternate" href="https://www.cnblogs.com/Dominic-Ji/rss"> <link title="RSD" type="application/rsd+xml" rel="EditURI" href="https://www.cnblogs.com/Dominic-Ji/rsd.xml"> <link type="application/wlwmanifest+xml" rel="wlwmanifest" href="https://www.cnblogs.com/Dominic-Ji/wlwmanifest.xml"> <script src="https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1472209282032525&correlator=1792633286127937&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&json_a=1&eid=21063203&vrg=2019041601&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=1090369%2CC1%2CC2&enc_prev_ius=%2F0%2F1%2C%2F0%2F2&prev_iu_szs=300x250%2C468x60&eri=32&cookie_enabled=1&bc=15&abxe=1&lmt=1555923648&dt=1555923649163&dlt=1555923647383&idt=1758&frm=20&biw=1869&bih=946&oid=3&adxs=0%2C0&adys=0%2C0&adks=912054536%2C450443218&ucis=1%7C2&ifi=1&u_tz=480&u_his=1&u_h=1080&u_w=1920&u_ah=1040&u_aw=1920&u_cd=24&u_nplug=4&u_nmime=6&u_sd=1&flash=27.9.9&url=https%3A%2F%2Fwww.cnblogs.com%2FDominic-Ji%2Fp%2F10718365.html&dssz=30&icsg=3801216&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0%7C0x0&msz=0x-1%7C0x-1&blev=0.81&bisch=1&ga_vid=1185455905.1548659889&ga_sid=1555923649&ga_hid=159493970&fws=128%2C128"></script><script src="https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041601.js"></script><script async="" src="https://www.google-analytics.com/analytics.js"></script><script type="text/javascript" src="https://common.cnblogs.com/script/encoder.js"></script><script src="//common.cnblogs.com/scripts/jquery-2.2.0.min.js"></script><style id="nightModeStyle"> html.cye-enabled.cye-nm:not(*:-webkit-full-screen) body, html.cye-enabled.cye-nm:not(*:-webkit-full-screen) #cye-workaround-body {-webkit-filter:contrast(91%) brightness(84%) invert(1);}</style><style id="cyebody">html.cye-enabled.cye-lm body{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style><style id="cyediv">html.cye-enabled.cye-lm div{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style><style id="cyetable">html.cye-enabled.cye-lm th{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}html.cye-enabled.cye-lm td{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style><style id="cyetextInput">html.cye-enabled.cye-lm input[type=text]{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}html.cye-enabled.cye-lm textarea{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style><style id="cyeselect">html.cye-enabled.cye-lm select{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style><style id="cyeul">html.cye-enabled.cye-lm ul{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style><style id="cyeChangeByClick">html.cye-enabled.cye-lm .cye-lm-tag,html.cye-enabled.cye-lm.cye-lm-tag{background-color:#cce8cf !important;border-color:rgb(51, 58, 51) !important;background-image:none !important;color:#000000 !important}</style> <script>var currentBlogId=419604;var currentBlogApp='Dominic-Ji',cb_enable_mathjax=false;var isLogined=true;</script> <script src="/bundles/blog-common.js?v=OFBZTzkHKauV7mtIFLF9jlqrX-sesK9-mY9KjurLrq01" type="text/javascript"></script> <style type="text/css">.tctip{position:fixed;_position:absolute;right:0;z-index:10000;padding-left:34px;width:0;overflow:hidden;box-sizing:content-box}.tctip li,.tctip ul{margin:0;padding:0}.tctip img{border:0;display:block}.tctip a{color:#000;text-decoration:none;outline:0 none}.tctip .tctip-btn-box{position:absolute;left:0;top:50%;margin-top:-46px;width:34px;height:93px}.tctip .tctip-main-box{width:240px;height:332px;font:12px/1.5 microsoft yahei,tahoma,arial,sans-serif;color:#000;background-color:#fff;border:1px solid #dbdbdb;border-right:none}.tctip .tctip-main-box .tctip-footer,.tctip .tctip-main-box .tctip-title{margin:0;height:26px;line-height:26px;background-color:#e7e7e7}.tctip .tctip-main-box .tctip-title{padding:0 0 0 6px;font-size:14px;font-weight:400;background-image:none}.tctip .tctip-main-box .tctip-footer{padding-right:6px;font-size:12px;text-align:right}.tctip .tctip-main-box .tctip-footer a:hover{text-decoration:underline}.tctip .tctip-main-box .tctip-body-box{font-size:0;background-color:#eee;width:240px}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;width:90px;font-size:12px}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul{list-style:none}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul a.fifth{border-bottom:none}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul.not-full{border-top:1px solid #dfdfdf}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul li{display:block;height:56px;-webkit-transition:background-color .2s linear;transition:background-color .2s linear}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul li.tctip-current{border-right:none}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul li.tctip-current a,.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul li.tctip-current a:hover{background-color:#fff}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul li a{position:relative;display:block;padding-left:40px;height:55px;line-height:55px;font-size:12px;border-bottom:1px solid #ccc}.tctip .tctip-main-box .tctip-body-box .tctip-icon-box ul li a img{position:absolute;left:6px;top:13px;width:30px;height:30px}.tctip .tctip-main-box .tctip-body-box .tctip-qr-detail{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;width:150px;height:280px;font-size:12px;background-color:#fff}.tctip .tctip-main-box .tctip-body-box .tctip-qr-detail .tctip-qr-box{padding:14px 0 0 10px}.tctip .tctip-main-box .tctip-body-box .tctip-qr-detail .tctip-qr-box .tctip-qr-title{margin:0 0 20px;width:132px;height:30px;line-height:30px;font-size:12px;text-align:center}.tctip .tctip-main-box .tctip-body-box .tctip-qr-detail .tctip-qr-box .tctip-qr-code{margin:0 0 20px;padding:12px;width:106px;height:106px;background:url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QNvaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6QjgxOTIzMjRGMjhCRTQxMTk5QjZGNERBNDI5NUVBNjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjkxODAwMUY4Q0Y4MTFFNEE0NkVCQUVGNjA3MDhFMzUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NjkxODAwMUU4Q0Y4MTFFNEE0NkVCQUVGNjA3MDhFMzUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNzMwMTIzMEZBOEJFNDExOTlCNkY0REE0Mjk1RUE2MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCODE5MjMyNEYyOEJFNDExOTlCNkY0REE0Mjk1RUE2MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgMDAwMDAwMDAwMBAQEBAQEBAgEBAgICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIAIIAggMBEQACEQEDEQH/xAB+AAEAAwEBAQEAAAAAAAAAAAAABgcIBQMECgEBAAAAAAAAAAAAAAAAAAAAABAAAQIEAAoGBgcJAQAAAAAAAAIDAQQFBhHUlbUWNlZ2mNgxYRITMzUhUVODFDRBIjJSYmNlcYEjcyRUdRc4SBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A/eRLy6rpi7PTzr8KHB99im01h52Xan2pd1bC6lUlsqbdmW5l1tUWWYq7mDPZUpKlK+oH26HWl9Nr27HrVRaapUeuKlS0VRj+0BodaOy1uZEpmKgNDrR2WtzIlMxUBodaOy1uZEpmKgNDrR2WtzIlMxUBodaOy1uZEpmKgNDrR2WtzIlMxUBodaOy1uZEpmKgNDrR2WtzIlMxUBodaOy1uZEpmKgNDrR2WtzIlMxUBodaOy1uZEpmKgNDrR2WtzIlMxUBodaOy1uZEpmKgeL1uNSCVTVswRSJ1qEVok2Yqao0/wBmGH4Wdp6P6ZpL3RB5pCHm4xwwjGGFKg5n+wKZ/azflHx3QnzPZ7/K9X2OsDs2dqla8fXbtFVHrUqmyylRj1xVHCBIwAAAAAAAAAAAAAAAADOeCHq/9D9x7n2X8vq6ALps7VG1t3KJmyVAkYAAAAAAAAAAAAAAAABnPmMAumztUbW3combJUCRgAAAAAAAAAAAAAAAAGc+YwC6bO1RtbdyiZslQJGAAAAAAAAAAAAAAAAAZz5jALps7VG1t3KJmyVAkYAAAAAAAAAAAAAAAABnPmMAumztUbW3combJUCRgAAAABznaRSX5pE8/S6c9OtqQtucdkpZyaQtpSFtqRMLai8lTa20xTGEcMIphGHRADogAAAAAAAAAGc+YwC6bO1RtbdyiZslQJGAAAAAAAAAAAAAAAAAZz5jALps7VG1t3KJmyVAkYAAAAAAAAAAAAAAAABnPmMAumztUbW3combJUCRgAAAAAAAAAAAAAAAAGc+YwC6bO1RtbdyiZslQJGAAAAAAAAAAAAAAAAAZz5jALps7VG1t3KJmyVAkYAAAAAAAAAAAAAAAABnPmMAumztUbW3combJUCRgAAAAB4PTDcv3XbS+rvXm2EdzLTEzgW6qCUqd+Had7lmEY/WcX2W0Q9KlQh6QPcAAAAAAAAAAznzGAXTZ2qNrbuUTNkqBIwAAAAAAAAAAAAAAAADOfMYBdNnao2tu5RM2SoEjAAAAAAAAAAAAAAAAAM58xgFxW2+iQaTbM0qDU7SUKZk21xgn46jNLiinzsrhwd8luV7Db0E4YtvJjCPoimKglQAAAAAAAAAAAAAAADm1Sqy1Jlu/fipbriu6k5NrAqbn5tUP4UpKNYcLr7qv3JhhUqMEwjGAVjoNW/ayvj6Y+JHXn2PR5d+Z0/hAkt/eVy3lPzUPnvMvsR1f/Vfu/hwgVdDoh/0P7jwfdfl+rqAcRgDiMAcRgDiMAcRgDiMAcRgDiMAcRgDiMAcRgDiMAcRgEssbzl3xvlV64a8/R4P6b9/rwAXAB//2Q==) no-repeat;box-sizing:content-box}.tctip .tctip-main-box .tctip-body-box .tctip-qr-detail .tctip-qr-box .tctip-qr-code img{width:106px;height:106px}.tctip .tctip-main-box .tctip-body-box .tctip-qr-detail .tctip-qr-box .tctip-qr-desc{font-size:12px;word-break:break-all;text-align:center}</style><link rel="preload" href="https://adservice.google.com/adsid/integrator.js?domain=www.cnblogs.com" as="script"><script type="text/javascript" src="https://adservice.google.com/adsid/integrator.js?domain=www.cnblogs.com"></script><script src="https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041601.js" async=""></script><link rel="prefetch" href="https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html"></head><div id="cyeBlackMaskLayer" style="background-color: rgb(19, 19, 19); position: fixed; width: 1980px; height: 1080px; z-index: -2147483648;"></div> <body style=""> <a name="top"></a> <!--PageBeginHtml Block Begin--> <script src="https://static.tctip.com/tctip-1.0.0.min.js"></script> <script> new tctip({ top: '20%', button: { id: 9, type: 'dashang', }, list: [ { type: 'alipay', qrImg: 'https://files.cnblogs.com/files/Dominic-Ji/WechatIMG5.bmp' }, { type: 'wechat', qrImg: 'https://files.cnblogs.com/files/Dominic-Ji/WechatIMG4.bmp' } ] }).init() </script><div class="tctip" style="top: 20%; width: 0px;"><a class="tctip-btn-box" href="javascript:;"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAABdCAYAAADAM7TWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCODE5MjMyNEYyOEJFNDExOTlCNkY0REE0Mjk1RUE2MSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2RThFQzBCNjhDRjQxMUU0QjU4MThFMEJGNDM2OEE2NCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2RThFQzBCNThDRjQxMUU0QjU4MThFMEJGNDM2OEE2NCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MzAxMjMwRkE4QkU0MTE5OUI2RjREQTQyOTVFQTYxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkI4MTkyMzI0RjI4QkU0MTE5OUI2RjREQTQyOTVFQTYxIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+LrQk8wAABP5JREFUeNrsm89vE0cUx59/ZW2wA3Hs2KlDogSoUKMIqGhTlf6QeqiqVqByQdy491Rx4B/opYo49dA7lx64oUoVh6qHVKhAWyht06gyhAIxCXa8JHXAjo2dznfwWBP/2B+212uVfdJoHcfe+eyb73vz3kRxnZpfo3qbG30SZJcv2DjFRoINL1ls3iYQX7LLubVC2Zd6WqZMoUz58jZVtnsEwgAG2GV+s1SZva2WiIFQL032yHy2UJm9ltmi51Y/fhNzV71xAZ64bhMEB6kK8/Nb2SKVbIIQHpljgvSoWxWy0wByAtFhtwEk3usIaQXiRZ7oBxCq2M/xAqQfzAFxQBwQB8QB+d+CmG4Tjk+OkOL10G+pLKnPivaBHBjZQ5FggB7n8vaCNLOAz0NTwyFayuZ0PxsOKLR31wAtrK53HwQQH02Pm/oOoPOlcndBCuyGa5v5hvdD/gGup2a/kyEMgUzH91IsFKj9jBvDXmVaEe9vPS/TxevJhu+enT1ICtPTL/czDUthWiOY7Oh4tHE5ontqr/HEV++lrRUrwhQRIuzYRJRHzbWlVVrPF2tLY3nUIETlMAUIDBB67n45MqtsicFddHgsTBvMO5ZrpGWq3x/n4Qm79SBjvUfCLAtOhkMUGwzQ2FCwNjlscUWlvx9v0F0DGbVjkA8PjVFiKMhf5wpFnjOQS67eXe2qWHVBHj7Z5Nc/Hql8YpGkei5WLsIOhehUaC9HQkPxgyF235V/n+mGvRzqXQHZzwqfT49M1n5GCLcqEz84OEr7wkG+MQrTgzYMgoSFyfmWz3ZihHIrQ7o/WoVAefBnSjVU2xpemm9+Thq64a/LWSowaHjBTHFtGMTMTdvJuG1FDYTYTBsYPdl9ETWnX5/i0SAvFd4X5eRP/6R3FMZn2OflLaIrHsEED9VNHsInZiZ2vN+sUke0YcNUGKhez2N6aX5IrtBSZoOHJyp8LXuDlZWItu8XUw3tQ725ksnk9uX72nH+8WtjFA3t3HHhFRHSrXoYwOIzKB+EZVj4f/fXcnsaAQRuKk8iQ4hapd759csV0SgfTInVSKOkJfTP3pvuXs0KAb5zIG7qO3fSG3STJbqOwxc3QrQgW46yyh0uFmWjlkEz0A6+C7FeWXjQshkzBCK3CgARcIggLUOCk9tVrWVtu50YYQLWy6QjoYA1mVU+gkCSwnavZ/is3hK2BfKI6eTSzSV7W04c5L01FW9rInSDWpoyBSKOIVKs10nn8oa1JBq0rve+gJCfDrllgukF5yj1kQFBGwHpShUfH3xxqiTOTixvJ/zVCr7e9lWfGLlFHFckqvnGErHeU3NUYNlRrsqxM8P14hwNe8onM+M8o0JLKIi+nl/QLQNMgcjHWIig6VfCfEJRc9QyKJscvwMghgDqOLOK83e+DOFgrfaAoUi6srhce2Jc4RkMFE4zEhBe/3hnlVJN+hzDHpH3DGx4ALi9rDa9qby3YAAIJ0yRUIf1CJ4OHkB4rrOlSRno3OqBULNCP63aEsMe0dtpjRTeWoJ1jiUcEAfEAXFAHJBegGx73a6+ACn5Pf0Bkh5W3H0B8m1it6cvQM5H/Z5y2GavuM+vDOFvZV8dGR4gn42i5W5gMOdCPveNN6MK2RVB8nq8G/G7f38/rlDE77EPhHmlyMbhoM994XhMKb0dU2gi6KXdXhf1wkkujf+dmGPjJBsx6sH/TvwnwAD/lU0rvEJ+QAAAAABJRU5ErkJggg=="></a><div class="tctip-main-box"><h1 class="tctip-title">喜欢请打赏</h1><div class="tctip-body-box"><div class="tctip-icon-box"><ul class="not-full"><li class="tctip-current"><a class="" href="javascript:">支付宝<img src="data:image/png;base64,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" alt="支付宝"></a></li><li class=""><a class="" href="javascript:">微信<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVFSURBVEhLtVZrTJNXGH7BC0oLxhjMfsxE4xJ3z24xcf7YssmPZWZuxphtWba/259ll8zM6EJMxA0dZsoMm5q5LVkWF10krlIKRe6XcmuFCuMu0KICgoAUpPDsOd93OmopKM49zfP2nPN953m+876n56vMgteyRZqsDvEmTEhjAvh9f7ys6U3oleaEVKm1JmmHCFQlrpfmRJu08Oa/9eSGB0Bl3kY2W/qlPuEL7aZRH7deGq2t4ks0b4wm8F+pFtRD/UuWg9qVcFtzjcF6XpyTVtKiGe36PVCVrt3w2SrisbxqpFY91aVI0sQdC6kTk5449peE9ZdGmXMXdqhVW7OFnTzjSTwRrIsxTJ5p3oxd/r04deM3ZN204czQOWT0/4Cdne9jZcMaSK16gGUUo2CkRjSqveNJuCZSZx0XNzv/kimtETzV+ALODp7D5PQk5kL7eCc+69mNxXXMTN1izqX5HVpzMshUs1EXxmrBtradGJgc1PJ3R9aQDYnu1XxgVQaah+tFozKXWoYQq2KwqekVBKYCWhLoHb+qW3ciEAygb2JA94A/B89jUc1y6sTP6M1HqWFQrF6OJdWJqByp1lLAcf9PSCpKwpGeTD1iIjgdxHbvu1hd9jDqR716FPig40OIizUPac5HqWZQrIzBlqY3tISJY70/IrYsDt/6juoRE8r4tabtWOFaZdQ5BMdQPqSCxq5F1GTdQ9rRKFUMiuWCr7r3a4kZdN32YZqfSEzx0z3hQ+GNEnzffRzpVzJwqOsIXrycjNV1a7kQbjb1EFXcrCGPcIqLwcWLpYLDvgwte3d4hhuQ2n4Qx3tOoXbEjasT1zEavGVko29yAGcGziH58uuQMppXsvYubjrDS1MqaKpYLPiyI0XLzo+CG0XY07oPrWPteiQ6VJ7SfIeZTR48FfytV9Aw5CflDIolMdjsTjZnzIPWW23Y3ZKC4eCI0W+71YGW0TajHYI/0IuG4ZlNl9pziPpceTnrHvKTMgaDyxFbuAw5/U59e3Skdx6Fe8RjtKenp/FI+dNYU7IB48FxY0zhTc/bkNyl6An4jf4U79vofplZ5fEb8pNShhCLYvF4+XO4Pt5vTIjENdYxreOw7pnI9J/AUV8mxaf0CHC2LwspnQcwFhzTI8B3PccgBVx1KVetvKSEIZz5gk2VLzGFs+vnHr6EzK4Turcw2AfyIMyoFHOjKR8pYghnMZ/IITjl+1VPmYFv3I+T3T/r3sJwoS+HK+YmK6Kx8pFChnBeXMITaR1uTt6EZ6geO2vew46ad7C/OQ37mg/gI+8nWmph+LojnXVnqkM+UsAQzvzFeLJiI1KaUpGYy4M/hzczA5JtMt65Ck0jLVru3jDGc/2x0uchTp5oIR+5yBBJJ2mnkZMv+juumWVIdm3FRPC2lp0faud/7N1l6oVrST7DLNLA4BzXuPKtlW+hc/SKlp8b6W0ZEJtaBN9a4TpGUCtcEE3zh3LXYq83BeX9legL9Bu/5aGJIdQOuvF712mjfbL7F529sPm51klh8OsOJG+BzOGL/y9BjM2KNXkb8Gj+s1jnfAJx2SshWfwXU7ARexr3weJMoj53s5qj6ptn9dHY8o2xvZWxY4FUc4x5FLVz42TzZFLfDv5e1bjq2xYhxsEXRGhOGc9ru8UmcoH/8B3xw8YWDxd9YFQbUrfViktpnGPdYf6vtls+l3IOGOn7n6iM1evQbj0tKRJrGivYLWlSyAslpEqT/QFRGaq6qoXZrTbJXblCO4Yh27pN8iznebOf7alZIvfD7PgRLqRKciyfyh+y1DQS+Qc7LndRdtdxOQAAAABJRU5ErkJggg==" alt="微信"></a></li></ul></div><div class="tctip-qr-detail"><div class="tctip-qr-box"><p class="tctip-qr-title">扫描二维码打赏</p><div class="tctip-qr-code"><img src="https://files.cnblogs.com/files/Dominic-Ji/WechatIMG5.bmp"></div><p class="tctip-qr-desc">支付宝打赏</p></div></div></div><p class="tctip-footer"><a href="https://github.com/greedying/tctip" target="_blank">了解更多</a></p></div></div><script src="http://stat.tctip.com/stat/index/version/1.0.0"></script> <link type="text/css" rel="stylesheet" href="https://files.cnblogs.com/files/hafiz/feedback.css"> <link type="text/css" rel="stylesheet" href="https://files.cnblogs.com/files/miangao/maodian.css"> <!--PageBeginHtml Block End--> <!--done--> <div id="home"> <div id="header"> <div id="blogTitle"> <a id="lnkBlogLogo" href="https://www.cnblogs.com/Dominic-Ji/"><img id="blogLogo" src="/Skins/custom/images/logo.gif" alt="返回主页"></a> <!--done--> <h1 class="bounceInLeft animated"><a id="Header1_HeaderTitle" class="headermaintitle" href="https://www.cnblogs.com/Dominic-Ji/">Jason</a></h1> <h2 class="bounceInRight animated">Do Whatever We Want !</h2> </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> <ul id="navList"> <li><a id="blog_nav_sitehome" class="menu" href="https://www.cnblogs.com/">博客园</a></li> <li><a id="blog_nav_myhome" class="menu" href="https://www.cnblogs.com/Dominic-Ji/">首页</a></li> <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li> <li><a id="blog_nav_contact" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%85%83%E5%B0%91~">联系</a></li> <li><a id="blog_nav_rss" class="menu" href="https://www.cnblogs.com/Dominic-Ji/rss">订阅</a> <!--<a id="blog_nav_rss_image" class="aHeaderXML" href="https://www.cnblogs.com/Dominic-Ji/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a>--></li> <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li> </ul> <div class="blogStats"> <div id="blog_stats"> <span id="stats_post_count">随笔 - 55 </span> <span id="stats_article_count">文章 - 1 </span> <span id="stats-comment_count">评论 - 4</span> </div> </div><!--end: blogStats --> </div><!--end: navigator 博客导航栏 --> </div><!--end: header 头部 --> <div id="main"> <div id="mainContent"> <div class="forFlow"> <div id="post_detail"> <!--done--> <div id="topics"> <div class="post"> <h1 class="postTitle"> <a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/Dominic-Ji/p/10718365.html">Cookie Session和自定义分页</a> </h1> <div class="clear"></div> <div class="postBody"> <div id="cnblogs_post_body" class="blogpost-body"><div id="cnblogs_post_body" class="blogpost-body"> <h2 id="autoid-0-0-0">cookie<strong><br></strong></h2> <h3 id="autoid-0-0-0">Cookie的由来</h3> <p>大家都知道HTTP协议是无状态的。</p> <p>无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。</p> <p>一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。</p> <p>状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。</p> <h3 id="autoid-1-0-0">什么是Cookie</h3> <p>Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。</p> <h3 id="autoid-2-0-0">Cookie的原理</h3> <p>cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。</p> <h3 id="autoid-3-0-0"><strong>查看</strong><strong>Cookie</strong></h3> <p>我们使用Chrome浏览器,打开开发者工具。</p> <p><img src="https://images2018.cnblogs.com/blog/867021/201804/867021-20180403225926558-498750585.png" alt=""></p> <h2 id="autoid-4-0-0">Django中操作Cookie</h2> <h3 id="autoid-4-0-0">获取Cookie</h3> <div class="cnblogs_code"> <pre>request.COOKIES[<span style="color: #800000;">'</span><span style="color: #800000;">key</span><span style="color: #800000;">'</span><span style="color: #000000;">] request.get_signed_cookie(key, default</span>=RAISE_ERROR, salt=<span style="color: #800000;">''</span>, max_age=None)</pre> </div> <p>参数:</p> <ul> <li>default: 默认值</li> <li>salt: 加密盐</li> <li>max_age: 后台控制过期时间</li> </ul> <h3 id="autoid-5-0-0">设置Cookie</h3> <div class="cnblogs_code"> <pre>rep =<span style="color: #000000;"> HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt</span>=<span style="color: #800000;">'</span><span style="color: #800000;">加密盐</span><span style="color: #800000;">'</span>, max_age=None, ...)</pre> </div> <p>参数:</p> <ul> <li>key, 键</li> <li>value='', 值</li> <li>max_age=None, 超时时间</li> <li>expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)</li> <li>path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问</li> <li>domain=None, Cookie生效的域名</li> <li>secure=False, https传输</li> <li>httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)</li> </ul> <h3 id="autoid-6-0-0">删除Cookie</h3> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">def</span><span style="color: #000000;"> logout(request): rep </span>= redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/login/</span><span style="color: #800000;">"</span><span style="color: #000000;">) rep.delete_cookie(</span><span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span>) <span style="color: #008000;">#</span><span style="color: #008000;"> 删除用户浏览器上之前设置的usercookie值</span> <span style="color: #0000ff;">return</span> rep</pre> </div> <p>Cookie版登陆校验</p> <div class="cnblogs_code" onclick="cnblogs_code_show('59f6767f-027b-4388-ab55-7f4b0cf6a37b')"><img id="code_img_closed_59f6767f-027b-4388-ab55-7f4b0cf6a37b" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_59f6767f-027b-4388-ab55-7f4b0cf6a37b" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('59f6767f-027b-4388-ab55-7f4b0cf6a37b',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_59f6767f-027b-4388-ab55-7f4b0cf6a37b" class="cnblogs_code_hide"> <pre><span style="color: #000000;">def check_login(func): @wraps(func) def inner(request, </span>*args, **<span style="color: #000000;">kwargs): next_url </span>=<span style="color: #000000;"> request.get_full_path() </span><span style="color: #0000ff;">if</span> request.get_signed_cookie(<span style="color: #800000;">"</span><span style="color: #800000;">login</span><span style="color: #800000;">"</span>, salt=<span style="color: #800000;">"</span><span style="color: #800000;">SSS</span><span style="color: #800000;">"</span>, default=None) == <span style="color: #800000;">"</span><span style="color: #800000;">yes</span><span style="color: #800000;">"</span><span style="color: #000000;">: # 已经登录的用户... return func(request, </span>*args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: # 没有登录的用户,跳转刚到登录页面 return redirect(</span><span style="color: #800000;">"</span><span style="color: #800000;">/login/?next={}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(next_url)) return inner def </span><span style="color: #0000ff;">login</span><span style="color: #000000;">(request): </span><span style="color: #0000ff;">if</span> request.method == <span style="color: #800000;">"</span><span style="color: #800000;">POST</span><span style="color: #800000;">"</span><span style="color: #000000;">: username </span>= request.POST.get(<span style="color: #800000;">"</span><span style="color: #800000;">username</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">passwd</span> = request.POST.get(<span style="color: #800000;">"</span><span style="color: #800000;">password</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">if</span> username == <span style="color: #800000;">"</span><span style="color: #800000;">xxx</span><span style="color: #800000;">"</span> and <span style="color: #0000ff;">passwd</span> == <span style="color: #800000;">"</span><span style="color: #800000;">dashabi</span><span style="color: #800000;">"</span><span style="color: #000000;">: next_url </span>= request.GET.get(<span style="color: #800000;">"</span><span style="color: #800000;">next</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">if</span> next_url and next_url != <span style="color: #800000;">"</span><span style="color: #800000;">/logout/</span><span style="color: #800000;">"</span><span style="color: #000000;">: response </span>=<span style="color: #000000;"> redirect(next_url) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: response </span>= redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/class_list/</span><span style="color: #800000;">"</span><span style="color: #000000;">) response.set_signed_cookie(</span><span style="color: #800000;">"</span><span style="color: #800000;">login</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">yes</span><span style="color: #800000;">"</span>, salt=<span style="color: #800000;">"</span><span style="color: #800000;">SSS</span><span style="color: #800000;">"</span><span style="color: #000000;">) return response return render(request, </span><span style="color: #800000;">"</span><span style="color: #800000;">login.html</span><span style="color: #800000;">"</span>)</pre> </div> <span class="cnblogs_code_collapse">cookie版登录</span></div> <h2 id="autoid-7-0-0">Session</h2> <h3 id="autoid-7-0-0"><strong>Session</strong><strong>的由来</strong></h3> <p>Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。</p> <p>问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。</p> <p>我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。</p> <p>总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。</p> <p>另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。</p> <h2 id="autoid-8-0-0">Django中Session相关方法</h2> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #000000;"># 获取、设置、删除Session中数据 request.session[</span><span style="color: #800000;">'</span><span style="color: #800000;">k1</span><span style="color: #800000;">'</span><span style="color: #000000;">] request.session.get(</span><span style="color: #800000;">'</span><span style="color: #800000;">k1</span><span style="color: #800000;">'</span><span style="color: #000000;">,None) request.session[</span><span style="color: #800000;">'</span><span style="color: #800000;">k1</span><span style="color: #800000;">'</span>] = <span style="color: #800080;">123</span><span style="color: #000000;"> request.session.setdefault(</span><span style="color: #800000;">'</span><span style="color: #800000;">k1</span><span style="color: #800000;">'</span>,<span style="color: #800080;">123</span><span style="color: #000000;">) # 存在则不设置 del request.session[</span><span style="color: #800000;">'</span><span style="color: #800000;">k1</span><span style="color: #800000;">'</span><span style="color: #000000;">] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 会话session的key request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查会话session的key在数据库中是否存在 request.session.exists(</span><span style="color: #800000;">"</span><span style="color: #800000;">session_key</span><span style="color: #800000;">"</span><span style="color: #000000;">) # 删除当前会话的所有Session数据 request.session.delete() # 删除当前的会话数据并删除会话的Cookie。 request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) </span>*<span style="color: #000000;"> 如果value是个整数,session会在些秒数后失效。 </span>*<span style="color: #000000;"> 如果value是个datatime或timedelta,session就会在这个时间后失效。 </span>*<span style="color: #000000;"> 如果value是0,用户关闭浏览器session就会失效。 </span>* 如果value是None,session会依赖全局session失效策略。</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h3 id="autoid-8-0-0">Session流程解析</h3> <p><img src="https://images2018.cnblogs.com/blog/867021/201805/867021-20180514143525989-365124875.png" alt=""></p> <h3 id="autoid-9-0-0">Session版登陆验证</h3> <div class="cnblogs_code" onclick="cnblogs_code_show('b510afb1-3ccc-455b-9a29-309a08ebb78d')"><img id="code_img_closed_b510afb1-3ccc-455b-9a29-309a08ebb78d" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_b510afb1-3ccc-455b-9a29-309a08ebb78d" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('b510afb1-3ccc-455b-9a29-309a08ebb78d',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_b510afb1-3ccc-455b-9a29-309a08ebb78d" class="cnblogs_code_hide"> <pre><span style="color: #0000ff;">from</span> functools <span style="color: #0000ff;">import</span><span style="color: #000000;"> wraps </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> check_login(func): @wraps(func) </span><span style="color: #0000ff;">def</span> inner(request, *args, **<span style="color: #000000;">kwargs): next_url </span>=<span style="color: #000000;"> request.get_full_path() </span><span style="color: #0000ff;">if</span> request.session.get(<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span><span style="color: #000000;">): </span><span style="color: #0000ff;">return</span> func(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/login/?next={}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(next_url)) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> inner </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> login(request): </span><span style="color: #0000ff;">if</span> request.method == <span style="color: #800000;">"</span><span style="color: #800000;">POST</span><span style="color: #800000;">"</span><span style="color: #000000;">: user </span>= request.POST.get(<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span><span style="color: #000000;">) pwd </span>= request.POST.get(<span style="color: #800000;">"</span><span style="color: #800000;">pwd</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">if</span> user == <span style="color: #800000;">"</span><span style="color: #800000;">alex</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">and</span> pwd == <span style="color: #800000;">"</span><span style="color: #800000;">alex1234</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #008000;">#</span><span style="color: #008000;"> 设置session</span> request.session[<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span>] =<span style="color: #000000;"> user </span><span style="color: #008000;">#</span><span style="color: #008000;"> 获取跳到登陆页面之前的URL</span> next_url = request.GET.get(<span style="color: #800000;">"</span><span style="color: #800000;">next</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 如果有,就跳转回登陆之前的URL</span> <span style="color: #0000ff;">if</span><span style="color: #000000;"> next_url: </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> redirect(next_url) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 否则默认跳转到index页面</span> <span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/index/</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">login.html</span><span style="color: #800000;">"</span><span style="color: #000000;">) @check_login </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> logout(request): </span><span style="color: #008000;">#</span><span style="color: #008000;"> 删除所有当前请求相关的session</span> <span style="color: #000000;"> request.session.delete() </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/login/</span><span style="color: #800000;">"</span><span style="color: #000000;">) @check_login </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> index(request): current_user </span>= request.session.get(<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span><span style="color: #000000;">, None) </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">index.html</span><span style="color: #800000;">"</span>, {<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span>: current_user})</pre> </div> <span class="cnblogs_code_collapse">Session版登录验证</span></div> <h3 id="autoid-10-0-0">Django中的Session配置</h3> <p>Django中默认支持Session,其内部提供了5种类型的Session供开发者使用。</p> <div class="cnblogs_code" onclick="cnblogs_code_show('5462b8e6-3c42-4d6d-9fb5-93b169daa4c7')"><img id="code_img_closed_5462b8e6-3c42-4d6d-9fb5-93b169daa4c7" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5462b8e6-3c42-4d6d-9fb5-93b169daa4c7" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('5462b8e6-3c42-4d6d-9fb5-93b169daa4c7',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_5462b8e6-3c42-4d6d-9fb5-93b169daa4c7" class="cnblogs_code_hide"> <pre><span style="color: #800080;">1</span><span style="color: #000000;">. 数据库Session SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.db</span><span style="color: #800000;">'</span><span style="color: #000000;"> # 引擎(默认) </span><span style="color: #800080;">2</span><span style="color: #000000;">. 缓存Session SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.cache</span><span style="color: #800000;">'</span><span style="color: #000000;"> # 引擎 SESSION_CACHE_ALIAS </span>= <span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;"> # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 </span><span style="color: #800080;">3</span><span style="color: #000000;">. 文件Session SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.file</span><span style="color: #800000;">'</span><span style="color: #000000;"> # 引擎 SESSION_FILE_PATH </span>=<span style="color: #000000;"> None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() </span><span style="color: #800080;">4</span>. 缓存+<span style="color: #000000;">数据库 SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.cached_db</span><span style="color: #800000;">'</span><span style="color: #000000;"> # 引擎 </span><span style="color: #800080;">5</span><span style="color: #000000;">. 加密Cookie Session SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.signed_cookies</span><span style="color: #800000;">'</span><span style="color: #000000;"> # 引擎 其他公用设置项: SESSION_COOKIE_NAME = </span><span style="color: #800000;">"</span><span style="color: #800000;">sessionid</span><span style="color: #800000;">"</span><span style="color: #000000;"> # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = </span><span style="color: #800000;">"</span><span style="color: #800000;">/</span><span style="color: #800000;">"</span><span style="color: #000000;"> # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN </span>=<span style="color: #000000;"> None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE </span>=<span style="color: #000000;"> False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY </span>=<span style="color: #000000;"> True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE </span>= <span style="color: #800080;">1209600</span><span style="color: #000000;"> # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE </span>=<span style="color: #000000;"> False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST </span>= False # 是否每次请求都保存Session,默认修改之后才保存(默认)</pre> </div> <span class="cnblogs_code_collapse">Django中Session相关设置</span></div> <h3 id="autoid-11-0-0">CBV中加装饰器相关</h3> <p>CBV实现的登录视图</p> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">class</span><span style="color: #000000;"> LoginView(View): </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self, request): </span><span style="color: #800000;">"""</span><span style="color: #800000;"> 处理GET请求 </span><span style="color: #800000;">"""</span> <span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">'</span><span style="color: #800000;">login.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self, request): </span><span style="color: #800000;">"""</span><span style="color: #800000;"> 处理POST请求 </span><span style="color: #800000;">"""</span><span style="color: #000000;"> user </span>= request.POST.get(<span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span><span style="color: #000000;">) pwd </span>= request.POST.get(<span style="color: #800000;">'</span><span style="color: #800000;">pwd</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">if</span> user == <span style="color: #800000;">'</span><span style="color: #800000;">alex</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">and</span> pwd == <span style="color: #800000;">"</span><span style="color: #800000;">alex1234</span><span style="color: #800000;">"</span><span style="color: #000000;">: next_url </span>= request.GET.get(<span style="color: #800000;">"</span><span style="color: #800000;">next</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 生成随机字符串</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 写浏览器cookie -> session_id: 随机字符串</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 写到服务端session:</span> <span style="color: #008000;">#</span><span style="color: #008000;"> {</span> <span style="color: #008000;">#</span><span style="color: #008000;"> "随机字符串": {'user':'alex'}</span> <span style="color: #008000;">#</span><span style="color: #008000;"> }</span> request.session[<span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span>] =<span style="color: #000000;"> user </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> next_url: </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> redirect(next_url) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">'</span><span style="color: #800000;">/index/</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">'</span><span style="color: #800000;">login.html</span><span style="color: #800000;">'</span>)</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p>要在CBV视图中使用我们上面的check_login装饰器,有以下三种方式:</p> <p>from django.utils.decorators import method_decorator</p> <p><strong>1. 加在CBV视图的get或post方法上</strong></p> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">from</span> django.utils.decorators <span style="color: #0000ff;">import</span><span style="color: #000000;"> method_decorator </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> HomeView(View): </span><span style="color: #0000ff;">def</span> dispatch(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> super(HomeView, self).dispatch(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self, request): </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">home.html</span><span style="color: #800000;">"</span><span style="color: #000000;">) @method_decorator(check_login) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self, request): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Home View POST method...</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/index/</span><span style="color: #800000;">"</span>)</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p><strong>2. 加在dispatch方法上</strong></p> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">from</span> django.utils.decorators <span style="color: #0000ff;">import</span><span style="color: #000000;"> method_decorator </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> HomeView(View): @method_decorator(check_login) </span><span style="color: #0000ff;">def</span> dispatch(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> super(HomeView, self).dispatch(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self, request): </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">home.html</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self, request): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Home View POST method...</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/index/</span><span style="color: #800000;">"</span>)</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p>因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。</p> <p><strong>3. 直接加在视图类上,但method_decorator必须传 name 关键字参数</strong></p> <p>如果get方法和post方法都需要登录校验的话就写两个装饰器。</p> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">from</span> django.utils.decorators <span style="color: #0000ff;">import</span><span style="color: #000000;"> method_decorator @method_decorator(check_login, name</span>=<span style="color: #800000;">"</span><span style="color: #800000;">get</span><span style="color: #800000;">"</span><span style="color: #000000;">) @method_decorator(check_login, name</span>=<span style="color: #800000;">"</span><span style="color: #800000;">post</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> HomeView(View): </span><span style="color: #0000ff;">def</span> dispatch(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> super(HomeView, self).dispatch(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self, request): </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">home.html</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self, request): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Home View POST method...</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/index/</span><span style="color: #800000;">"</span>)</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h3 id="autoid-12-0-0">补充</h3> <p>CSRF Token相关装饰器在CBV只能加到dispatch方法上,或者加在视图类上然后name参数指定为dispatch方法。</p> <p>备注:</p> <ul> <li>csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。</li> <li>csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。</li> </ul> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">from</span> django.views.decorators.csrf <span style="color: #0000ff;">import</span><span style="color: #000000;"> csrf_exempt, csrf_protect </span><span style="color: #0000ff;">from</span> django.utils.decorators <span style="color: #0000ff;">import</span><span style="color: #000000;"> method_decorator </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> HomeView(View): @method_decorator(csrf_exempt) </span><span style="color: #0000ff;">def</span> dispatch(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> super(HomeView, self).dispatch(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self, request): </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">home.html</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self, request): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Home View POST method...</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/index/</span><span style="color: #800000;">"</span>)</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p>或者</p> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">from</span> django.views.decorators.csrf <span style="color: #0000ff;">import</span><span style="color: #000000;"> csrf_exempt, csrf_protect </span><span style="color: #0000ff;">from</span> django.utils.decorators <span style="color: #0000ff;">import</span><span style="color: #000000;"> method_decorator @method_decorator(csrf_exempt, name</span>=<span style="color: #800000;">'</span><span style="color: #800000;">dispatch</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> HomeView(View): </span><span style="color: #0000ff;">def</span> dispatch(self, request, *args, **<span style="color: #000000;">kwargs): </span><span style="color: #0000ff;">return</span> super(HomeView, self).dispatch(request, *args, **<span style="color: #000000;">kwargs) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self, request): </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">home.html</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> post(self, request): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Home View POST method...</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">"</span><span style="color: #800000;">/index/</span><span style="color: #800000;">"</span>)</pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h2 id="autoid-13-0-0">分页</h2> <p>当数据库中数据有很多,我们通常会在前端页面做分页展示。</p> <p>分页的数据可以在前端页面实现,也可以在后端实现分页。</p> <p>后端实现分页的原理就是每次只请求一页数据。</p> <p>准备工作</p> <p>我们使用脚本批量创建一些测试数据(将下面的代码保存到bulk_create.py文件中放到Django项目的根目录,直接执行即可。):</p> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;">import</span><span style="color: #000000;"> os </span><span style="color: #0000ff;">if</span> <span style="color: #800080;">__name__</span> == <span style="color: #800000;">"</span><span style="color: #800000;">__main__</span><span style="color: #800000;">"</span><span style="color: #000000;">: os.environ.setdefault(</span><span style="color: #800000;">"</span><span style="color: #800000;">DJANGO_SETTINGS_MODULE</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">about_orm.settings</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> django django.setup() </span><span style="color: #0000ff;">from</span> app01 <span style="color: #0000ff;">import</span><span style="color: #000000;"> models bulk_obj </span>= (models.Publisher(name=<span style="color: #800000;">'</span><span style="color: #800000;">沙河第{}出版社</span><span style="color: #800000;">'</span>.format(i)) <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(300<span style="color: #000000;">)) models.Publisher.objects.bulk_create(bulk_obj)</span></pre> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <h3 id="autoid-13-0-0">自定义分页</h3> <div class="cnblogs_code" onclick="cnblogs_code_show('aeb73e7e-35f6-4f33-962a-c2cc17aa2dea')"><img id="code_img_closed_aeb73e7e-35f6-4f33-962a-c2cc17aa2dea" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_aeb73e7e-35f6-4f33-962a-c2cc17aa2dea" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('aeb73e7e-35f6-4f33-962a-c2cc17aa2dea',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_aeb73e7e-35f6-4f33-962a-c2cc17aa2dea" class="cnblogs_code_hide"> <pre><span style="color: #0000ff;">def</span><span style="color: #000000;"> publisher_list(request): </span><span style="color: #008000;">#</span><span style="color: #008000;"> 从URL中取当前访问的页码数</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">: current_page </span>= int(request.GET.get(<span style="color: #800000;">'</span><span style="color: #800000;">page</span><span style="color: #800000;">'</span><span style="color: #000000;">)) </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> Exception as e: </span><span style="color: #008000;">#</span><span style="color: #008000;"> 取不到或者页码数不是数字都默认展示第1页</span> current_page = 1 <span style="color: #008000;">#</span><span style="color: #008000;"> 总数据量</span> total_count =<span style="color: #000000;"> models.Publisher.objects.count() </span><span style="color: #008000;">#</span><span style="color: #008000;"> 定义每页显示多少条数据</span> per_page = 10 <span style="color: #008000;">#</span><span style="color: #008000;"> 计算出总页码数</span> total_page, more =<span style="color: #000000;"> divmod(total_count, per_page) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> more: total_page </span>+= 1 <span style="color: #008000;">#</span><span style="color: #008000;"> 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)</span> max_show = 11<span style="color: #000000;"> half_show </span>= max_show // 2 <span style="color: #008000;">#</span><span style="color: #008000;"> 计算一下页面显示的页码范围</span> <span style="color: #0000ff;">if</span> total_page <= max_show: <span style="color: #008000;">#</span><span style="color: #008000;"> 总页码数小于最大显示页码数</span> page_start = 1<span style="color: #000000;"> page_end </span>=<span style="color: #000000;"> total_page </span><span style="color: #0000ff;">elif</span> current_page + half_show >= total_page: <span style="color: #008000;">#</span><span style="color: #008000;"> 右边越界</span> page_end =<span style="color: #000000;"> total_page page_start </span>= total_page -<span style="color: #000000;"> max_show </span><span style="color: #0000ff;">elif</span> current_page - half_show <= 1: <span style="color: #008000;">#</span><span style="color: #008000;"> 左边越界</span> page_start = 1<span style="color: #000000;"> page_end </span>=<span style="color: #000000;"> max_show </span><span style="color: #0000ff;">else</span>: <span style="color: #008000;">#</span><span style="color: #008000;"> 正常页码区间</span> page_start = current_page -<span style="color: #000000;"> half_show page_end </span>= current_page +<span style="color: #000000;"> half_show </span><span style="color: #008000;">#</span><span style="color: #008000;"> 数据索引起始位置</span> data_start = (current_page-1) *<span style="color: #000000;"> per_page data_end </span>= current_page *<span style="color: #000000;"> per_page publisher_list </span>=<span style="color: #000000;"> models.Publisher.objects.all()[data_start:data_end] </span><span style="color: #008000;">#</span><span style="color: #008000;"> 生成页面上显示的页码</span> page_html_list =<span style="color: #000000;"> [] page_html_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"><nav aria-label="Page navigation"><ul class="pagination"></span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加首页</span> first_li = <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="/publisher_list/?page=1">首页</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;"> page_html_list.append(first_li) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加上一页</span> <span style="color: #0000ff;">if</span> current_page == 1<span style="color: #000000;">: prev_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="#"><span aria-hidden="true">&laquo;</span></a></li></span><span style="color: #800000;">'</span> <span style="color: #0000ff;">else</span><span style="color: #000000;">: prev_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="/publisher_list/?page={}"><span aria-hidden="true">&laquo;</span></a></li></span><span style="color: #800000;">'</span>.format(current_page - 1<span style="color: #000000;">) page_html_list.append(prev_li) </span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(page_start, page_end + 1<span style="color: #000000;">): </span><span style="color: #0000ff;">if</span> i ==<span style="color: #000000;"> current_page: li_tag </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li class="active"><a href="/publisher_list/?page={0}">{0}</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(i) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: li_tag </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="/publisher_list/?page={0}">{0}</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(i) page_html_list.append(li_tag) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加下一页</span> <span style="color: #0000ff;">if</span> current_page ==<span style="color: #000000;"> total_page: next_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="#"><span aria-hidden="true">&raquo;</span></a></li></span><span style="color: #800000;">'</span> <span style="color: #0000ff;">else</span><span style="color: #000000;">: next_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="/publisher_list/?page={}"><span aria-hidden="true">&raquo;</span></a></li></span><span style="color: #800000;">'</span>.format(current_page + 1<span style="color: #000000;">) page_html_list.append(next_li) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加尾页</span> page_end_li = <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="/publisher_list/?page={}">尾页</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(total_page) page_html_list.append(page_end_li) page_html_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"></ul></nav></span><span style="color: #800000;">'</span><span style="color: #000000;">) page_html </span>= <span style="color: #800000;">""</span><span style="color: #000000;">.join(page_html_list) </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">publisher_list.html</span><span style="color: #800000;">"</span>, {<span style="color: #800000;">"</span><span style="color: #800000;">publisher_list</span><span style="color: #800000;">"</span>: publisher_list, <span style="color: #800000;">"</span><span style="color: #800000;">page_html</span><span style="color: #800000;">"</span>: page_html})</pre> </div> <span class="cnblogs_code_collapse">稳扎稳打版</span></div> <div class="cnblogs_code" onclick="cnblogs_code_show('146eec71-97e8-4144-baa2-c84b41c70201')"><img id="code_img_closed_146eec71-97e8-4144-baa2-c84b41c70201" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_146eec71-97e8-4144-baa2-c84b41c70201" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('146eec71-97e8-4144-baa2-c84b41c70201',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_146eec71-97e8-4144-baa2-c84b41c70201" class="cnblogs_code_hide"> <pre><span style="color: #0000ff;">class</span><span style="color: #000000;"> Pagination(object): </span><span style="color: #800000;">"""</span><span style="color: #800000;">自定义分页(Bootstrap版)</span><span style="color: #800000;">"""</span> <span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span>(self, current_page, total_count, base_url, per_page=10, max_show=11<span style="color: #000000;">): </span><span style="color: #800000;">"""</span><span style="color: #800000;"> :param current_page: 当前请求的页码 :param total_count: 总数据量 :param base_url: 请求的URL :param per_page: 每页显示的数据量,默认值为10 :param max_show: 页面上最多显示多少个页码,默认值为11 </span><span style="color: #800000;">"""</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">: self.current_page </span>=<span style="color: #000000;"> int(current_page) </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> Exception as e: </span><span style="color: #008000;">#</span><span style="color: #008000;"> 取不到或者页码数不是数字都默认展示第1页</span> self.current_page = 1 <span style="color: #008000;">#</span><span style="color: #008000;"> 定义每页显示多少条数据</span> self.per_page =<span style="color: #000000;"> per_page </span><span style="color: #008000;">#</span><span style="color: #008000;"> 计算出总页码数</span> total_page, more =<span style="color: #000000;"> divmod(total_count, per_page) </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> more: total_page </span>+= 1<span style="color: #000000;"> self.total_page </span>=<span style="color: #000000;"> total_page </span><span style="color: #008000;">#</span><span style="color: #008000;"> 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)</span> self.max_show =<span style="color: #000000;"> max_show self.half_show </span>= max_show // 2<span style="color: #000000;"> self.base_url </span>=<span style="color: #000000;"> base_url @property </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> start(self): </span><span style="color: #0000ff;">return</span> (self.current_page-1) *<span style="color: #000000;"> self.per_page @property </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> end(self): </span><span style="color: #0000ff;">return</span> self.current_page *<span style="color: #000000;"> self.per_page </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> page_html(self): </span><span style="color: #008000;">#</span><span style="color: #008000;"> 计算一下页面显示的页码范围</span> <span style="color: #0000ff;">if</span> self.total_page <= self.max_show: <span style="color: #008000;">#</span><span style="color: #008000;"> 总页码数小于最大显示页码数</span> page_start = 1<span style="color: #000000;"> page_end </span>=<span style="color: #000000;"> self.total_page </span><span style="color: #0000ff;">elif</span> self.current_page + self.half_show >= self.total_page: <span style="color: #008000;">#</span><span style="color: #008000;"> 右边越界</span> page_end =<span style="color: #000000;"> self.total_page page_start </span>= self.total_page -<span style="color: #000000;"> self.max_show </span><span style="color: #0000ff;">elif</span> self.current_page - self.half_show <= 1: <span style="color: #008000;">#</span><span style="color: #008000;"> 左边越界</span> page_start = 1<span style="color: #000000;"> page_end </span>=<span style="color: #000000;"> self.max_show </span><span style="color: #0000ff;">else</span>: <span style="color: #008000;">#</span><span style="color: #008000;"> 正常页码区间</span> page_start = self.current_page -<span style="color: #000000;"> self.half_show page_end </span>= self.current_page +<span style="color: #000000;"> self.half_show </span><span style="color: #008000;">#</span><span style="color: #008000;"> 生成页面上显示的页码</span> page_html_list =<span style="color: #000000;"> [] page_html_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"><nav aria-label="Page navigation"><ul class="pagination"></span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加首页</span> first_li = <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="{}?page=1">首页</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(self.base_url) page_html_list.append(first_li) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加上一页</span> <span style="color: #0000ff;">if</span> self.current_page == 1<span style="color: #000000;">: prev_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="#"><span aria-hidden="true">&laquo;</span></a></li></span><span style="color: #800000;">'</span> <span style="color: #0000ff;">else</span><span style="color: #000000;">: prev_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format( self.base_url, self.current_page </span>- 1<span style="color: #000000;">) page_html_list.append(prev_li) </span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(page_start, page_end + 1<span style="color: #000000;">): </span><span style="color: #0000ff;">if</span> i ==<span style="color: #000000;"> self.current_page: li_tag </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li class="active"><a href="{0}?page={1}">{1}</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(self.base_url, i) </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: li_tag </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="{0}?page={1}">{1}</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(self.base_url, i) page_html_list.append(li_tag) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加下一页</span> <span style="color: #0000ff;">if</span> self.current_page ==<span style="color: #000000;"> self.total_page: next_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="#"><span aria-hidden="true">&raquo;</span></a></li></span><span style="color: #800000;">'</span> <span style="color: #0000ff;">else</span><span style="color: #000000;">: next_li </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format( self.base_url, self.current_page </span>+ 1<span style="color: #000000;">) page_html_list.append(next_li) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 加尾页</span> page_end_li = <span style="color: #800000;">'</span><span style="color: #800000;"><li><a href="{}?page={}">尾页</a></li></span><span style="color: #800000;">'</span><span style="color: #000000;">.format(self.base_url, self.total_page) page_html_list.append(page_end_li) page_html_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"></ul></nav></span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> <span style="color: #800000;">""</span>.join(page_html_list)</pre> </div> <span class="cnblogs_code_collapse">封装保存版</span></div> <div class="cnblogs_code" onclick="cnblogs_code_show('161748a1-1661-454d-9e06-c62a529a006b')"><img id="code_img_closed_161748a1-1661-454d-9e06-c62a529a006b" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_161748a1-1661-454d-9e06-c62a529a006b" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('161748a1-1661-454d-9e06-c62a529a006b',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_161748a1-1661-454d-9e06-c62a529a006b" class="cnblogs_code_hide"> <pre><span style="color: #0000ff;">def</span><span style="color: #000000;"> publisher_list(request): </span><span style="color: #008000;">#</span><span style="color: #008000;"> 从URL中取当前访问的页码数</span> current_page = int(request.GET.get(<span style="color: #800000;">'</span><span style="color: #800000;">page</span><span style="color: #800000;">'</span><span style="color: #000000;">)) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 比len(models.Publisher.objects.all())更高效</span> total_count =<span style="color: #000000;"> models.Publisher.objects.count() page_obj </span>=<span style="color: #000000;"> Pagination(current_page, total_count, request.path_info) data </span>=<span style="color: #000000;"> models.Publisher.objects.all()[page_obj.start:page_obj.end] page_html </span>=<span style="color: #000000;"> page_obj.page_html() </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">"</span><span style="color: #800000;">publisher_list.html</span><span style="color: #800000;">"</span>, {<span style="color: #800000;">"</span><span style="color: #800000;">publisher_list</span><span style="color: #800000;">"</span>: data, <span style="color: #800000;">"</span><span style="color: #800000;">page_html</span><span style="color: #800000;">"</span>: page_html})</pre> </div> <span class="cnblogs_code_collapse">封装保存版使用示例</span></div> <h3 id="autoid-14-0-0">Django内置分页</h3> <div class="cnblogs_code" onclick="cnblogs_code_show('f8df5a37-7cf7-48b5-b084-1da145caf757')"><img id="code_img_closed_f8df5a37-7cf7-48b5-b084-1da145caf757" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_f8df5a37-7cf7-48b5-b084-1da145caf757" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('f8df5a37-7cf7-48b5-b084-1da145caf757',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_f8df5a37-7cf7-48b5-b084-1da145caf757" class="cnblogs_code_hide"> <pre><span style="color: #0000ff;">from</span> django.shortcuts <span style="color: #0000ff;">import</span><span style="color: #000000;"> render </span><span style="color: #0000ff;">from</span> django.core.paginator <span style="color: #0000ff;">import</span><span style="color: #000000;"> Paginator, EmptyPage, PageNotAnInteger L </span>=<span style="color: #000000;"> [] </span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(999<span style="color: #000000;">): L.append(i) </span><span style="color: #0000ff;">def</span><span style="color: #000000;"> index(request): current_page </span>= request.GET.get(<span style="color: #800000;">'</span><span style="color: #800000;">p</span><span style="color: #800000;">'</span><span style="color: #000000;">) paginator </span>= Paginator(L, 10<span style="color: #000000;">) </span><span style="color: #008000;">#</span><span style="color: #008000;"> per_page: 每页显示条目数量</span> <span style="color: #008000;">#</span><span style="color: #008000;"> count: 数据总个数</span> <span style="color: #008000;">#</span><span style="color: #008000;"> num_pages:总页数</span> <span style="color: #008000;">#</span><span style="color: #008000;"> page_range:总页数的索引范围,如: (1,10),(1,200)</span> <span style="color: #008000;">#</span><span style="color: #008000;"> page: page对象</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">: posts </span>=<span style="color: #000000;"> paginator.page(current_page) </span><span style="color: #008000;">#</span><span style="color: #008000;"> has_next 是否有下一页</span> <span style="color: #008000;">#</span><span style="color: #008000;"> next_page_number 下一页页码</span> <span style="color: #008000;">#</span><span style="color: #008000;"> has_previous 是否有上一页</span> <span style="color: #008000;">#</span><span style="color: #008000;"> previous_page_number 上一页页码</span> <span style="color: #008000;">#</span><span style="color: #008000;"> object_list 分页之后的数据列表</span> <span style="color: #008000;">#</span><span style="color: #008000;"> number 当前页</span> <span style="color: #008000;">#</span><span style="color: #008000;"> paginator paginator对象</span> <span style="color: #0000ff;">except</span><span style="color: #000000;"> PageNotAnInteger: posts </span>= paginator.page(1<span style="color: #000000;">) </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> EmptyPage: posts </span>=<span style="color: #000000;"> paginator.page(paginator.num_pages) </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">'</span><span style="color: #800000;">index.html</span><span style="color: #800000;">'</span>, {<span style="color: #800000;">'</span><span style="color: #800000;">posts</span><span style="color: #800000;">'</span>: posts})</pre> </div> <span class="cnblogs_code_collapse">内置分页view部分</span></div> <div class="cnblogs_code" onclick="cnblogs_code_show('5aa777b6-a417-4c00-8a02-aa6d3ca43b65')"><img id="code_img_closed_5aa777b6-a417-4c00-8a02-aa6d3ca43b65" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5aa777b6-a417-4c00-8a02-aa6d3ca43b65" class="code_img_opened" style="display: none;" onclick="cnblogs_code_hide('5aa777b6-a417-4c00-8a02-aa6d3ca43b65',event)" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt=""> <div id="cnblogs_code_open_5aa777b6-a417-4c00-8a02-aa6d3ca43b65" class="cnblogs_code_hide"> <pre><span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE html</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">head </span><span style="color: #ff0000;">lang</span><span style="color: #0000ff;">="en"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">charset</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">></span><span style="color: #000000;"> {% for item in posts %} </span><span style="color: #0000ff;"><</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span>{{ item }}<span style="color: #0000ff;"></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;"> {% endfor %} </span><span style="color: #0000ff;"></</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="pagination"</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"><</span><span style="color: #800000;">span </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="step-links"</span><span style="color: #0000ff;">></span><span style="color: #000000;"> {% if posts.has_previous %} </span><span style="color: #0000ff;"><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="?p={{ posts.previous_page_number }}"</span><span style="color: #0000ff;">></span>Previous<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></span><span style="color: #000000;"> {% endif %} </span><span style="color: #0000ff;"><</span><span style="color: #800000;">span </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="current"</span><span style="color: #0000ff;">></span><span style="color: #000000;"> Page {{ posts.number }} of {{ posts.paginator.num_pages }}. </span><span style="color: #0000ff;"></</span><span style="color: #800000;">span</span><span style="color: #0000ff;">></span><span style="color: #000000;"> {% if posts.has_next %} </span><span style="color: #0000ff;"><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="?p={{ posts.next_page_number }}"</span><span style="color: #0000ff;">></span>Next<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></span><span style="color: #000000;"> {% endif %} </span><span style="color: #0000ff;"></</span><span style="color: #800000;">span</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span> <span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span></pre> </div> <span class="cnblogs_code_collapse">内置分页HTML部分</span></div> <p> </p> </div></div><div id="MySignature"></div> <div class="clear"></div> <div id="blog_post_info_block"> <div id="BlogPostCategory">分类: <a href="https://www.cnblogs.com/Dominic-Ji/category/1234201.html" target="_blank">Django框架</a></div> <div id="EntryTag"></div> <div id="blog_post_info"><div id="green_channel"> <a href="javascript:void(0);" id="green_channel_digg" onclick="DiggIt(10718365,cb_blogId,1);green_channel_success(this,'谢谢推荐!');">好文要顶</a> <a id="green_channel_follow" onclick="follow('f76404ce-3d14-4c88-9e28-08d5782f1af4');" href="javascript:void(0);">关注我</a> <a id="green_channel_favorite" onclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a> <a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" onclick="ShareToTsina()"><img src="//common.cnblogs.com/images/icon_weibo_24.png" alt=""></a> <a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" onclick="shareOnWechat()"><img src="//common.cnblogs.com/images/wechat.png" alt=""></a> </div> <div id="author_profile"> <div id="author_profile_info" class="author_profile_info"> <a href="http://home.cnblogs.com/u/Dominic-Ji/" target="_blank"><img src="//pic.cnblogs.com/face/1342004/20180304191536.png" class="author_avatar" alt=""></a> <div id="author_profile_detail" class="author_profile_info"> <a href="http://home.cnblogs.com/u/Dominic-Ji/">元少~</a><br> <a href="http://home.cnblogs.com/u/Dominic-Ji/followees">关注 - 4</a><br> <a href="http://home.cnblogs.com/u/Dominic-Ji/followers">粉丝 - 47</a> </div> </div> <div class="clear"></div> <div id="author_profile_honor"></div> <div id="author_profile_follow"> <a href="javascript:void(0);" onclick="follow('f76404ce-3d14-4c88-9e28-08d5782f1af4');return false;">+加关注</a> </div> </div> <div id="div_digg"> <div class="diggit" onclick="votePost(10718365,'Digg')"> <span class="diggnum" id="digg_count">0</span> </div> <div class="buryit" onclick="votePost(10718365,'Bury')"> <span class="burynum" id="bury_count">0</span> </div> <div class="clear"></div> <div class="diggword" id="digg_tips"> </div> </div> <script type="text/javascript"> currentDiggType = 0; </script></div> <div class="clear"></div> <div id="post_next_prev"><a href="https://www.cnblogs.com/Dominic-Ji/p/10520256.html" class="p_n_p_prefix">« </a> 上一篇:<a href="https://www.cnblogs.com/Dominic-Ji/p/10520256.html" title="发布于2019-03-12 22:52">元少带你看元类</a><br><a href="https://www.cnblogs.com/Dominic-Ji/p/10745044.html" class="p_n_p_prefix">» </a> 下一篇:<a href="https://www.cnblogs.com/Dominic-Ji/p/10745044.html" title="发布于2019-04-21 14:19">Django auth认证</a><br></div> </div> </div> <div class="postDesc">posted @ <span id="post-date">2019-04-16 17:09</span> <a href="https://www.cnblogs.com/Dominic-Ji/">元少~</a> 阅读(<span id="post_view_count">32</span>) 评论(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=10718365" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(10718365);return false;">收藏</a></div> </div> <script type="text/javascript">var allowComments=true,cb_blogId=419604,cb_entryId=10718365,cb_blogApp=currentBlogApp,cb_blogUserGuid='f76404ce-3d14-4c88-9e28-08d5782f1af4',cb_entryCreatedDate='2019/4/16 17:09:00';loadViewCount(cb_entryId);var cb_postType=1;var isMarkdown=false;</script> </div><!--end: topics 文章、评论容器--> </div><a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script> <div id="comment_form" class="commentform"> <a name="commentform"></a> <div id="divCommentShow"></div> <div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" onclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="#" onclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a></div> <div id="comment_form_container"><script type="text/javascript" src="//mention.cnblogs.com/bundles/mention.js?id=20160615"></script> <div id="commentform_title">发表评论</div> <span id="tip_comment" style="color:Red"></span> <p> 昵称:<input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50" value="断剑无重铸"> </p> <div class="commentbox_main"> <div class="commentbox_title"> <div class="commentbox_title_left">评论内容:</div> <div class="commentbox_title_right"> <img id="ubb_quote" class="comment_icon" src="//static.cnblogs.com/images/ubb/quote.gif" alt="引用" title="添加引用" onclick="insertUBB('tbCommentBody','quote')"> <img id="ubb_bold" class="comment_icon" src="//static.cnblogs.com/images/ubb/b.png" alt="粗体" title="添加粗体" onclick="insertUBB('tbCommentBody','b')"> <img id="ubb_url" class="comment_icon" src="//static.cnblogs.com/images/ubb/lk.png" alt="链接" title="添加链接" onclick="insertUbbUrl('tbCommentBody')"> <img id="ubb_indent" class="comment_icon" src="//static.cnblogs.com/images/ubb/indent.png" alt="缩进" title="添加首行缩进" onclick="insertIndent('tbCommentBody')"> <img id="ubb_code" class="comment_icon" src="//static.cnblogs.com/images/ubb/InsertCode.gif" alt="代码" title="添加代码" onclick="insertUbbCode()"> <img id="ubb_img" class="comment_icon" src="//static.cnblogs.com/images/ubb/img.gif" alt="图片" title="上传图片" onclick="OpenImageUploadWindow();"> </div> </div> <div class="clear"></div> <textarea id="tbCommentBody" class="comment_textarea"></textarea> </div> <p id="commentbox_opt"> <input id="btn_comment_submit" type="button" class="comment_btn" value="提交评论"> <span id="span_comment_canceledit" style="display:none"><a href="javascript:void(0);" onclick="return CancelCommentEdit()">不改了</a></span> <a href="javascript:void(0);" onclick="return logout();">退出</a> <a id="commentbox_opt_sub" href="javascript:void(0);" title="订阅后有新评论时会邮件通知您" onclick="commentManager.Subscribe()">订阅评论</a> </p> <div id="tip_comment2" style="color:Red"></div> <p> [Ctrl+Enter快捷键提交] </p> <div style="display:none"> <span id="comment_edit_id"></span><span id="span_parentcomment_id"></span> <span id="span_parent_id"></span> <span id="span_comment_replyto"></span> <span id="span_comment_posted"></span> </div> </div> <div class="ad_text_commentbox" id="ad_text_under_commentbox"></div> <div id="ad_t2"><a href="http://www.ucancode.com/index.htm" target="_blank" onclick="ga('send', 'event', 'Link', 'click', 'T2-工控')">【推荐】超50万C++/C#源码: 大型实时仿真组态图形源码</a><br><a href="https://ke.qq.com/adActivity.html?name=xiangxueketang2" target="_blank" onclick="ga('send', 'event', 'Link', 'click', 'T2-享学')">【培训】IT职业生涯指南,Java程序员薪资翻3倍的秘密</a><br><a href="https://group.cnblogs.com/topic/81213.html" target="_blank" onclick="ga('send', 'event', 'Link', 'click', 'T2-咕泡')">【培训】工作996,生病ICU,程序员不加班就没前途吗?</a><br><a href="https://gitee.com/enterprises?from=bky-2" target="_blank" onclick="ga('send', 'event', 'Link', 'click', 'T2-gitee')">【推荐】专业便捷的企业级代码托管服务 - Gitee 码云</a><br></div> <div id="opt_under_post"></div> <script async="async" src="https://www.googletagservices.com/tag/js/gpt.js"></script> <script> var googletag = googletag || {}; googletag.cmd = googletag.cmd || []; </script> <script> googletag.cmd.push(function() { googletag.defineSlot('/1090369/C1', [300, 250], 'div-gpt-ad-1546353474406-0').addService(googletag.pubads()); googletag.defineSlot('/1090369/C2', [468, 60], 'div-gpt-ad-1539008685004-0').addService(googletag.pubads()); googletag.pubads().enableSingleRequest(); googletag.enableServices(); }); </script> <div id="cnblogs_c1" class="c_ad_block" style=""> <div id="div-gpt-ad-1546353474406-0" style="height: 250px; width: 300px;"><div id="google_ads_iframe_/1090369/C1_0__container__" style="border: 0pt none; width: 300px; height: 250px;"></div></div> </div> <div id="under_post_news"></div> <div id="cnblogs_c2" class="c_ad_block" style=""> <div id="div-gpt-ad-1539008685004-0" style="height: 60px; width: 468px;"><div id="google_ads_iframe_/1090369/C2_0__container__" style="border: 0pt none; width: 468px; height: 60px;"></div></div> </div> <div id="under_post_kb"></div> <div id="HistoryToday" class="c_ad_block"></div> <script type="text/javascript"> if(enablePostBottom()) { codeHighlight(); fixPostBody(); setTimeout(function () { incrementViewCount(cb_entryId); }, 50); deliverT2(); deliverC1(); deliverC2(); loadNewsAndKb(); loadBlogSignature(); LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid); GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType); loadOptUnderPost(); GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate); } </script> </div> </div><!--end: forFlow --> </div><!--end: mainContent 主体内容容器--> <div id="sideBar"> <div id="sideBarMain"> <!--done--> <div class="newsItem"> <h3 class="catListTitle">公告</h3> <div id="blog-news"><!-- 添加公告栏时钟 --> <div style="border-top: 1px dashed #ccc;padding: 5px;border-bottom: 1px dashed #ccc;height: 120px;"> <div id="clockdiv"> <canvas id="dom" width="120" height="120">时钟canvas</canvas> </div> </div> <script type="text/javascript">window['__document_write_ajax_callbacks__']['4']();</script><script type="text/javascript">window['__document_write_ajax_callbacks__']['5']();</script><script type="text/javascript">window['__document_write_ajax_callbacks__']['1']();</script> <script type="text/javascript">window['__document_write_ajax_callbacks__']['6']();</script><script type="text/javascript">window['__document_write_ajax_callbacks__']['2']();</script><div id="profile_block">昵称:<a href="https://home.cnblogs.com/u/Dominic-Ji/">元少~</a><br>园龄:<a href="https://home.cnblogs.com/u/Dominic-Ji/" title="入园时间:2018-03-04">1年1个月</a><br>粉丝:<a href="https://home.cnblogs.com/u/Dominic-Ji/followers/">47</a><br>关注:<a href="https://home.cnblogs.com/u/Dominic-Ji/followees/">4</a><div id="p_b_follow"><a href="javascript:void(0);" onclick="follow('f76404ce-3d14-4c88-9e28-08d5782f1af4')">+加关注</a></div><script type="text/javascript">window['__document_write_ajax_callbacks__']['7']();</script><script>window['__document_write_ajax_callbacks__']['3']();</script></div></div><script type="text/javascript">loadBlogNews();</script> </div> <div id="blog-calendar" style="display: block;"><table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="Calendar"> <tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0"> <tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar('2019/03/01');return false;"><</a></td><td align="center">2019年4月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar('2019/05/01');return false;">></a></td></tr> </tbody></table></td></tr><tr><th class="CalDayHeader" align="center" abbr="日" scope="col">日</th><th class="CalDayHeader" align="center" abbr="一" scope="col">一</th><th class="CalDayHeader" align="center" abbr="二" scope="col">二</th><th class="CalDayHeader" align="center" abbr="三" scope="col">三</th><th class="CalDayHeader" align="center" abbr="四" scope="col">四</th><th class="CalDayHeader" align="center" abbr="五" scope="col">五</th><th class="CalDayHeader" align="center" abbr="六" scope="col">六</th></tr><tr><td class="CalOtherMonthDay" align="center">31</td><td align="center">1</td><td align="center">2</td><td align="center">3</td><td align="center">4</td><td align="center">5</td><td class="CalWeekendDay" align="center">6</td></tr><tr><td class="CalWeekendDay" align="center">7</td><td align="center">8</td><td align="center">9</td><td align="center">10</td><td align="center">11</td><td align="center">12</td><td class="CalWeekendDay" align="center">13</td></tr><tr><td class="CalWeekendDay" align="center">14</td><td align="center">15</td><td align="center"><a href="https://www.cnblogs.com/Dominic-Ji/archive/2019/04/16.html"><u>16</u></a></td><td align="center">17</td><td align="center">18</td><td align="center">19</td><td class="CalWeekendDay" align="center">20</td></tr><tr><td class="CalWeekendDay" align="center"><a href="https://www.cnblogs.com/Dominic-Ji/archive/2019/04/21.html"><u>21</u></a></td><td class="CalTodayDay" align="center">22</td><td align="center">23</td><td align="center">24</td><td align="center">25</td><td align="center">26</td><td class="CalWeekendDay" align="center">27</td></tr><tr><td class="CalWeekendDay" align="center">28</td><td align="center">29</td><td align="center">30</td><td class="CalOtherMonthDay" align="center">1</td><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td></tr><tr><td class="CalOtherMonthDay" align="center">5</td><td class="CalOtherMonthDay" align="center">6</td><td class="CalOtherMonthDay" align="center">7</td><td class="CalOtherMonthDay" align="center">8</td><td class="CalOtherMonthDay" align="center">9</td><td class="CalOtherMonthDay" align="center">10</td><td class="CalOtherMonthDay" align="center">11</td></tr> </tbody></table></div><script type="text/javascript">loadBlogDefaultCalendar();</script> <div id="leftcontentcontainer"> <div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block"> <div id="sidebar_search" class="mySearch"> <h3 class="catListTitle">搜索</h3> <div id="sidebar_search_box"> <div id="widget_my_zzk" class="div_my_zzk"><input type="text" id="q" onkeydown="return zzk_go_enter(event);" class="input_my_zzk"> <input onclick="zzk_go()" type="button" value="找找看" id="btnZzk" class="btn_my_zzk"></div> <div id="widget_my_google" class="div_my_zzk"><input type="text" name="google_q" id="google_q" onkeydown="return google_go_enter(event)" class="input_my_zzk"> <input onclick="google_go()" type="button" value="谷歌搜索" class="btn_my_zzk"></div> </div> </div> </div><div id="sidebar_shortcut" class="sidebar-block"> <div class="catListLink"> <h3 class="catListTitle">常用链接</h3> <ul> <li><a href="https://www.cnblogs.com/Dominic-Ji/p/" title="我的博客的随笔列表">我的随笔</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/MyComments.html" title="我发表过的评论列表">我的评论</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/OtherPosts.html" title="我评论过的随笔列表">我的参与</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/RecentComments.html" title="我的博客的评论列表">最新评论</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/tag/" title="我的博客的标签列表">我的标签</a></li> </ul> <div id="itemListLin_con" style="display:none;"> <ul> </ul> </div> </div></div><div id="sidebar_recentposts" class="sidebar-block"> <div class="catListEssay"> <h3 class="catListTitle">最新随笔</h3> <ul> <li><a href="https://www.cnblogs.com/Dominic-Ji/p/10745044.html">1. Django auth认证</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10718365.html">2. Cookie Session和自定义分页</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10520256.html">3. 元少带你看元类</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10504935.html">4. django捡破烂</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10490669.html">5. jQuery快速入门</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10474769.html">6. 前端CSS</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10444379.html">7. Django-admin管理工具</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/10391778.html">8. 自定义分页器</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/9925760.html">9. pyecharts使用</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/9637715.html">10. 爬虫之selenium模块</a></li> </ul> </div> </div><div id="sidebar_toptags" class="sidebar-block"> <div class="catListTag"> <h3 class="catListTitle">我的标签</h3> <ul> <li><a href="https://www.cnblogs.com/Dominic-Ji/tag/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/">计算机基础</a>(1)</li> </ul> </div></div><div id="sidebar_categories"> <div id="sidebar_postcategory" class="catListPostCategory sidebar-block"> <h3 class="catListTitle">随笔分类</h3> <ul> <li><a id="CatList_LinkList_0_Link_0" href="https://www.cnblogs.com/Dominic-Ji/category/1426259.html">CRM</a> </li> <li><a id="CatList_LinkList_0_Link_1" href="https://www.cnblogs.com/Dominic-Ji/category/1234201.html">Django框架(21)</a> </li> <li><a id="CatList_LinkList_0_Link_2" href="https://www.cnblogs.com/Dominic-Ji/category/1282213.html">Flask(1)</a> </li> <li><a id="CatList_LinkList_0_Link_3" href="https://www.cnblogs.com/Dominic-Ji/category/1250079.html">Git</a> </li> <li><a id="CatList_LinkList_0_Link_4" href="https://www.cnblogs.com/Dominic-Ji/category/1271163.html">Linux</a> </li> <li><a id="CatList_LinkList_0_Link_5" href="https://www.cnblogs.com/Dominic-Ji/category/1256845.html">mongoDB(3)</a> </li> <li><a id="CatList_LinkList_0_Link_6" href="https://www.cnblogs.com/Dominic-Ji/category/1254214.html">MySQL(2)</a> </li> <li><a id="CatList_LinkList_0_Link_7" href="https://www.cnblogs.com/Dominic-Ji/category/1183269.html">Python(7)</a> </li> <li><a id="CatList_LinkList_0_Link_8" href="https://www.cnblogs.com/Dominic-Ji/category/1238356.html">redis(3)</a> </li> <li><a id="CatList_LinkList_0_Link_9" href="https://www.cnblogs.com/Dominic-Ji/category/1252121.html">Vue</a> </li> <li><a id="CatList_LinkList_0_Link_10" href="https://www.cnblogs.com/Dominic-Ji/category/1281287.html">量化投资于Python(2)</a> </li> <li><a id="CatList_LinkList_0_Link_11" href="https://www.cnblogs.com/Dominic-Ji/category/1221786.html">前端web(5)</a> </li> <li><a id="CatList_LinkList_0_Link_12" href="https://www.cnblogs.com/Dominic-Ji/category/1284260.html">人工智能相关</a> </li> <li><a id="CatList_LinkList_0_Link_13" href="https://www.cnblogs.com/Dominic-Ji/category/1249452.html">随记(1)</a> </li> </ul> </div> <div id="sidebar_postarchive" class="catListPostArchive sidebar-block"> <h3 class="catListTitle">随笔档案</h3> <ul> <li><a id="CatList_LinkList_1_Link_0" href="https://www.cnblogs.com/Dominic-Ji/archive/2019/04.html">2019年4月 (2)</a> </li> <li><a id="CatList_LinkList_1_Link_1" href="https://www.cnblogs.com/Dominic-Ji/archive/2019/03.html">2019年3月 (4)</a> </li> <li><a id="CatList_LinkList_1_Link_2" href="https://www.cnblogs.com/Dominic-Ji/archive/2019/02.html">2019年2月 (2)</a> </li> <li><a id="CatList_LinkList_1_Link_3" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/12.html">2018年12月 (1)</a> </li> <li><a id="CatList_LinkList_1_Link_4" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/11.html">2018年11月 (2)</a> </li> <li><a id="CatList_LinkList_1_Link_5" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/09.html">2018年9月 (4)</a> </li> <li><a id="CatList_LinkList_1_Link_6" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/08.html">2018年8月 (10)</a> </li> <li><a id="CatList_LinkList_1_Link_7" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/07.html">2018年7月 (6)</a> </li> <li><a id="CatList_LinkList_1_Link_8" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/06.html">2018年6月 (18)</a> </li> <li><a id="CatList_LinkList_1_Link_9" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/05.html">2018年5月 (2)</a> </li> <li><a id="CatList_LinkList_1_Link_10" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/04.html">2018年4月 (3)</a> </li> <li><a id="CatList_LinkList_1_Link_11" href="https://www.cnblogs.com/Dominic-Ji/archive/2018/03.html">2018年3月 (1)</a> </li> </ul> </div> </div><div id="sidebar_topviewedposts" class="sidebar-block"><div id="topview_posts_wrap"> <div class="catListView"> <h3 class="catListTitle">阅读排行榜</h3> <div id="TopViewPostsBlock"><ul><li><a href="https://www.cnblogs.com/Dominic-Ji/p/8931121.html">1. 如何创建进程及进程的特性(944)</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/9008035.html">2. 数据库之基本数据类型(388)</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/8968384.html">3. 异步调用与回调机制,协程(385)</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/9203990.html">4. Django ORM中常用字段和参数(372)</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/8607480.html">5. 字符串,列表主要内置方法详解(338)</a></li></ul></div> </div> </div></div><div id="sidebar_topcommentedposts" class="sidebar-block"><div id="topfeedback_posts_wrap"> <div class="catListFeedback"> <h3 class="catListTitle">评论排行榜</h3> <div id="TopFeedbackPostsBlock"><ul><li><a href="https://www.cnblogs.com/Dominic-Ji/p/9167438.html">1. Django简介(2)</a></li><li><a href="https://www.cnblogs.com/Dominic-Ji/p/9550525.html">2. 爬虫之Scrapy框架(1)</a></li></ul></div> </div> </div></div><div id="sidebar_topdiggedposts" class="sidebar-block"><div id="topdigg_posts_wrap"> <div class="catListView"> <h3 class="catListTitle">推荐排行榜</h3> <div id="TopDiggPostsBlock"><ul><li><a href="https://www.cnblogs.com/Dominic-Ji/p/8968384.html">1. 异步调用与回调机制,协程(1)</a></li></ul></div> </div></div></div></div><script type="text/javascript">loadBlogSideColumn();</script> </div> </div><!--end: sideBarMain --> </div><!--end: sideBar 侧边栏容器 --> <div class="clear"></div> </div><!--end: main --> <div class="clear"></div> <div id="footer"> <!--done--> Copyright ©2019 元少~ </div><!--end: footer --> </div><!--end: home 自定义的最大容器 --> <!--PageEndHtml Block Begin--> <script src="https://files.cnblogs.com/files/hafiz/jquery-migrate-1.2.1.js"></script> <script src="https://files.cnblogs.com/files/miangao/bootstrap.min.js"></script> <script type="text/javascript"> $(function(){ $('#blogTitle h1').addClass('bounceInLeft animated'); $('#blogTitle h2').addClass('bounceInRight animated'); // 删除反对按钮 $('.buryit').remove(); initCommentData(); }); function initCommentData() { $('.feedbackItem').each(function() { var text = $(this).find('.feedbackListSubtitle .layer').text(); // 将楼层信息放到data里面 // $(this).find('.blog_comment_body').attr('data-louceng', text.replace(/^#/g, '')); if($(this).find('.feedbackListSubtitle .louzhu').length>0) $(this).addClass('myself'); var avatar = $(this).find('> .feedbackCon > span').html() || 'http://pic.cnitblog.com/face/sample_face.gif'; $(this).find('> .feedbackCon > .blog_comment_body').append('<img class="user-avatar" src="'+avatar+'"/>') }); } $(document).ajaxComplete(function(event, xhr, settings) { // 监听获取评论ajax事件 if(settings.url.indexOf('/mvc/blog/GetComments.aspx') >= 0) { initCommentData(); } }); </script> <div id="scrollTop" style="display:none;"> <div class="level-2"></div> <div class="level-3"></div> </div> <script src="https://files.cnblogs.com/files/hafiz/scroll2top.js"></script> <script type="text/javascript"> UI.global_search(); var uvOptions = {}; // !important (function() { initScrollTop(); })(); </script> <!--PageEndHtml Block End--> <script type="text/javascript"> //以下是锚点JS,自动生成目录 var a = $(document); $(document).ready(function(){ var commentDiv = $("#blog-comments-placeholder"); if (commentDiv.length <= 0) { return; } var b = $('body'), d = 'sideToolbar', e = 'sideCatalog', f = 'sideCatalog-catalog', g = 'sideCatalogBtn', h = 'sideToolbar-up', i = '<div id="sideToolbar"style="display:none;bottom:150px;">\<div class="sideCatalogBg"id="sideCatalog">\<div id="sideCatalog-sidebar">\<div class="sideCatalog-sidebar-top"></div>\<div class="sideCatalog-sidebar-bottom"></div>\</div>\<div id="sideCatalog-catalog">\<ul class="nav"style="width:225px;zoom:1;list-style: none;">\</ul>\</div>\</div>\<a href="javascript:void(0);"id="sideCatalogBtn"class="sideCatalogBtnDisable" style="position:absolute;bottom:10px;"></a>\</div>', j = '', k = 500, l = 0, m = 0, n = 0, //限制存在个数,如数量过多,则只显示h2,不显示h3 //o, p = 13, o, p = 100, q = true, r = true, s = b; if(s.length === 0) { return }; b.append(i); //指定获取目录的范围-------------这一点非常重要,因为每个人指定的范围都不一样,所以这是要修改的地方 //o = s.find(':header'); o = $('#cnblogs_post_body').find(':header'); if(o.length > p) { r = false; var t = s.find('h3'); var u = s.find('h4'); if(t.length + u.length > p) { q = false } }; o.each(function(t) { var u = $(this), v = u[0]; var title = u.text(); var text = u.text(); u.attr('id', 'autoid-' + l + '-' + m + '-' + n) //if (!u.attr('id')) { // u.attr('id', 'autoid-' + l + '-' + m + '-' + n) //}; if(text.length > 12) text = text.substr(0, 12) + "..."; if(v.localName === 'h3') { l++; m = 0; //if(text.length > 12) text = text.substr(0, 12) + "..."; j += '<li><a href="#' + u.attr('id') + '" title="' + title + '">' + text + '</a><span class="sideCatalog-dot" style="top:8px;"></span></li>'; } else if(v.localName === 'h4') { m++; n = 0; if(q) { //if(text.length > 12) text = text.substr(0, 12) + "..."; j += '<li class="h2Offset"><a href="#' + u.attr('id') + '" title="' + title + '">' + text + '</a></li>'; } } else if(v.localName === 'h5') { n++; if(r) { j += '<li class="h3Offset"><a href="#' + u.attr('id') + '" title="' + title + '">' + u.text() + '</a></li>'; } } }); $('#' + f + '>ul').html(j); b.data('spy', 'scroll'); b.data('target', '.sideCatalogBg'); $('body').scrollspy({ target: '.sideCatalogBg' }); $sideCatelog = $('#' + e); $sideToolbar = $('#' + d); $('#sideCatalogBtn').hover(function () { $sideCatelog.css('display', 'block'); }); $sideToolbar.hover(function(){}, function(){ $sideCatelog.css('display', 'none'); }); $('#' + h).on('click', function() { $("html,body").animate({ scrollTop: 0 }, 500) }); a.on('scroll', function() { var t = a.scrollTop(); if(t > k) { $sideToolbar.css('display', 'block'); $('#gotop').show() } else { $sideToolbar.css('display', 'none') $('#gotop').hide() } }) }); //以上是锚点JS </script><div id="sideToolbar" style="display:none;bottom:150px;"><div class="sideCatalogBg" id="sideCatalog"><div id="sideCatalog-sidebar"><div class="sideCatalog-sidebar-top"></div><div class="sideCatalog-sidebar-bottom"></div></div><div id="sideCatalog-catalog"><ul class="nav" style="width:225px;zoom:1;list-style: none;"><li><a href="#autoid-0-0-0" title="Cookie的由来">Cookie的由来</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-1-0-0" title="什么是Cookie">什么是Cookie</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-2-0-0" title="Cookie的原理">Cookie的原理</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-3-0-0" title="查看Cookie">查看Cookie</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-4-0-0" title="获取Cookie">获取Cookie</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-5-0-0" title="设置Cookie">设置Cookie</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-6-0-0" title="删除Cookie">删除Cookie</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-7-0-0" title="Session的由来">Session的由来</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-8-0-0" title="Session流程解析">Session流程解析</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-9-0-0" title="Session版登陆验证">Session版登陆验证</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-10-0-0" title="Django中的Session配置">Django中的Sess...</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-11-0-0" title="CBV中加装饰器相关">CBV中加装饰器相关</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-12-0-0" title="补充">补充</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-13-0-0" title="自定义分页">自定义分页</a><span class="sideCatalog-dot" style="top:8px;"></span></li><li><a href="#autoid-14-0-0" title="Django内置分页">Django内置分页</a><span class="sideCatalog-dot" style="top:8px;"></span></li></ul></div></div><a href="javascript:void(0);" id="sideCatalogBtn" class="sideCatalogBtnDisable" style="position:absolute;bottom:10px;"></a></div><script type="text/javascript">getFollowStatus('f76404ce-3d14-4c88-9e28-08d5782f1af4')</script><div id="qb-sougou-search" style="display: none; opacity: 0;"><p>搜索</p><p class="last-btn">复制</p><iframe src=""></iframe></div></body><div id="cye-workaround-body" style="position: absolute; left: 0px; top: 0px; z-index: -2147483646; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(238, 238, 238); height: 8788px; width: 1314px;"></div><div id="cye-workaround-body-image" style="position: absolute; left: 0px; top: 0px; z-index: -2147483645; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); height: 8788px; width: 1314px;"></div></html>