django session, 分页,数据库学习
生活随笔
收集整理的這篇文章主要介紹了
django session, 分页,数据库学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、http請求周期
瀏覽器(socket客戶端):2.socket.connect(ip,端口)3.socket.send("規則:?http協議GET請求:"GET??/index.html?k1=1&k2=2??Http/1.1\r\nhost:www.xiaohuar.com\r\ncontent-type:?application/json\r\n\r\n"請求頭和請求體使用\r\n\r\n分割,?前面是請求頭,后面是請求提POST請求:"POST??/index.html?k1=1&k2=2??Http/1.1\r\nhost:www.xiaohuar.com\r\ncontent-type:?application/json\r\n\r\nusername=alex&pwd=123"請求頭和請求體使用\r\n\r\n分割,前面是請求頭,后面是請求體6.獲取響應響應頭,響應體?=?data.split('\r\n\r\n')7.斷開連接web端:1.服務端運行:?ip,端口4.字符串?=?server.recv()頭,體?=?data.split("\r\n\r\n")5.服務端響應.conn.send('......')響應頭:響應體:7.斷開連接總結:a.Http請求中本質都是字符串b.Http請求短鏈接(請求,響應斷開連接)c.請求和響應都有:?頭、體請求:請求頭\r\n\r\n請求體響應:響應頭\r\n\r\n響應體<html>....</html>二、django框架Django本質:socket(wsgiref)解析和封裝http請求(*)視圖函數:def?index(request):request.GETrequest.body?#獲取原生的請求體request.POST?#如果請求頭中:?content-type:?urlencode-form...才將request.body轉化成字典可能有值,可能沒值request.methodrequest.Metarequest.GET.get()request.GET.getlist()request.POST.get()request.POST.getlist()return?HttpResponse('字符串/字節')return?render(request,"html路徑",?{})return?redirect('URL')三、cookie和sessioncookie是客戶端瀏覽器請求服務端登錄時,服務端生成的一段鍵值對攜帶在響應頭中,下
次客戶端請求時,服務端會先驗證cookie是否存在,存在則不需要重新登錄,否則要從新登錄session是客戶端登錄服務端時,驗證通過后會隨機生成一段字符串作為key存放在django.session表中,
值是也是一個字典,是程序設定的一些用戶信息,同時響應頭會攜帶這個key返回給客戶端,這樣會更加
安全。session認證登錄退出流程:
def?auth(func):def?inner(request,*args,**kwargs):ck?=?request.session.get('uuuuuuuu')if?not?ck:return?redirect('/login.html')return?func(request,?*args,?**kwargs)return?inner@auth
def?index(request):user?=?request.session.get('uuuuuuuu')return?render(request,'index.html',{'user':?user})def?login(request):if?request.method?==?"GET":return?render(request,'login.html')else:user?=?request.POST.get('user')pwd?=?request.POST.get('pwd')pwd?=?encrypt(pwd)obj?=?models.userInfo.objects.filter(username=user,password=pwd).first()if?obj:request.session['uuuuuuuu']?=?user?#存放在django.session中這個用戶key對應的字典值中request.session.set_expiry(5)return?redirect('/index.html')else:return?render(request,'login.html',{'msg':'用戶名或密碼錯誤'})def?logout(request):request.session.clear()return?redirect('/login.html')session有關配置(settings.py配置文件)
#?SESSION_ENGINE?=?'django.contrib.sessions.backends.db'??#?引擎(默認)
#
#?SESSION_COOKIE_NAME?=?"sessionid"??#?Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
#?SESSION_COOKIE_PATH?=?"/"??#?Session的cookie保存的路徑(默認)
#?SESSION_COOKIE_DOMAIN?=?None??#?Session的cookie保存的域名(默認)
#?SESSION_COOKIE_SECURE?=?False??#?是否Https傳輸cookie(默認)
#?SESSION_COOKIE_HTTPONLY?=?True??#?是否Session的cookie只支持http傳輸(默認)
#?SESSION_COOKIE_AGE?=?1209600??#?Session的cookie失效日期(2周)(默認)
#?SESSION_EXPIRE_AT_BROWSER_CLOSE?=?False??#?是否關閉瀏覽器使得Session過期(默認)
#?SESSION_SAVE_EVERY_REQUEST?=?True??#?是否每次請求都保存Session,默認修改之后才保存(默認)四、csrf_token跨站請求偽造,post提交數據為避免其他網站通過用戶session信息獲取信息,需要使用{%?csrf_token?%},在ajax提交時,可以使用以下方式:$.ajax({url:"/icbc.html",type:"POST",data:?{'k1':'v1','k2':'v2','csrfmiddlewaretoken':"{{?csrf_token?}}"},success:function(arg){console.log(arg)}})五、分頁urls.py
from?app01?import?views
urlpatterns?=?[url(r'^admin/',?admin.site.urls),url(r'hosts.html$',?views.hosts),
]views.py
from?django.shortcuts?import?render,redirect,HttpResponse
from?app01?import?models
#?Create?your?views?here.
from?utils.pagination?import?Pagedef?hosts(request):current_page?=?int(request.GET.get('page'))all_count?=?models.Host.objects.all().count()page_obj?=?Page(current_page,all_count,request.path_info)host_list?=?models.Host.objects.all()[page_obj.start:page_obj.end]page_str?=?page_obj.page_html()return?render(request,'hosts.html',{'host_list':host_list,'page_str':page_str})models.py????#數據庫自己填充足夠數據測試
from?django.db?import?models#?Create?your?models?here.
class?Host(models.Model):hostname?=?models.CharField(max_length=32)port?=?models.CharField(max_length=10)分頁模塊
pagination.py
class?Page:def?__init__(self,current_page,?all_count,?base_url,per_page=10,?pager_page_count=11):""":param?current_page:?當前頁碼:param?all_count:?總數據條數:param?base_url::param?per_page:?每頁顯示數據條數:param?pager_page_count:?頁面顯示頁碼數"""self.base_url?=?base_urlself.current_page?=?current_pageself.per_page?=?per_pageself.pager_page_count?=?pager_page_countpager_count,?b?=?divmod(all_count,per_page)?#pager_count總頁碼數if?b?!=?0:pager_count?+=?1self.pager_count?=?pager_counthalf_pager_page_count?=?int(pager_page_count?/?2)self.half_pager_page_count?=?half_pager_page_count@propertydef?start(self):"""數據獲取值起始索引:return:"""return?(self.current_page?-?1)?*?self.per_page@propertydef?end(self):"""數據獲取值結束索引:return:"""return?self.current_page?*?self.per_pagedef?page_html(self):"""生成html頁面"""#如果數據總頁碼pager_count<11?pager_page_countif?self.pager_count?<?self.pager_page_count:pager_start?=?1pager_end?=?self.pager_countelse:#?數據頁碼已經超過11#?判斷:?如果當前頁?<=5?half_pager_page_countif?self.current_page?<=?self.half_pager_page_count:pager_start?=?1pager_end?=?self.pager_page_countelse:#?如果:?當前頁碼+5?>?總頁碼if?(self.current_page?+?self.half_pager_page_count)?>?self.pager_count:pager_end?=?self.pager_countpager_start?=?self.pager_count?-?self.pager_page_count?+?1else:pager_start?=?self.current_page?-?self.half_pager_page_countpager_end?=?self.current_page?+?self.half_pager_page_countpage_list?=?[]if?self.current_page?<=?1:prev?=?'<a?href="#">上一頁</a>'else:prev?=?'<a?href="%s?page=%s">上一頁</a>'?%?(self.base_url,self.current_page-1,)page_list.append(prev)for?i?in?range(pager_start,?pager_end?+?1):if?self.current_page?==?i:tpl?=?'<a?class="active"?href="%s?page=%s">%s</a>'?%?(self.base_url,?i,?i,)else:tpl?=?'<a?href="%s?page=%s">%s</a>'?%?(self.base_url,i,i,)page_list.append(tpl)if?self.current_page?>=?self.pager_count:nex?=?'<a?href="#">下一頁</a>'else:nex?=?'<a?href="%s?page=%s">下一頁</a>'?%?(self.base_url,self.current_page+1,)page_list.append(nex)page_str?=?"".join(page_list)return?page_str測試頁面hosts.html
<!DOCTYPE?html>
<html?lang="en">
<head><meta?charset="UTF-8"><title>Title</title><style>.pagination1?a{display:?inline-block;padding:?5px?8px;background-color:?darkslateblue;margin:?5px;color:?white;}.pagination1?a.active{background-color:?green;}</style>
</head>
<body><h1>主機列表</h1><table?border="1"><thread><tr><th>ID</th><th>主機名</th><th>端口</th></tr></thread><tbody>{%?for?row?in?host_list?%}<tr><td>{{?row.id?}}</td><td>{{?row.hostname?}}</td><td>{{?row.port?}}</td></tr>{%?endfor?%}</tbody></table><div?class="pagination1">{{?page_str|safe?}}</div>
</body>
</html>
轉載于:https://blog.51cto.com/haoyonghui/1962423
總結
以上是生活随笔為你收集整理的django session, 分页,数据库学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEO--提高权重
- 下一篇: 物联网与应用数字战略