• HTTP 协议 session cookie


    socket 与TCP 协议的关系---socket是对TCP UDP 封装,

    WEB服务是标准的CS模式---BS模式

    import socket
    sock=socket.socket()
    sock.bind(('127.0.0.1',8080))
    sock.listen(5)
    while True:
        conn,addr=sock.accept()
        data=conn.recv(1024)
        print(data.decode('utf-8'))
        
        conn.send(b'Hello yuan')

    cookie:

    因为HTTP协议是无状态的,不保留用户的信息。

    1、一定是因为HTTP是无状态的,所以才有COOKIE

    2、就是一个容器(或字典)可以存放多组键值对,辨别用户身份、进行session跟踪而存储在用户本地端的数据。

    3、当用户浏览带着cookie来访问服务器时,这个时候称为 . cookies

    wps1C7B.tmp

    二、响应协议(server 给浏览器的)

    wps8B36.tmp

    wpsC26D.tmp

    上面图片格式:

    Response Header

    响应首行: 

    响应头信息:

    空行:

    响应体:

    wps5C0D.tmp

    wps8B77.tmp

    http  之referer:

    referer是http请求头中的一个请求报头,用于告知服务器用户的来源页面,主要被用于SEO 统计,例如:在打一个搜索引擎输入关键字,查找的内容并点击进去,这时候就有一个referer是从这个搜索引擎这点击得来,这个连接就可用于SEO的访问量数据, 如图:例如这个就是从baidu 跳转过去,就会有referer,如果是直接从浏览地址输入网址便不会有referer

    三、session cookie 

    cookie :  是保存在客户端浏览器的键值对。 

    由于http 的协议是无状态的,服务器无法从网络连接知道客户的身份,最早由netscape发展的机制就是:  给客户端 发一个通行证,每人一个,这样一来无论谁访问都必须携带自己通行证,服务器就能从通行证确认客户的身份的,这就是cookie的工作原理。

    cookie 实际上是段字符信息, 当客户端一访问服务器,如果服务器要记录用户的状态就会响应客户端浏览器并颁发一个cookie,客户端浏览器将cookie 保存起来,当浏览器再次访问服务器时,客户端浏览器将把该请求的网址连同cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户状态。服务器可以根据需要修改cookie的内容。

    session: 是保存在服务器端的数据(以某种格式存储在服务器)

    Session 是以某种格式存储在服务器的数据,客户端浏览器访问服务器端的时候,服务器把客户信息以某种格式记录在服务器上,当客户端再次访问时只需从该session中查找该用户信息就可以了。

    除了使用cookie,web 应用程序 中还经常使用session来保存客户端的状态,Session是一种记录客户端状态的机制,

    django 中使用session:

    每创建一个django 项目中,在app中的models.py 中创建好表,应用 python manage.py makemigrations    python manage.py migrate.  ,应用后就可以看到有个db.sqlite3 的数据库,或者使用mysql数据库。 数据库中有一个叫django_session 的表,里面存储的就是session 字符 串

    测试:

    1、建表  

    app下的models.py下创建表:

    from django.db import models
    
    # Create your models here.
    
    class UserInfo(models.Model):
        username=models.CharField(max_length=32)
        mail=models.EmailField(max_length=32,verbose_name='邮箱',help_text='33333@qq.com') 

     2、创建URL

    项目下的urls.py 

    from django.conf.urls import url
    from django.contrib import admin
    from practice1 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/',views.test),
        url(r'^login',views.login),
        url(r'^index',views.index),
    ]

    3、app 下的views.py 函数:

    url 对应的处理的view函数 :

    from django.shortcuts import render,HttpResponse,redirect
    from practice1 import models
    
    # Create your views here.
    def test(request):
        v=models.UserInfo.objects.create(username='root',mail='423142@qq.com')
        # return render(request,'test.html',{
        #               'userinfo':{'k1':'v1','k2':'v2','name':'tony'}})
        response=HttpResponse('comntent')
        response.set_cookie('k1','v2')
        response.set_cookie('k2','v3')
        response.set_cookie('k3','v4')
        return response
    
    
    
    
    def login(request):
        if request.method=='GET':
            return render(request,'login.html')
        else:
            #1、生成随机字符串
            #2、通过cookie 发送给客户端
            #3、服务端 保存{随机字符 串1:{‘XXXXX’:df}}
            request.session['username']='tony'
            # 对于随机字符串现在变成{'username':tony,'email':'xxxx'....}
            request.session['email']='tony@qq.com'
    
            u=request.POST.get('user')
            p=request.POST.get('pwd')
            if u=='tony' and p=='123':
                return redirect('/index/')
            else:
                return render(request,'login.html',{'msg':'hel'})
    
    
    def index(request):
        # 1、获取客户端 COOKIE中的随机字符串
        # 2、去SEESION 中查找有没有随机字符串
        # 3、去SESSION中查看对应的KEY 中查看是否有 username
        v=request.session.get('username')
        request.session['k1']=123
        if v:
            print(v)
            return  HttpResponse('login success:%s'%v)
        else:
            return  redirect('/login/')

    4、函数对应的页面:

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/login/" method="POST">
        user:<input type="text" name="user">
        pwd: <input type="text" name="pwd">
    
    
        <input type="submit" value="提交">
    
    
    </form>
    </body>
    </html>

    django中设置session:  settings.py文件中

    SESSION_ENGINE='django.contrib.sessions.backends.db' # 默认将session 存放数据 库 ,可以存放 数据库,文件,内存,cookie, 加密的一个cookie的里面
    
    #推荐使用数据库,,,, 缓存、
    SESSION_COOKIE_SECURE=False #是否https传输cookid (默认)
    SESSION_COOKIE_NAME="gpsd" #设置session 名字
    SESSION_COOKIE_PATH="/" #session 的保存路径
    SESSION_COOKIE_AGE=1209600  #session 的存活时间 1209600为两周
    # SESSION_EXPIRE_AT_BROWSER_CLOSE=False #是否关闭浏览器session 就过期
    # SESSION_SAVE_EVERY_REQUEST=False #是否每次请求都保存session ,默认修改之后才保存
    # # 改成True 每十分钟都操作,session 在30分钟(如果期限为30分钟)的期限内一直都不会过期
    #
    # # 1、
    # #django session还可以存在缓存里
    # SESSION_ENGINE='django.contrib.sessions.backends.cache'
    # SESSION_CACHE_ALIAS='defaults'#使用缓存别名(默认内存缓存,)此处别名依赖缓存的设置
    # #还需要配合django缓存配置
    #
    #
    # # 2、缓存加数据库 ------鸡肋---不用
    #
    # SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

    使用:

    views.py 
    设置cookie
    def test(request):
        # v=models.UserInfo.objects.create(username='root',mail='423142@qq.com')
        # return render(request,'test.html',{
                      # 'userinfo':{'k1':'v1','k2':'v2','name':'tony'}})
        response=HttpResponse('comntent')
        response.set_cookie('k1','v2')
        response.set_cookie('k2','v3')
        response.set_cookie('k3','v4')
        return HttpResponse('abc')

    获取客户端的session id

    def index(request):
        # 1、获取客户端 COOKIE中的随机字符串
        # 2、去SEESION 中查找有没有随机字符串
        # 3、去SESSION中查看对应的KEY 中查看是否有 username
        v=request.session.get('username')
        v1=request.session['username'] #与get 一样,是取值的功能,如果没有 username 就会报错
        request.session.get['k1',None] #如果没有k1 就会只取到None
        request.session.get['k1']=123 # 不管存在不都设置 k1 成123
        request.session.get.setdefault('k1',12)#不存在的时候才设置,存在就不设置了
        del request.session['k1'] #只删除这个session 中的k1 的值,session 中还有其它 k2,k3,k4
    
        #所有的键、值
        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.delete('session_key')#放的是request.session.session_key ,这个随机字符 串
        #被删除掉,这个人的随机字符 串没了,下次就要重要登录了
    
        #检查用户session随机字符串(是否存在数据库中)
        request.session.exist('session_key')#存放的是request.session.session_key . 还是这个随机字符 串
    
        #将失效的session ,也就是小于当前日期的数据删除,因为 数据 库不知道哪些数据该删除 ,而django则会的这个方法会执行这个操作
        request.session.clear_expired()
    
        #这个方法会设置两个地方的值,一个是数据 库,一个是浏览器的 session 的值。比如:在浏览器上有个默认超时时间是两周,这可以设置这个cookiesession的超时时间,值是秒
        request.session.set_expiry(200000)
    
        print(v1,'-----------')
        if v:
            print(v)
            return  HttpResponse('login success:%s'%v)
        else:
            return  redirect('/login/')
  • 相关阅读:
    代理工具
    python-requests简单使用
    Charles使用 请求转发【map remote】 rewrite-body替换 rewrite-modify query param
    charles监控 移动端HTTPS请求
    unittest执行测试用例过程
    JVM工具命令
    JAVA开发小技巧
    命名神器(妈妈再也不用担心我瞎命名了)
    CookieUtil、EncryptUtil(各种加密算法)、HttpUtil
    常见Maven命令
  • 原文地址:https://www.cnblogs.com/tonycloud/p/6867430.html
Copyright © 2020-2023  润新知