python 学习笔记十九 django深入学习四 cookie,session
緩存
? 一個動態網站的基本權衡點就是,它是動態的。 每次用戶請求一個頁面,Web服務器將進行所有涵蓋數據庫查詢到模版渲染到業務邏輯的請求,用來創建瀏覽者需要的頁面。當程序訪問量大時,耗時必然會更加明顯,這就是需要緩存的地方,緩存一些東西是為了保存那些需要很多計算資源的結果,這樣的話就不必在下次重復消耗計算資源。
? Django自帶了一個健壯的緩存系統來讓你保存動態頁面這樣避免對于每次請求都重新計算。方便起見,Django提供了不同級別的緩存粒度:你可以緩存特定視圖的輸出、你可以僅僅緩存那些很難生產出來的部分、或者你可以緩存你的整個網站。
? Django支持 開發調試,內存,mysql,Redis、Memecache、文件的方式做緩存,并且可以設置超時時間。
設置緩存(基于文件)
settings
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 引擎 'LOCATION': os.path.join(BASE_DIR, 'cache'), # cache文件的存放路徑'TIMEOUT': 600, # 緩存超時時間(默認300,None表示永不過期,0表示立即過期) 'OPTIONS': { 'MAX_ENTRIES': 1000 # 最大緩存個數(默認300) }} }urls
配置如下: from django.conf.urls import url from django.contrib import admin from app01 import views #導入app的views函數 urlpatterns = [url(r'^admin/', admin.site.urls), #設置當用戶訪問ip:端口/time時候使用這個函數url(r'cache/',views.cache_page), ]views
from django.views.decorators.cache import cache_page from django.shortcuts import render,HttpResponse #這里設置的是 60秒 * 15 ,15分鐘之后 @cache_page(60 * 15) def cache_page(request):current = str(time.time())return HttpResponse(current)cookie 和 session
Cookie 保存于本地 ,session 保存于服務器;同時我們也看到,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,
所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上它還有其他選擇。
區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
工作流程:
?? 當你瀏覽京東或者天貓的時候,登錄成功以后(一次請求),想查看我的訂單(另一次請求),但是http是短連接(連接一次就斷開),服務器該如何判斷你是否登錄呢?所以在服務器端需要有一個保存用戶狀態地方(session),客戶端登錄成功后,服務端向客戶端瀏覽器寫入一段字符串(標識),客戶端每次訪問的時候需要帶上這個標識,服務端根據這個標識就能獲取客戶端信息了。客戶端保存這個標識就叫做cookie。
構成:
1、自動生成一段字符串
2、將字符串發送到客戶端的瀏覽器(cookie),同時把這段字符串當做key放在session里。(可以理解為session就是一個字典)
3、在用戶的session對應的value里設置任意值(字典里面可以繼續套字典)
session基本操作
- 獲取session:request.session[key]
- 設置session:reqeust.session[key] = value
- 刪除session:del request.session[key]
實例:
# viewsfrom django.shortcuts import render,HttpResponseRedirect # Create your views here.def index(request):#從請求里獲取username session#首先判斷存不存在session,如果不存在跳轉到login頁面is_login = request.session.get("is_login", False)
if is_login:
# 這里可以根據登錄的用戶顯示不同的數據
# 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":
# 設置sessionrequest.session['is_login'] = True
# 可以設置多個值
request.session["username"] = username
return redirect('/index/')
return render(request, "login.html") def logout(request):
#刪除sessiondel request.session["session_name"]
return redirect('/login/')
注:session默認用的是數據庫,所以需要初始化數據庫。
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擴展:Session用戶驗證
def login(func):def wrap(request, *args, **kwargs):# 如果未登陸,跳轉到指定頁面if request.path == '/test/':return redirect('http://www.baidu.com')return func(request, *args, **kwargs)return wrapcookie操作:
1.設置cookie
1 request.COOKIES['key'] 2 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 3 參數: 4 default: 默認值 5 salt: 加密鹽 6 max_age: 后臺控制過期時間2.獲取cookie
1 rep = HttpResponse(...) 或 rep = render(request, ...) 2 3 rep.set_cookie(key,value,...) 4 rep.set_signed_cookie(key,value,salt='加密鹽',...) 5 參數: 6 key, 鍵 7 value='', 值 8 max_age=None, 超時時間 9 expires=None, 超時時間(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協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。
1 <script src='/static/js/jquery.cookie.js'></script> 2 $.cookie("list_pager_num", 30,{ path: '/' });django 用戶認證
使用session或者cookie驗證,需要在每一個views都需要修改源代碼添加驗證機制,我們可以用到裝飾器。django提供了用戶驗證的方法和驗證用戶登錄的裝飾器。
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
在需要驗證登錄的views函數上添加login_required
實例:
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>登陸/注冊</span> {% endif %} </div><a href="/accounts/logout/">退出系統</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、單條數據提交
html
<form action="/user_list/" method="post"><input type="button" onclick="Ajaxsubmit();" value="提交"/><table><thead><tr><th>主機名</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/", #目標URLtype:'POST', #請求方式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多條數據提交
在原來的基礎上修改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,
#把數組json序列化轉成字符串
data:{data:JSON.stringify(array_users)},success:function(arg){var callback_dict = $.parseJSON(arg);//json反序列化把字符串轉換為對象
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)#在上面如果他出錯我就把他ret[status] = Falsereturn HttpResponse(json.dumps(ret)) View Code更多內容見:
??? http://www.cnblogs.com/wupeiqi/articles/5246483.html
??? http://www.cnblogs.com/luotianshuai/p/5278175.html
?
轉載于:https://www.cnblogs.com/koka24/p/5496225.html
總結
以上是生活随笔為你收集整理的python 学习笔记十九 django深入学习四 cookie,session的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一次完整的HTTP事务是怎样一个过程
- 下一篇: Python Day8