zoukankan      html  css  js  c++  java
  • Python学习之路—2018/7/4

    Python学习之路—2018/7/4

    1.Cookie

    简介

    浏览器缓存,是一种key-value结构。浏览器第一次访问服务器的时候cookie为空,服务器会创建一个cookie并响应给浏览器,浏览器会储存cookie,等到下一次访问这个服务器时会将携带的cookie发送给服务器,服务器变可以识别出客户端。

    规范

    • Cookie大小最大为4KB
    • 一个服务器最多在浏览器上保存20个Cookie
    • 一个浏览器最多保存300个Cookie

    注意:

    • 不同浏览器之间不共享Cookie
    • 服务端发送重复的Cookie会覆盖掉原有的Cookie

    语法

    cookie = HttpResponse() 或cookie = render(request, ) 或cookie =  rediret()
    cookie.set_cookie(key, value)
    
    set_cookie(key, value, max_age=xx,  expires=xx, path="/xx")
    """
    key: 键
    value: 值
    max_age: cookie存在的时间,以秒为单位
    expires: cookie失效的具体时间
    path: cookie生效的地址,其余的路径cookie不会被传递
    """
    

    views.py

    from django.shortcuts import render, HttpResponse, redirect
    from .models import UserInfo
    
    
    def login(request):
        if request.method == "GET":
            return render(request, "login.html")
        elif request.method == "POST":
            username = request.POST.get("username")
            pwd = request.POST.get("pwd")
            user = UserInfo.objects.filter(username=username, pwd=pwd).first()
    
            if user:
                cookie = HttpResponse("登陆成功")
                cookie.set_cookie("is_login", True, max_age=10)  # 5s以后cookie失效,刷新index路径时会跳转到登录界面
                cookie.set_cookie("username", user.username,  path='/index')  # cookie中的username只会在index路径存在
                return cookie
            else:
                return redirect("/login/")
    
    
    def index(request):
        is_login = request.COOKIES.get("is_login")
        if is_login:
            username = request.COOKIES.get("username")
            return render(request, "index.html", locals())
        else:
            return redirect("/login/")
    

    cookie失效(10s后)实现效果:

    cookie生效路径(/index)实现效果:

    2.Session

    简介

    是服务端技术,存储在服务端,给每个浏览器创建独立的session对象,存储在django_session表中,用户通过浏览器访问服务器时从各自的session对象中取得数据。

    语法

    设置session request.session["xx"] = xx

    获取session request.session.get("xx")

    删除session del request.session["xx"]

    删除会话 request.session.flush() 主要用于注销用户

    基本流程

    设置session

    1. 生成随机字符串str

    2. response.set_cookie("sessionid", str)

    3. 向django_session表中插入数据:

      session_key session_data expire_date
      随机字符串str {"xxx":xxx, "xxx":xxx ....} xxxx-xx-xx

    获取session

    1. session = request.Cookie.get("session")

    2. 从django_session表中过滤数据

      obj = django_session.object.filter(session_key = session ).first()

    3. 拿到具体的数据

      obj.session_data.get("xxx")

    删除会话(flush)

    1. session = request.Cookie.get("session")
    2. django_session.object.filter(session_key = session ).delete()
    3. request.delete_cookie("sessionid", session)

    Session更新

    当创建session时,第一步会先判断浏览器是否携带的cookie中是否含有session_key,如果有则不更改session_key,覆盖session_data信息(前提是登录的用户不变),如果没有则会添加新的session_key 与session_data,比如A已经登录了谷歌浏览器,下一次再用谷歌浏览器登录时,会携带包含session_key的cookie信息,服务器接受之后不会增加新的session对象,而是找到该浏览器对应的session数据,覆盖修改上一次存储于的session_data,如果A用火狐浏览器登录时服务器则会创建火狐浏览器对应的session数据。

    配置

    settings.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,默认修改之后才保存(默认)
    

    3.用户认证组件

    auth模块

    前提

    首先需要在django自动创建的auth_user表中添加记录

    python manage.py makemigrations
    python manage.py migrate
    python manage.py createsuperuser
    

    基本语法

    authenticate()

    用户认证方法,需要username以及password两个参数(取决于auth_user表中username和password两个字段),当认证信息成功时,会返回一个user对象。

    from django.contrib import auth
    user = auth.authenticate(username=xxx, password=xxx)
    
    login(request, user)

    调用django中的session框架并给认证的用户添加session信息

    views.py

    from django.contrib import auth
    def login(request):
        if request.method == "GET":
            return render(request, "login.html")
        username = request.POST.get("username")
        password = request.POST.get("password")
    
        user = auth.authenticate(username=username, password=password)
        if user:
            auth.login(request, user)  # request.user
            return redirect("/index")
        else:
            return redirect("/login")
        
       def index(request):
        if request.user.username:
            return render(request, "index.html")
        else:
            return redirect("/login")
    

    login.html

    <form action="" method="post">
        {% csrf_token %}
        用户名<input type="text" name="username">
        密码<input type="text" name="password">
        <input type="submit" value="提交">
    </form>
    

    index.html

    <h2>欢迎您,{{ request.user.username }}</h2>
    

    实现效果:

    logout(request)

    清除当前请求的所有session信息

    views.py

    def logout(request):
        auth.logout(request)
        return redirect("/login")
    

    index.html

    <a href="/logout">注销</a>
    

    实现效果:

    User对象

    is_authenticated()

    如果是一个User对象,则会返回True,主要用于验证用户登录

    create_user()

    用于注册创建用户

    from django.contrib.auth.models import User
    
    User.objects.create_user(username=xxx, password=xxx, email=xxx)
    

    check_password()

    用于修改密码,首先获取用户的输入的旧密码,匹配成功后输入新密码并修改

    user = User.objects.get(username = “ ”)
    user.set_password(password = “ ”)
    user.save
    

    login_required()

    装饰器,只有当用户登录的时候才可以访问的地址

    settings.py

    LOGIN_URL = '/login/'  # 当非登录用户访问被装饰器login_required修饰的地址时返回的url
    

    views.py

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def hello(request):
        return HttpResponse("hello world")
    

    实现效果:

  • 相关阅读:
    Go语言操作etcd
    grafana使用
    Java整理
    Go操作MySQL
    Go语言操作Redis
    es
    influxDB
    gopsutil
    Java基础之(三):IDEA的安装及破解 lyl
    ClojureScript 点访问格式
  • 原文地址:https://www.cnblogs.com/ExBurner/p/9265873.html
Copyright © 2011-2022 走看看