python 学习笔记十九 django深入学习四 cookie,session
緩存
? 一個(gè)動(dòng)態(tài)網(wǎng)站的基本權(quán)衡點(diǎn)就是,它是動(dòng)態(tài)的。 每次用戶請(qǐng)求一個(gè)頁面,Web服務(wù)器將進(jìn)行所有涵蓋數(shù)據(jù)庫查詢到模版渲染到業(yè)務(wù)邏輯的請(qǐng)求,用來創(chuàng)建瀏覽者需要的頁面。當(dāng)程序訪問量大時(shí),耗時(shí)必然會(huì)更加明顯,這就是需要緩存的地方,緩存一些東西是為了保存那些需要很多計(jì)算資源的結(jié)果,這樣的話就不必在下次重復(fù)消耗計(jì)算資源。
? Django自帶了一個(gè)健壯的緩存系統(tǒng)來讓你保存動(dòng)態(tài)頁面這樣避免對(duì)于每次請(qǐng)求都重新計(jì)算。方便起見,Django提供了不同級(jí)別的緩存粒度:你可以緩存特定視圖的輸出、你可以僅僅緩存那些很難生產(chǎn)出來的部分、或者你可以緩存你的整個(gè)網(wǎng)站。
? Django支持 開發(fā)調(diào)試,內(nèi)存,mysql,Redis、Memecache、文件的方式做緩存,并且可以設(shè)置超時(shí)時(shí)間。
設(shè)置緩存(基于文件)
settings
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 引擎 'LOCATION': os.path.join(BASE_DIR, 'cache'), # cache文件的存放路徑'TIMEOUT': 600, # 緩存超時(shí)時(shí)間(默認(rèn)300,None表示永不過期,0表示立即過期) 'OPTIONS': { 'MAX_ENTRIES': 1000 # 最大緩存?zhèn)€數(shù)(默認(rèn)300) }} }urls
配置如下: from django.conf.urls import url from django.contrib import admin from app01 import views #導(dǎo)入app的views函數(shù) urlpatterns = [url(r'^admin/', admin.site.urls), #設(shè)置當(dāng)用戶訪問ip:端口/time時(shí)候使用這個(gè)函數(shù)url(r'cache/',views.cache_page), ]views
from django.views.decorators.cache import cache_page from django.shortcuts import render,HttpResponse #這里設(shè)置的是 60秒 * 15 ,15分鐘之后 @cache_page(60 * 15) def cache_page(request):current = str(time.time())return HttpResponse(current)cookie 和 session
Cookie 保存于本地 ,session 保存于服務(wù)器;同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),
所以session機(jī)制可能需要借助于cookie機(jī)制來達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上它還有其他選擇。
區(qū)別:
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙
考慮到安全應(yīng)當(dāng)使用session。
3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會(huì)比較占用你服務(wù)器的性能
考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。
4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。
工作流程:
?? 當(dāng)你瀏覽京東或者天貓的時(shí)候,登錄成功以后(一次請(qǐng)求),想查看我的訂單(另一次請(qǐng)求),但是http是短連接(連接一次就斷開),服務(wù)器該如何判斷你是否登錄呢?所以在服務(wù)器端需要有一個(gè)保存用戶狀態(tài)地方(session),客戶端登錄成功后,服務(wù)端向客戶端瀏覽器寫入一段字符串(標(biāo)識(shí)),客戶端每次訪問的時(shí)候需要帶上這個(gè)標(biāo)識(shí),服務(wù)端根據(jù)這個(gè)標(biāo)識(shí)就能獲取客戶端信息了。客戶端保存這個(gè)標(biāo)識(shí)就叫做cookie。
構(gòu)成:
1、自動(dòng)生成一段字符串
2、將字符串發(fā)送到客戶端的瀏覽器(cookie),同時(shí)把這段字符串當(dāng)做key放在session里。(可以理解為session就是一個(gè)字典)
3、在用戶的session對(duì)應(yīng)的value里設(shè)置任意值(字典里面可以繼續(xù)套字典)
session基本操作
- 獲取session:request.session[key]
- 設(shè)置session:reqeust.session[key] = value
- 刪除session:del request.session[key]
實(shí)例:
# viewsfrom django.shortcuts import render,HttpResponseRedirect # Create your views here.def index(request):#從請(qǐng)求里獲取username session#首先判斷存不存在session,如果不存在跳轉(zhuǎn)到login頁面is_login = request.session.get("is_login", False)
if is_login:
# 這里可以根據(jù)登錄的用戶顯示不同的數(shù)據(jù)
# username = request.session.get("username")
# retrun render(request,"xxx.html")
return httpResponse("index")
else:
return redirect("/login/")
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "koka" and password=="123456":
# 設(shè)置sessionrequest.session['is_login'] = True
# 可以設(shè)置多個(gè)值
request.session["username"] = username
return redirect('/index/')
return render(request, "login.html") def logout(request):
#刪除sessiondel request.session["session_name"]
return redirect('/login/')
注:session默認(rèn)用的是數(shù)據(jù)庫,所以需要初始化數(shù)據(jù)庫。
1.python manage.py makemigrations 2.python manage.py miratehtml
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post">{% csrf_token %} 用戶名:<input type="text" name="username"/> 密碼:<input type="password" name="password"/> <input type="submit" value="登錄"/> </form> </body> </html> View Code擴(kuò)展:Session用戶驗(yàn)證
def login(func):def wrap(request, *args, **kwargs):# 如果未登陸,跳轉(zhuǎn)到指定頁面if request.path == '/test/':return redirect('http://www.baidu.com')return func(request, *args, **kwargs)return wrapcookie操作:
1.設(shè)置cookie
1 request.COOKIES['key'] 2 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 3 參數(shù): 4 default: 默認(rèn)值 5 salt: 加密鹽 6 max_age: 后臺(tái)控制過期時(shí)間2.獲取cookie
1 rep = HttpResponse(...) 或 rep = render(request, ...) 2 3 rep.set_cookie(key,value,...) 4 rep.set_signed_cookie(key,value,salt='加密鹽',...) 5 參數(shù): 6 key, 鍵 7 value='', 值 8 max_age=None, 超時(shí)時(shí)間 9 expires=None, 超時(shí)時(shí)間(IE requires expires, so set it if hasn't been already.) 10 path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問 11 domain=None, Cookie生效的域名 12 secure=False, https傳輸 13 httponly=False 只能http協(xié)議傳輸,無法被JavaScript獲取(不是絕對(duì),底層抓包可以獲取到也可以被覆蓋)由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
1 <script src='/static/js/jquery.cookie.js'></script> 2 $.cookie("list_pager_num", 30,{ path: '/' });django 用戶認(rèn)證
使用session或者cookie驗(yàn)證,需要在每一個(gè)views都需要修改源代碼添加驗(yàn)證機(jī)制,我們可以用到裝飾器。django提供了用戶驗(yàn)證的方法和驗(yàn)證用戶登錄的裝飾器。
django提供了authentication,log,logout,login_required的方法:
Authenticating users
from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None:# the password verified for the userif user.is_active:print("User is valid, active and authenticated")else:print("The password is valid, but the account has been disabled!") else:# the authentication system was unable to verify the username and passwordprint("The username and password were incorrect.")login
from django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user is not None:if user.is_active:login(request, user)# Redirect to a success page.else:# Return a 'disabled account' error message ...else:# Return an 'invalid login' error message....logout
from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.login_required
在需要驗(yàn)證登錄的views函數(shù)上添加login_required
實(shí)例:
views
from django.shortcuts import render,HttpResponseRedirect from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login, logout # Create your views here. @login_required def index(request):return render(request, 'index.html')def acc_login(request):if request.method == 'POST':print(request.POST)user = authenticate(username=request.POST.get('username'),password=request.POST.get('password'))if user is not None:# pass authentication login(request, user)return HttpResponseRedirect('/')else:login_err = "Wrong username or password!"return render(request, 'login.html', {'login_err': login_err})return render(request, 'login.html')def acc_logout(request):logout(request)return HttpResponseRedirect('/') View Codeurls
from django.conf.urls import include, url from django.contrib import admin from app01 import views urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^$', views.index),url(r'^accounts/login/$', views.acc_login),url(r'^accounts/logout/$', views.acc_logout), ] View Codehtml
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title></title> </head> <body> <h1> Oldboy CRM</h1>{% block page-container%} Welcome To Oldoby CRM <div> {% if request.user.is_authenticated %} <span>{{ request.user.userprofile.name }}</span> {% else %} <span>登陸/注冊(cè)</span> {% endif %} </div><a href="/accounts/logout/">退出系統(tǒng)</a>{% endblock %} </body> </html> View Code {% extends 'index.html' %} {% block page-container %} <form action="" method="post">{% csrf_token %} Username:<input type="text" name="username"> Password:<input type="password" name="password"> <input type="submit" value="Log me in"> <div>{% if login_err %}<p style="color: red">{{ login_err }}</p>{% endif %} </div> </form>{% endblock %} login參考鏈接:https://docs.djangoproject.com/en/1.9/topics/auth/default/#how-to-log-a-user-out
Ajax
1、單條數(shù)據(jù)提交
html
<form action="/user_list/" method="post"><input type="button" onclick="Ajaxsubmit();" value="提交"/><table><thead><tr><th>主機(jī)名</th><th>端口</th></tr></thead><tbody><tr><td>1.1.1.1</td><td>80000</td></tr><tr><td>1.1.1.1</td><td>80000</td></tr></tbody></table></form><script type="text/javascript" src="/static/jquery-2.2.1.min.js"></script><script>function Ajaxsubmit(){var host = '1.1.1.1';var port = '8000';$.ajax({url:"/ajax_data/",type:'POST',data:{h:host,p:port}, success:function(arg){}})}</script> ajaxjquery代碼:
function Ajaxsubmit(){var host = '192.168.1.100'; var port = '8000';$.ajax({url:"/ajax_data/", #目標(biāo)URLtype:'POST', #請(qǐng)求方式data:{h:host,p:port},success:function(arg){console.log(arg)}
})
}
urls
url(r'^ajax_data/', views.ajax_data), View Codeviews
def ajax_data(request):print request.POSTreturn HttpResponse('OK') View Code2、ajax多條數(shù)據(jù)提交
在原來的基礎(chǔ)上修改Jquery,jquery代碼:
<script>function Ajaxsubmit(){var array_users = [{'username':'koka','arg':18},{'username':'akok','arg':18},{'username':'kako','arg':18},];$.ajax({url:"/ajax_mdata/",type:'POST',# 以原生的模式傳過去tradition: true,
#把數(shù)組json序列化轉(zhuǎn)成字符串
data:{data:JSON.stringify(array_users)},success:function(arg){var callback_dict = $.parseJSON(arg);//json反序列化把字符串轉(zhuǎn)換為對(duì)象
if(callback_dict){
alert('提交成功') }
else{
alert(callback_dict.error)
}}})}</script>
urls
url(r'^ajax_mdata/$', views.ajax_mdata), View Codeviews
import jsondef ajax_data(request):ret = {'status':True,'error':''}try:print request.POSTexcept Exception,e:ret['status'] = Falseret['error'] = str(e)#在上面如果他出錯(cuò)我就把他ret[status] = Falsereturn HttpResponse(json.dumps(ret)) View Code更多內(nèi)容見:
??? http://www.cnblogs.com/wupeiqi/articles/5246483.html
??? http://www.cnblogs.com/luotianshuai/p/5278175.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/koka24/p/5496225.html
總結(jié)
以上是生活随笔為你收集整理的python 学习笔记十九 django深入学习四 cookie,session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一次完整的HTTP事务是怎样一个过程
- 下一篇: Python Day8