• Django会话,用户和注册之session


    鉴于cookie的不安全,django自带的session框架会帮我们搞定这些问题

    你可以用session 框架来存取每个访问者任意数据, 这些数据在服务器端存储,并对cookie的收发进行了抽象。 Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。我们来看下session如何使用

    打开 Sessions功能

    Sessions 功能是通过一个中间件和一个模型(model)来实现的。 要打开sessions功能,需要以下几步操作:

    1 编辑 MIDDLEWARE_CLASSES 配置,确保 MIDDLEWARE_CLASSES 中包含 'django.contrib.sessions.middleware.SessionMiddleware'。

    确认 INSTALLED_APPS 中有 'django.contrib.sessions' 

    2如果项目是用 startproject 来创建的,配置文件中都已经安装了这些东西,除非你自己删除,正常情况下,你无需任何设置就可以使用session功能。

    如果不需要session功能,你可以删除 MIDDLEWARE_CLASSES 设置中的 SessionMiddleware 和 INSTALLED_APPS 设置中的 'django.contrib.sessions' 

    使用session:

    SessionMiddleware 激活后,每个传给视图(view)函数的第一个参数``HttpRequest`` 对象都有一个 session 属性(request.session),这是一个字典型的对象。 你可以象用普通字典一样来用它。我们首先来看下seesion的内置函数用法:

    request.session["k1"]  如果不存在则会报错

    request.session.get["k1"],如果不存在则会报错,为了防止出错可以request.session.get('k1',none)

    request.session['k1'] = 123 设置session值

    request.session.setdefault('k1',123)  存在则不设置

    del request.session['k1']  删除

    request.session.clear()    删除

    所有 键、值、键值对

    request.session.keys()

    request.session.values()

    request.session.items()

    request.session.iterkeys()

    request.session.itervalues()

    request.session.iteritems()

    用户session的随机字符串

    request.session.session_key

    将所有Session失效日期小于当前日期的数据删除

    request.session.clear_expired()

    检查 用户session的随机字符串 在数据库中是否

    request.session.exists("session_key")

    删除当前用户的所有Session数据

    request.session.delete("session_key")

    request.session.set_expiry(value)

    默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的

    如果value是个整数,session会在些秒数后失效。

    如果value是个datatime或timedelta,session就会在这个时间后失效。

    如果value是0,用户关闭浏览器session就会失效。

    如果value是None,session会依赖全局session失效策略。

    配置setting.py

    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 = False        # 是否每次请求都保存Session,默认修改之后才保存(默认)

    实例:

    我们来看一个session的测试例子。

    在下面的这个测试函数中,首先判断session中是否有count这个值,如果没有则设置初始值为1,如果存在则自动加1并在网页上呈现出counter的值

    def test_with_session(request):
        if 'count' in request.session:
            request.session['count']+=1
            return HttpResponse('new count=%s' % request.session['count'])
        else:
            request.session['count']=1
            return HttpResponse('not count set in session. Setting to 1')
     
    初次访问的时候,显示not count set in session。 Setting to 1

    继续访问,count被设置为2

    每次刷新count值都在自动增加

    于此同时,我们来查看下浏览器上的cookie值。我们只找到了一个sessionid,确没有找到count值。而只找到一个sessionid值。前面我们在介绍session的时候提到过。Cookies只存储数据的哈希会话ID,而不是数据本身。这个sessionid就是哈希会话ID。通过这个sessionid我们就可以找到后端对应的count值。

    那么这个sessionid是保存在哪里的呢。这个值也保存在后端的数据库中也就是db.sqlite3这个数据库文件中。我们有两种方法可以访问。

    第一种:

    在views.py中直接获取session数据库的数据,这里的pk值就是我们在浏览器中获取到的pk值。通过这个我们来找到

    from django.contrib.sessions.models import Session
    def get_session(request):
       session=Session.objects.get(pk='gk613ezlc3chfimzg4fu9ofdqrbki3b7')
        print session.session_data
        print session.get_decoded()
    print sess.expire_date
        return HttpResponse()

    得到如下的结果:

    MDJkYjUwYzE0YmRmZDMzZTg4MGU0Yjg1MWIzYjA3ZTdiNjc5ZTI1Mjp7InVzZXJuYW1lIjoiemhmIiwiY291bnQiOjQsIl9hdXRoX3VzZXJfaGFzaCI6ImE5Y2IxZmM1MjlmYjU2Zjg1MWY5MWY3YjE0MGYwYmRhNzU2YjE2NzkiLCJfYXV0aF91c2VyX2lkIjoiMSIsIl9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2VuZHMuTW9kZWxCYWNrZW5kIn0=

    {u'count':4}

    2018-02-03 06:45:29.158000+00:00

    get_decoded() 来读取实际的session数据。 这是必需的,因为字典存储为一种特定的编码格式

    expire_date是session失效的日期。

    第二种方式:

    直接查询db.sqlite3数据库

    首先要在命令行中使用sqlite3命令,必须先下载如下的文件。这个在sqlite3的官网中可以去下载。并将存储这些文件的路径加入到path属性中去

    使用命令行进入

    D:django_test2>sqlite3 db.sqlite3

    SQLite version 3.21.0 2017-10-24 18:55:49

    Enter ".help" for usage hints.

    查看里面的表,django_session就是存储对应的session表

    sqlite> .table

    auth_group                  django_content_type

    auth_group_permissions      django_migrations

    auth_permission             django_session

    auth_user                   site_prj_author

    auth_user_groups            site_prj_book

    auth_user_user_permissions  site_prj_book_authors

    django_admin_log            site_prj_publisher

    使用命令select * from django_session查看数据。最下面的这个就是我们对应的session值

    第一个实例介绍了session的基本用法,下面我们来看第二个实例,一个简单的登录网站:

    首先在views.py中定义如下函数

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

    登录函数

    def login(request):
        if request.method == "POST":
            uf = UserForm(request.POST)
            if uf.is_valid():
                username = uf.cleaned_data['username']
                request.session['username'] = username
                return HttpResponseRedirect('/index/')
        else:
            uf = UserForm()
        return render(request,'login.html',{'uf':uf})

    登录之后的跳转页
    def index(request):
        username = request.session.get('username')
        print username
        return render(request,'index.html',{'username':username})
    注销
    def logout(request):
        del request.session['username'#删除session
       
    return HttpResponse('logout ok!')

    login.html:

    <form method = 'post'>
        {% csrf_token %}
        {{uf.as_p}}
        <input type="submit" value = "ok"/>
    </form>

    Index.html:

    <div>
       <h1>welcome {{username}}</h1>
       <a href="/logout">logout</a>
    </div>

    我们来看登录:

    输入用户名zhf1后跳转到index界面

    此时我们来查看下session表中的值.调用get_session来查看。增加了一个username值

    YjM4NzNkMmQzZjhmZDIxNDA4MGRhOTYzMWZjNDQwYTdlMmYxYzYxNTp7ImNvdW50Ijo1LCJ1c2VybmFtZSI6InpoZjEiLCJfYXV0aF91c2VyX2hhc2giOiJhOWNiMWZjNTI5ZmI1NmY4NTFmOTFmN2IxNDBmMGJkYTc1NmIxNjc5IiwiX2F1dGhfdXNlcl9pZCI6IjEiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCJ9

    {u'count': 5, u'username': u'zhf1'}

    在index.html中点击logout

    此时我们再来查询session的值。此时username已经不存在

    MjA2ZmFiNmY2NTk1NzdlODU3YmVjZTdhMTBiMGEwMjNjNWZiZjhjNjp7ImNvdW50Ijo1LCJfYXV0aF91c2VyX2hhc2giOiJhOWNiMWZjNTI5ZmI1NmY4NTFmOTFmN2IxNDBmMGJkYTc1NmIxNjc5IiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2lkIjoiMSJ9

    {u'count': 5}

    再次访问index页面,会看到welcome None

    
    
  • 相关阅读:
    Tomcat虚拟主机配置
    JSP执行过程
    JDK环境变量配置贺Tomcat环境搭建
    有限域上的运算
    希尔密码(Hill Cipher)的实现
    高精度运算
    统计文本中的单词数的简单脚本
    soj1166. Computer Transformat(dp + 大数相加)
    [转].Python中sorted函数的用法
    soj1564. HOUSING
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8320899.html
Copyright © 2020-2023  润新知