用仿站软件做的网站seo如何,汕头最好的seo外包,专业网站制作团队,c 做网站 知乎一 会话跟踪 我们需要先了解一下什么是会话#xff01;可以把会话理解为客户端与服务器之间的一次会晤#xff0c;在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话#xff0c;你就是客户端#xff0c;而10086服务人员就是服务器了。从双方接通电话那一刻起可以把会话理解为客户端与服务器之间的一次会晤在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话你就是客户端而10086服务人员就是服务器了。从双方接通电话那一刻起会话就开始了到某一方挂断电话表示会话结束。在通话过程中你会向10086发出多个请求那么这多个请求都在一个会话中。 客户向某一服务器发出第一个请求开始会话就开始了直到客户关闭了浏览器会话结束。 在一个会话的多个请求中共享数据这就是会话跟踪技术。例如在一个会话中的请求如下 请求银行主页 请求登录请求参数是用户名和密码请求转账请求参数与转账相关的数据 请求信誉卡还款请求参数与还款相关的数据。 在这上会话中当前用户信息必须在这个会话中共享的因为登录的是张三那么在转账和还款时一定是相对张三的转账和还款这就说明我们必须在一个会话过程中有共享数据的能力。而web中这种能力的实现就要依靠cookie和session 二 cookie Cookie的由来 大家都知道HTTP协议是无状态的。 无状态的意思是每次请求都是独立的它的执行情况和结果与前面的请求和之后的请求都无直接关系它不会受前面的请求响应情况直接影响也不会直接影响后面的请求响应情况。 一句有意思的话来描述就是人生只如初见对服务器来说每次的请求都是全新的。 状态可以理解为客户端和服务器在某次会话中产生的数据那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。 并且还有一个问题就是你登陆我的网站的时候我没法确定你是不是登陆了之前我们学的django虽然写了很多页面但是用户不用登陆都是可以看所有网页的只要他知道网址就行但是我们为了自己的安全机制我们是不是要做验证啊访问哪一个网址都要验证用户的身份但是还有保证什么呢用户登陆过之后还要保证登陆了的用户不需要再重复登陆就能够访问我网站的其他的网址的页面对不对但是http无状态啊怎么保证这个事情呢此时就要找cookie了。 什么是Cookie 首先来讲cookie是浏览器的技术Cookie具体指的是一段小信息它是服务器发送出来存储在浏 览器上的一组组键值对可以理解为服务端给客户端的一个小甜点下次访问服务器时浏览器会自动携带这些键值对以便服务器提取有用信息。 Cookie的原理 cookie的工作原理是浏览器访问服务端带着一个空的cookie然后由服务器产生内容浏览器收到相应后保存在本地当浏览器再次访问时浏览器会自动带上Cookie这样服务器就能通过Cookie的内容来判断这个是“谁”了。 查看Cookie 我们使用Chrome浏览器打开开发者工具。 cookie图解 Cookie规范 Cookie大小上限为4KB 一个服务器最多在客户端浏览器上保存20个Cookie 一个浏览器最多保存300个Cookie因为一个浏览器可以访问多个服务器。 上面的数据只是HTTP的Cookie规范但在浏览器大战的今天一些浏览器为了打败对手为了展现自己的能力起见可能对Cookie规范“扩展”了一些例如每个Cookie的大小为8KB最多可保存500个Cookie等但也不会出现把你硬盘占满的可能 注意不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时服务器会把Cookie发给IE然后由IE保存起来当你在使用FireFox访问服务器时不可能把IE保存的Cookie发送给服务器。 Cookie与HTTP头 Cookie是通过HTTP请求和响应头在客户端和服务器端传递的 Cookie请求头客户端发送给服务器端 格式Cookie: aA; bB; cC。即多个Cookie用分号离开 Set-Cookie响应头服务器端发送给客户端 一个Cookie对象一个Set-Cookie Set-Cookie: aA Set-Cookie: bB Set-Cookie: cC Cookie的覆盖 如果服务器端发送重复的Cookie那么会覆盖原有的Cookie例如客户端的第一个请求服务器端发送的Cookie是Set-Cookie: aA第二请求服务器端发送的是Set-Cookie: aAA那么客户端只留下一个Cookie即aAA。 三 django中操作cookie Ctrl Shift del三个键来清除页面缓存和cookie将来这个操作你会用的很多。 获取Cookie request.COOKIES[key]
request.get_signed_cookie(key, defaultRAISE_ERROR, salt, max_ageNone) 参数 default: 默认值 salt: 加密盐 max_age: 后台控制过期时间 设置Cookie rep HttpResponse(...)
rep render(request, ...)rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt加密盐, max_ageNone, ...) 参数 key, 键 value, 值 max_ageNone, 超时时间 expiresNone, 超时时间(IE requires expires, so set it if hasnt been already.) path/, Cookie生效的路径/ 表示根路径特殊的根路径的cookie可以被任何url的页面访问 domainNone, Cookie生效的域名 secureFalse, https传输 httponlyFalse 只能http协议传输无法被JavaScript获取不是绝对底层抓包可以获取到也可以被覆盖 set_cookie方法源码 class HttpResponseBase:def set_cookie(self, key, 键value, 值max_ageNone, 超长时间 ,有效事件max_age20意思是这个cookie20秒后就消失了默认时长是2周,这个是以秒为单位的cookie需要延续的时间以秒为单位如果参数是\ None 这个cookie会延续到浏览器关闭为止。expiresNone, 超长时间值是一个datetime类型的时间日期对象到这个日期就失效的意思用的不多expires默认None ,cookie失效的实际日期/时间。 path/, Cookie生效的路径就是访问哪个路径可以得到cookie/是所有路径都能获得cookie浏览器只会把cookie回传给带有该路径的页面这样可以避免将cookie传给站点中的其他的应用。/ 表示根路径特殊的根路径的cookie可以被任何url的页面访问domainNone, Cookie生效的域名你可用这个参数来构造一个跨站cookie。如 domain.example.com所构造的cookie对下面这些站点都是可读的www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None cookie只能由设置它的站点读取。secureFalse, 如果设置为 True 浏览器将通过HTTPS来回传cookie。httponlyFalse 只能http协议传输无法被JavaScript获取不是绝对底层抓包可以获取到也可以被覆盖): pass 删除Cookie def logout(request):rep redirect(/login/)rep.delete_cookie(user) # 删除用户浏览器上之前设置的usercookie值return rep Cookie版登陆校验示例 def check_login(func):wraps(func)def inner(request, *args, **kwargs):next_url request.get_full_path()if request.get_signed_cookie(login, saltSSS, defaultNone) yes:# 已经登录的用户...return func(request, *args, **kwargs)else:# 没有登录的用户跳转刚到登录页面return redirect(/login/?next{}.format(next_url))return innerdef login(request):if request.method POST:username request.POST.get(username)passwd request.POST.get(password)if username xxx and passwd dashabi:next_url request.GET.get(next)if next_url and next_url ! /logout/:response redirect(next_url)else:response redirect(/class_list/)response.set_signed_cookie(login, yes, saltSSS)return responsereturn render(request, login.html) 四 session Session是服务器端技术利用这个技术服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象由于 session为用户浏览器独享所以用户在访问服务器的web资源时 可以把各自的数据放在各自的session中当用户再去访问该服务器中的其它web资源时其它web资源再从用户各自的session中 取出数据为用户服务。 Cookie虽然在一定程度上解决了“保持状态”的需求但是由于Cookie本身最大支持4096字节以及Cookie本身保存在客户端可能被拦截或窃取因此就需要有一种新的东西它能支持更多的字节并且他保存在服务器有较高的安全性。这就是Session。 问题来了基于HTTP协议的无状态特征服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。 我们可以给每个客户端的Cookie分配一个唯一的id这样用户在访问时通过Cookie服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id在服务器上保存一段时间的私密资料如“账号密码”等等。 总结而言Cookie弥补了HTTP无状态的不足让服务器知道来的人是“谁”但是Cookie以文本的形式保存在本地自身安全性较差所以我们就通过Cookie识别不同的用户对应的在Session里保存私密的信息以及超过4096字节的文本。 另外上述所说的Cookie和Session其实是共通性的东西不限于语言和框架。 五 django中操作session Django中Session相关方法 注意这都是django提供的方法其他的框架就需要你自己关于cookie和session的方法了。 # 获取、设置、删除Session中数据#取值
request.session[k1]
request.session.get(k1,None) #request.session这句是帮你从cookie里面将sessionid的值取出来将django-session表里面的对应sessionid的值的那条记录中的session-data字段的数据给你拿出来并解密,get方法就取出k1这个键对应的值#设置值
request.session[k1] 123
request.session.setdefault(k1,123) # 存在则不设置 #帮你生成随机字符串帮你将这个随机字符串和用户数据加密后和过期时间保存到了django-session表里面帮你将这个随机字符串以sessionid随机字符串的形式添加到cookie里面返回给浏览器,这个sessionid名字是可以改的以后再说#但是注意一个事情django-session这个表你不能通过orm来直接控制因为你的models.py里面没有这个对应关系 #删除值
del request.session[k1] #django-session表里面同步删除# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()# 会话session的key
session_key request.session.session_key 获取sessionid的值# 将所有Session失效日期小于当前日期的数据删除将过期的删除
request.session.clear_expired()# 检查会话session的key在数据库中是否存在
request.session.exists(session_key) #session_key就是那个sessionid的值# 删除当前会话的所有Session数据
request.session.delete()# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() #常用清空所有cookie---删除session表里的这个会话的记录这用于确保前面的会话数据不可以再次被用户的浏览器访问例如django.contrib.auth.logout() 函数中就会调用它。# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)* 如果value是个整数session会在些秒数后失效。* 如果value是个datatime或timedeltasession就会在这个时间后失效。* 如果value是0,用户关闭浏览器session就会失效。* 如果value是None,session会依赖全局session失效策略。 Session详细流程解析 Session版登陆验证示例 from functools import wrapsdef check_login(func):wraps(func)def inner(request, *args, **kwargs):next_url request.get_full_path()if request.session.get(user):return func(request, *args, **kwargs)else:return redirect(/login/?next{}.format(next_url))return innerdef login(request):if request.method POST:user request.POST.get(user)pwd request.POST.get(pwd)if user alex and pwd alex1234:# 设置sessionrequest.session[user] user# 获取跳到登陆页面之前的URLnext_url request.GET.get(next)# 如果有就跳转回登陆之前的URLif next_url:return redirect(next_url)# 否则默认跳转到index页面else:return redirect(/index/)return render(request, login.html)check_login
def logout(request):# 删除所有当前请求相关的sessionrequest.session.delete()return redirect(/login/)check_login
def index(request):current_user request.session.get(user, None)return render(request, index.html, {user: current_user}) 问题同一个浏览器上如果一个用户已经登陆了你如果在通过这个浏览器以另外一个用户来登陆那么到底是第一个用户的页面还是第二个用户的页面有同学是不是懵逼了你想想一个浏览器和一个网站能保持两个用户的对话吗你登陆一下博客园试试第一个用户登陆的时候没有带着sessionid第二个用户登陆的时候带着第一个用户的sessionid这个值在第二个用户登陆之后session就被覆盖了浏览器上的sessionid就是我第二个用户的了那么你用第一个用户再点击其他内容你会发现看到的都是第二个用户的信息注意公众都能访问的a标签不算。还有你想想是不是你登陆一次就在django-session表里面给你添加一条session记录吗为什么呢因为你想如果是每个用户每次登陆都添加一条sesson的记录那么这个用户一年要登陆多少次啊那你需要记录多少次啊你想想所以你每次登陆的时候都会将你之前登陆的那个session记录给你更新掉也就是说你登陆的时候如果你带着一个session_id那么不是新添加一条记录用的还是django-session表里面的前面那一次登陆的session_key随机字符串但是session_data和expire_date都变了也就是说那条记录的钥匙还是它但是数据变了有同学又要问了那我过了好久才过来再登陆的那个session_id都没有了啊怎么办你放心你浏览器上的session_id没有了的话你django-session表里的关于你这个用户的session记录肯定被删掉了。再想登陆之后你把登陆之后的网址拿到另外一个浏览器上去访问能访问吗当然不能啦另外一个浏览器上有你这个浏览器上的cookie吗没有cookie能有session吗如果你再另外一个浏览器上又输入了用户名和密码登陆了会发生什么事情django-session表里面会多一条记录记着一个网站对一个浏览器是一个sessionid的换一个浏览器客户端肯定会生成另外一个sessioniddjango-session表里面的session_key肯定不同但是session_data字段的数据肯定是一样的当然了这个还要看人家的加密规则。 Django中的Session配置 Django中默认支持Session其内部提供了5种类型的Session供开发者使用。 1. 数据库Session
SESSION_ENGINE django.contrib.sessions.backends.db # 引擎默认2. 缓存Session
SESSION_ENGINE django.contrib.sessions.backends.cache # 引擎
SESSION_CACHE_ALIAS default # 使用的缓存别名默认内存缓存也可以是memcache此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE django.contrib.sessions.backends.file # 引擎
SESSION_FILE_PATH None # 缓存文件路径如果为None则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存数据库
SESSION_ENGINE django.contrib.sessions.backends.cached_db # 引擎5. 加密Cookie Session
SESSION_ENGINE django.contrib.sessions.backends.signed_cookies # 引擎其他公用设置项
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默认修改之后才保存默认 转载于:https://www.cnblogs.com/q455674496/p/10490041.html