HTTP 协议
Posted Cloud-Tony
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 协议相关的知识,希望对你有一定的参考价值。
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/\')
以上是关于HTTP 协议的主要内容,如果未能解决你的问题,请参考以下文章