cookie session

Posted saoqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie session相关的知识,希望对你有一定的参考价值。

今日内容

  1. 装饰器要加入functools.wrap装饰

  2. orm字段中的verbose_name

  3. 路由系统中记得加入终止符 $

  4. 用户名和密码检测

  5. 模板查找顺序

  6. cookie

    通过js设置cookie

    path的作用

  7. session

  8. Http协议

  9. django请求生命周期

functools

增加@functools.wraps(f), 可以保持当前装饰器去装饰的函数的 name 的值不变

由此函数使用装饰器时,函数的函数名即 __name__已经被装饰器改变.

一般定义装饰器的话可以不用考虑这点,但是如果多个函数被两个装饰器装饰时就报错,因为两个函数名一样,第二个函数再去装饰的话就报错.

解决方案就是引入 functools.wraps ,

import functools

def wrapper(f):
    @functools.wraps(f)
    def inner(*args,**kwargs):

        ret = f(*args,**kwargs)
        return ret
    return inner

'''
index=wrapper(index)
'''
@wrapper
def index(a1,a2):
    return a1+a2

index(1,2)

print(index.__name__) #函数名
print(index.__doc__)#查看函数的注释'''这个是注释'''

什么是HTTP协议?

请求头之间 分割

请求头与请求体

请求体之间

超文本传输协议 
关于连接:一次请求一次响应之后断开连接(无状态、短连接) 
关于格式: 
    请求:请求头+请求体 (http:www.baidu.com/index/? a=123) send("GET /index/?a=123 http1.1
host:www.baidu.com
user- agent:Chrome

")
end("GET /index/?a=123 http1.1
host:www.baidu.com
user- agent:Chrome

")
send("POST /index/ http1.1
host:www.baidu.com
user- agent:Chrome

username=alex&pwd=123") 
    响应:响应头+响应体 Content-Encoding: gzip
Cache-Control: private

网页看到的html内容 
    扩展:常见的请求头都有哪些?
    - user-agent:用什么浏览器访问的网站。
    - content-type: 请求体的数据格式是什么?(服务端按照 格式要求进行解析) 
    扩展:常见的请求方式?
    - GET - POST

django请求生命周期

文字描述

用户输入www.baidu.com 先wsgi协议(外部服务网关接口 实现这个协议的有两个wsgiref[本地测试用] uwsgi.[性能高]) 本质是socket 后面才是django

先到路由系统(路由匹配) 在到视图函数(执行逻辑 两步先通过orm 数据库取值 然后给模板渲染) 最后通过wsji返回给用户

技术图片

案例:博客系统

第一步用户输入login进入登录页面

配置数据库

settings配置文件中
自己先在数据库中创建库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cs',
        'USER':'root',
        'PASSWORD':'123',
        'HOST':'127.0.0.1',
        'PORT':3306,
    }
}
2 项目文件夹下的init文件中写上下面内容,用pymysql替换mysqldb
import pymysql
pymysql.install_as_MySQLdb()


settings配置文件中将 USE_TZ 的值改为 False
    # USE_TZ = True
    USE_TZ = False  # 告诉mysql存储时间时按照当地时间来寸,不要用utc时间
使用pycharm的数据库客户端的时候,时区问题要注意

键表
class UserInfo(models.Model):
    """
    用户表
    """
    username = models.CharField(verbose_name='用户名',max_length=32)
    password = models.CharField(verbose_name='密码',max_length=64)

配置路由系统

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/$', views.login),
    url(r'^index/$', views.index),
]

配置视图

from django.shortcuts import render,redirect
from app01 import models

def login(request):
    """
    用户登录
    :param request:
    :return:
    """
    if request.method == 'GET':
        return render(request, 'login.html')

    # 获取用户提交的用户名和密码
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')

    # 去数据库检查用户名密码是否正确
    # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
    # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
    user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()

    if user_object:
        # 用户登录成功
        request.session['user_name'] = user_object.username
        request.session['user_id'] = user_object.pk
        return redirect('/index/')

    # 用户名或密码输入错误
    return render(request,'login.html',{'error':'用户名或密码错误'})


def auth(func):
    def inner(request,*args,**kwargs):
        name = request.session.get('user_name')
        if not name:
            return redirect('/login/')

        return func(request,*args,**kwargs)
    return inner

@auth
def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    return render(request,'index.html')

配置模板

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div style="width: 500px;margin: 0 auto;border: 1px solid #dddddd;">
    <form class="form-horizontal" method="post">

        <div class="form-group">
            <label class="col-sm-2 control-label">用户名</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" placeholder="请输入用户名" name="user">
            </div>
        </div>
        <div class="form-group">
            <label class="col-sm-2 control-label">密码</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" placeholder="请输入密码" name="pwd">
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-default">提 交</button>
                <span style="color: red;">{{ error }}</span>
            </div>
        </div>
    </form>
