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
二、响应协议(server 给浏览器的)
上面图片格式:
Response Header
响应首行:
响应头信息:
空行:
响应体:
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/')