django 使用session

django 使用session_第1张图片
setting.py
在 INSTALLED_APPS 中加入 online。
在 MIDDLEWARE_CLASSES 中注释掉 'django.middleware.csrf.CsrfViewMiddleware'。
设置数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_session',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '',
'PORT': '3306',
}
}
模版路径:
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'test_sessin/online/templates'),
)

urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
import online

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/$', 'online.views.login'),
    url(r'^index/$', 'online.views.index'),
    url(r'^logout/$', 'online.views.logout'),
)

同步数据库:
python manager.py migrate
然后会在数据库中看到表:django_session。

online/views.py
#coding=utf-8
from django.shortcuts import render
from django.shortcuts import render,render_to_response
from django.http import HttpResponse,HttpResponseRedirect
from django import forms


class UserForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()

#用户登录
def login(req):
    if req.method == "POST":
        uf = UserForm(req.POST)
        if uf.is_valid():
            username = uf.cleaned_data['username']
            password = uf.cleaned_data['password']
            #把获取表单的用户名传递给session对象
            req.session['username'] = username
            req.session['password'] = password

            return HttpResponseRedirect('/index/')
    else:
        uf = UserForm()
    return render_to_response('login.html',{'uf':uf})

#登录之后跳转页
def index(req):
    username = req.session.get('username','anybody')
    password = req.session.get('password','')

    return render_to_response('index.html',{'username':username})

#注销动作
def logout(req):
    del req.session['username'] #删除session
    del req.session['password']
    return HttpResponse('logout ok!')


模版:
login.html
{{uf.as_p}}
index.html

welcome {{username}}

logout

运行:
python manger.py runserver 0.0.0.0:8001

访问登录:
django 使用session_第2张图片
登录后,在浏览器的cookies中会有 session id:
django 使用session_第3张图片
在后台数据库的django_session表中可以看到session的记录:
解析 session_data 可以看到登录的用户名/密码
>>> import base64
>>> base64.b64decode('NWY4YmYzYjk3YWJiNzY0YzYxM2NlODVhZDJjZTg3MTc0ZTMyMTg2Mzp7InVzZXJuYW1lIjoidXNlciIsInBhc3N3b3JkIjoicHdkIn0=')
'5f8bf3b97abb764c613ce85ad2ce87174e321863:{"username":"user","password":"pwd"}'

session 是用户登录的用户名/密码 保存在服务器端的数据库中,
而客户端(浏览器)产生的只是一个session id ,
程序通过读取客户端的session id 来查找对应的用户名/密码。

点击 logout
再访问 index:
此时是 anybody,没有登录的用户。因为后台在访问 logout 的时候删除了 session_data中的用户信息
解析 session_data 可以发现用户名/密码已删除
>>> base64.b64decode('YmQ0ZjdkNzc0NGI0YWI2MDRmMTQ4OGM4MzhiZmI5YzUyYWYwNWFmNjp7fQ==')
'bd4f7d7744b4ab604f1488c838bfb9c52af05af6:{}'

你可能感兴趣的:(Django)