</div>


</body>
</html>
白话版
登录成功向其客户端发送一个令牌 (保存在用户器上的键值对)  用于下次确认身份
# 用户登录成功
        result = redirect('/index/')
        result.set_cookie('xxxxxxxx',user)
        return result
        
用户输入index网址 后台进行判断 
def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    user = request.COOKIES.get('xxxxxxxx')#判断有没这个值
    if not user:
        return redirect('/login/')
    return render(request,'index.html',{'user':user})    
在下面3种情况都可以设置cookie
return HttpResponse('...')
return render('...')
return redirect('...')
# 设置cookie
data = redirect('...')
data.set_cookie()
# 读取cookie
request.COOKIES.get('xx')
return data
必须背会一下三个参数:
key 键, value='' 值, max_age=None 秒 多少秒后失效 path 路径


1.通过js设置cookie
document. cookie = ' k1=wy222 ;path=/ '
$. cookie('k1', 'wy222' ,{path:'/'})
注意: path不同会导致设置不同.
2. path的作用
/,当前网站中所有的URL都能读取到此值.
",只能在当前页面访问的到此数据
/index/ ,只能在/index/xxx的网页中查看.


菜鸟教程
https://www.runoob.com/js/js-cookies.html

技术图片

session

依赖cookie 是一种存储数据的方式,依赖于cookie,
实现本质: 用户向服务端发送请求,服务端做两件事:第一步为此用户开辟一个独立的空间来存放当前用户独有的值.第2步生成随机字符串发给客户端 他保存在游览器中 

在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456 

在空间中取值: 
request.session['x2'] 
request.session.get('x2') 推荐
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.

数据 django默认存在数据库中


装饰器

技术图片

技术图片

cookie和session的区别?

答: 
cookie是存储在客户端浏览器上的键值对,发送请求时浏 览器会自动携带. 

session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).
其本质是:用户向服务端发送请求,服务端做两件事:生成随机字符串;
为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值: 
request.session['x1'] = 123 request.session['x2'] = 456 
在空间中取值: 
request.session['x2'] 
request.session.get('x2') 
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.

django和session相关的配置

SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串

SESSION_COOKIE_DOMAIN = None  #那个域名可以用 读取的到 none代表全部子域名


SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径 /默认所有的

SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输 True只可以读不可以改

SESSION_COOKIE_AGE = 1209600  #单位秒 Session的cookie失效日期(2周)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期

SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认false定时过期时间 如果改为true刷新一次过期时间程序计算

django中的session如何设置过期时间?

SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)

django的session默认存储在数据库,可以放在其他地方吗?

小系统:默认放在数据库即可. 大系统:缓存(redis)

在settings文件  里面加入里面的代码
# 文件
# SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# SESSION_FILE_PATH = '/sssss/'

# 缓存(内存)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SESSION_CACHE_ALIAS = 'default'
#
# CACHES = {
#     'default': {
#         'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
#         'LOCATION': 'unique-snowflake',
#     }
# }


# 缓存(redis)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SESSION_CACHE_ALIAS = 'default'
# CACHES = {
#     "default": {
#         "BACKEND": "django_redis.cache.RedisCache",
#         "LOCATION": "redis://127.0.0.1:6379",
#         "OPTIONS": {
#             "CLIENT_CLASS": "django_redis.client.DefaultClient",
#             "CONNECTION_POOL_KWARGS": {"max_connections": 100}
#             # "PASSWORD": "密码",
#         }
#     }
# }

操作session

# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456 
# 读取 request.session['xx'] request.session.get('xx') 
# 删除 del request.session['xx'] 其实是修改了过期时间
内容总结
1. 装饰器要加入functools.wrap装饰
2. orm字段中的verbose_name
3. 路由系统中记得加入终止符 $
4. 用户名和密码检测
5. 模板查找顺序
request.session.keys() request.session.values() request.session.items() request.session.set_expiry(value) request.session.session_key

通过js设置cookie

document.cookie = 'k1=wy222;path=/'
$.cookie('k1','wy222',{path:'/'})
注意:path不同会导致设置不同.

path的作用

/ , 当前网站中所有的URL都能读取到此值.
"",只能在当前页面访问的到此数据.
/index/ ,只能在/index/xxx 的网页中查看.

以上是关于cookie session的主要内容,如果未能解决你的问题,请参考以下文章

js代码片段: utils/lcoalStorage/cookie

cookie和session的代码实现

c#如何采集需要登录的页面

Cookie和Session的工作流程及区别(附代码案例)

cookie和session

cookie和session