日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 学习笔记十九 django深入学习四 cookie,session

發布時間:2025/3/15 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]
request.session.set_expiry(value) * 如果value是個整數,session會在些秒數后失效。 * 如果value是個datatime或timedelta,session就會在這個時間后失效。 * 如果value是0,用戶關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全局session失效策略。

實例:

# views
from
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):
#刪除session
del request.session["session_name"]
return redirect('/login/')

注:session默認用的是數據庫,所以需要初始化數據庫。

1.python manage.py makemigrations 2.python manage.py mirate

html

<!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 wrap

cookie操作:

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

from django.contrib.auth.decorators import login_required@login_required def my_view(request):...

實例:

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 Code

urls

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 Code

html

<!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> ajax

jquery代碼:

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 Code

views

def ajax_data(request):print request.POSTreturn HttpResponse('OK') View Code

2、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 Code

views

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。