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&amp;pvsid=1472209282032525&amp;correlator=1792633286127937&amp;output=json_html&amp;callback=googletag.impl.pubads.callbackProxy1&amp;impl=fifs&amp;json_a=1&amp;eid=21063203&amp;vrg=2019041601&amp;guci=2.2.0.0.2.2.0.0&amp;plat=1%3A32776%2C2%3A32776%2C8%3A32776&amp;sc=1&amp;sfv=1-0-32&amp;iu_parts=1090369%2CC1%2CC2&amp;enc_prev_ius=%2F0%2F1%2C%2F0%2F2&amp;prev_iu_szs=300x250%2C468x60&amp;eri=32&amp;cookie_enabled=1&amp;bc=15&amp;abxe=1&amp;lmt=1555923648&amp;dt=1555923649163&amp;dlt=1555923647383&amp;idt=1758&amp;frm=20&amp;biw=1869&amp;bih=946&amp;oid=3&amp;adxs=0%2C0&amp;adys=0%2C0&amp;adks=912054536%2C450443218&amp;ucis=1%7C2&amp;ifi=1&amp;u_tz=480&amp;u_his=1&amp;u_h=1080&amp;u_w=1920&amp;u_ah=1040&amp;u_aw=1920&amp;u_cd=24&amp;u_nplug=4&amp;u_nmime=6&amp;u_sd=1&amp;flash=27.9.9&amp;url=https%3A%2F%2Fwww.cnblogs.com%2FDominic-Ji%2Fp%2F10718365.html&amp;dssz=30&amp;icsg=3801216&amp;std=0&amp;vis=1&amp;dmc=8&amp;scr_x=0&amp;scr_y=0&amp;psz=0x0%7C0x0&amp;msz=0x-1%7C0x-1&amp;blev=0.81&amp;bisch=1&amp;ga_vid=1185455905.1548659889&amp;ga_sid=1555923649&amp;ga_hid=159493970&amp;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&nbsp; </span>
<span id="stats_article_count">文章 - 1&nbsp; </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 -&gt; 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 &lt;= 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 &gt;= 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 &lt;= 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;">&lt;nav aria-label="Page navigation"&gt;&lt;ul class="pagination"&gt;</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;">&lt;li&gt;&lt;a href="/publisher_list/?page=1"&gt;首页&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="#"&gt;&lt;span aria-hidden="true"&gt;&amp;laquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="/publisher_list/?page={}"&gt;&lt;span aria-hidden="true"&gt;&amp;laquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li class="active"&gt;&lt;a href="/publisher_list/?page={0}"&gt;{0}&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="/publisher_list/?page={0}"&gt;{0}&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="#"&gt;&lt;span aria-hidden="true"&gt;&amp;raquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="/publisher_list/?page={}"&gt;&lt;span aria-hidden="true"&gt;&amp;raquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="/publisher_list/?page={}"&gt;尾页&lt;/a&gt;&lt;/li&gt;</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;">&lt;/ul&gt;&lt;/nav&gt;</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 &lt;= 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 &gt;= 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 &lt;= 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;">&lt;nav aria-label="Page navigation"&gt;&lt;ul class="pagination"&gt;</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;">&lt;li&gt;&lt;a href="{}?page=1"&gt;首页&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="#"&gt;&lt;span aria-hidden="true"&gt;&amp;laquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="{}?page={}"&gt;&lt;span aria-hidden="true"&gt;&amp;laquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li class="active"&gt;&lt;a href="{0}?page={1}"&gt;{1}&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="{0}?page={1}"&gt;{1}&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="#"&gt;&lt;span aria-hidden="true"&gt;&amp;raquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="{}?page={}"&gt;&lt;span aria-hidden="true"&gt;&amp;raquo;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</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;">&lt;li&gt;&lt;a href="{}?page={}"&gt;尾页&lt;/a&gt;&lt;/li&gt;</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;">&lt;/ul&gt;&lt;/nav&gt;</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;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE html</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head </span><span style="color: #ff0000;">lang</span><span style="color: #0000ff;">="en"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">charset</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
    {% for item in posts %}
        </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">li</span><span style="color: #0000ff;">&gt;</span>{{ item }}<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">li</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
    {% endfor %}
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="pagination"</span><span style="color: #0000ff;">&gt;</span>
      <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">span </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="step-links"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
        {% if posts.has_previous %}
            </span><span style="color: #0000ff;">&lt;</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;">&gt;</span>Previous<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
        {% endif %}
          </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">span </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="current"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
            Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
          </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">span</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
          {% if posts.has_next %}
              </span><span style="color: #0000ff;">&lt;</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;">&gt;</span>Next<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">
          {% endif %}
      </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">span</span><span style="color: #0000ff;">&gt;</span>

<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></pre>
</div>
<span class="cnblogs_code_collapse">内置分页HTML部分</span></div>
<p>&nbsp;</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;">&lt;</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;">&gt;</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">&nbsp;<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">&nbsp;<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>
View Code

 

posted @ 2019-04-22 17:05  断剑无重铸  阅读(844)  评论(0编辑  收藏  举报