做外贸选取哪个网站,做一个简单的网页游戏,科技公司建设网站,重庆定制网站开发价格cookie和session的使用 # 概念#xff1a;cookie 是客户端浏览器上的键值对 # 目的#xff1a;为了做会话保持 # 来源#xff1a;服务端写入的#xff0c;服务端再返回的响应头中写入#xff0c;浏览器会自动取出来 存起来是以key value 形式#xff0c;有过期时间、path…cookie和session的使用 # 概念cookie 是客户端浏览器上的键值对 # 目的为了做会话保持 # 来源服务端写入的服务端再返回的响应头中写入浏览器会自动取出来 存起来是以key value 形式有过期时间、path、http only等等 # 使用只要浏览器中有cookie再次向当前域发送请求都会自动携带在请求头中 cookie:namelqz;age19 # 不安全问题---》cookie中发了敏感数据---》客户能看到 obj.set_cookie() # cookie设置
request.COOKIES.get() # cookie取值
request.COOKIES.clear() # 清空 # 我们需要让cookie变的安全---》敏感数据不在cookie中方法而放在session中 -session是服务端的键值对 -session跟cookie有什么关系呢把key以cookie的形式存到浏览器中 {111{name:lqz,age:19,password:123},222{name:zs,age:19,password:666}} sessionid:111 # 当前浏览器以后再发请就会携带过来 -我们根据带过来的cookie 111----》 从 session中取出对应的数据 # session的使用: 必须要先迁移表, session存在服务端的, 默认情况下存在, django-session表中 配置文件: SESSION_ENGINE django.contrib.sessions.backends.db
# django项目有两套配置文件内置一套项目自己一套 # django-session表的字段: session_key: sessionid:随机字符串 session_data 真正的数据(加密了) expire_date 过期时间 request.session.get() # 取值
request.session[name]lqz # 赋值 # session的本质执行原理: 1 咱么写了request.session[name]lqz本质就是向session 对象中放入了namelqz 2 当前视图函数结束----经过 【中间件】------返回给了前端 django 内置了一个session中间件 判断request.session 有没有变化如果有变化 # 情况一django-session表中没有数据 在表中创建出一条数据随机生成一个字符串[随机字符串session_key]把数据存入django-session表 session_keyadsfasd session_data namelqz 加密后存到里面 sessionid:adsfasd 把随机字符串写入到cookie中 # 情况二django-session表中有数据 把session中所有的值加密后, 更新到django-session表的session_data中其他不变 3 下次 再发请求进入任意视图函数---》又会经过【中间件】---》视图函数 视图函数中取session:request.session.get(age) 浏览器发请求(携带cookie过来)---》到了中间件---》根据sessionid取出随机字符串 拿着随机字符串去django-session中查【session_key】---》 能查到就把 session_data的数据解密---》放到request.session中 无则添加有则更新请求来取出随机字符串对比正确则解密 后续视图函数中才能取出值 session的中间件把上述内容完成了 procee_request process_response
django.contrib.sessions.middleware.SessionMiddleware # 配置session 存放路径未完成需要你完成 DEFAULT_AUTO_FIELD django.db.models.BigAutoField
SESSION_ENGINE django.contrib.sessions.backends.file
SESSION_FILE_PATHc://xxx/x
SESSION_COOKIE_NAME xxx
from django.conf import settings
from django.contrib.sessions.backends import 中间件 # 概念中间件是介于request与response处理之间的一道处理过程能在全局上改变django的输入与输出。因为改变的是全局所以需要谨慎实用用不好会影响到性能 # 作用 1 全局的请求拦截---》如果它没有登录---》就不允许访问 2 拦截所有请求获取请求的ip地址 3 记录所有用户的访问日志 4 统一在响应头中加数据 # 代码上就是一个类类中有几个方法 MIDDLEWARE [django.middleware.security.SecurityMiddleware,# session相关的中间件django.contrib.sessions.middleware.SessionMiddleware,# 公共中间件---》访问不带 / 路径如果有 带 / 的路径他会让你重定向到这个地址django.middleware.common.CommonMiddleware,# csrf认证 xss corsdjango.middleware.csrf.CsrfViewMiddleware,# 认证request.user---这个中间件做的django.contrib.auth.middleware.AuthenticationMiddleware,# django的消息框架---》flask--》闪现django.contrib.messages.middleware.MessageMiddleware,django.middleware.clickjacking.XFrameOptionsMiddleware,
] # 自定义中间件来使用记录用户的请求地址和user-agent class SaveRemoteAddr(MiddlewareMixin):def process_request(self, request):# request 是WSGIRequest 的对象# print(request.session) # 一定要保证session的中间件要在上面# 这个request 就是当次请求的request# 取出ipip request.META.get(REMOTE_ADDR)user_agent request.META.get(HTTP_USER_AGENT)print(ip)print(user_agent)# return HttpResponse(不让你看了) # 不会再走视图函数了 # 能返回的情况 1 None,表示执行完这个代码经过中间件继续执行最后进视图函数 2 四件套后续不走了中间件的process_response---》直接返回给浏览器了 # 中间件在响应头加入访问时间 import datetime
class AddHeaderMiddleWare(MiddlewareMixin):def process_response(self, request, response):# request中有没有session 有# request 如果在视图函数中往request中放了值在这里就可以取出来 request.xxx# print(request.xxx)# 所有cookie中都带# response.set_cookie(xxxxx, asdfds)# 写入到响应头,访问服务端的时间response[ttt] datetime.datetime.now()return response # 一定要返回response对象 csrf认证相关 # 概念csrf是跨站请求伪造 # 攻击原理 -在同一个浏览器中如果登录了A网站没有退出在B网站中向A网站发送请求浏览器会自动携带A网站的cookie对于A网站后端来讲 它就分辨不清到底是用户真实发的请求还是黑客网站发的请求【都会携带用户真实的cookie】 # 如何防范 django解决了这个问题,只要发送post请求必须携带一个csrf_token 随机字符串(后端给的) # 这个随机字符串可以带的位置: 1 请求体中urlencodedform-data{csrfmiddlewaretokenasdfasdf} 2 放在请求头中X-CSRFToken:asdfasdfasd 3 ajax提交数据默认是urlencoded放在请求体中没有任何问题 $.ajax({method: post,data: {username, password, csrfmiddlewaretoken},success: function (res) {console.log(res)}}) 4 ajax提交使用json格式---》就不能放在请求体中,只能放在请求头中 $.ajax({method: post,headers:{X-CSRFToken:csrfmiddlewaretoken},contentType: application/json,data: JSON.stringify({username, password}),success: function (res) {console.log(res)}}) # post 提交的数据都是从request.POST中取前提是必须是urlencoded和form-data格式 # 如果使用ajax发送请求: redirect render就用不了了 尽量使用JsonResponse Auth的使用 # 概念Auth就是django 的一个app做用户管理 # 作用Auth模块是Django自带的用户认证模块 我们在开发一个网站的时候无可避免的需要设计实现网站的用户系统。此时需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能这还真是个麻烦的事情呢。 Django作为一个完美主义者的终极框架当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth它默认使用 auth_user 表来存储用户数据 # 默认的用户表示auth_user创建一个用户可以用代码可以用命令 # 模块常用方法authenticate()一般需要username 、password两个关键字参数 提供了用户认证功能即验证用户名以及密码是否正确,如果认证成功(用户名和密码正确有效)便会返回一个 User 对象, authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户且该信息在后续的登录过程中是需要的。 user authenticate(usernameusernamer,passwordpassword) login(HttpRequest, user): 登录认证通过调用一下这个方法,以后从request.user中才能取出当前登录用户 logout(request): 退出一定要调用 is_authenticated(): 判断当前用户是否登录--不能使用request.user 是否有值来判断因为他一直有值 request.user.is_authenticated() orm的链接方式 django的orm的 __ 链表使用什么链接方式 在Django ORM中双下划线连接语法本身并不直接对应特定的SQL连接类型。当使用双下划线时Django ORM会根据模型之间的关系和查询的具体情况自动选择适当的SQL连接方式包括INNER JOIN、LEFT OUTER JOIN等。 在实际使用中我们通常涉及到 INNER JOIN内连接和 LEFT OUTER JOIN左连接因为这两者是最常见的连接方式。INNER JOIN 用于匹配两个表中符合条件的行而 LEFT OUTER JOIN会返回左表中的所有行以及右表中与左表匹配的行。 中间件logru案例 记录用户访问所用接口用的时间---》记录到日志中---》logru---》打印出来即可 - ip user-agent total_time pip install loguru # 安装loguru模块 middle_key.py
from django.utils.deprecation import MiddlewareMixin
from app01 import models
from loguru import logger
import datetimeclass MyMiddlew(MiddlewareMixin):def process_request(self, request):addr request.META.get(REMOTE_ADDR)llq request.META.get(HTTP_USER_AGENT)request.time datetime.datetime.now()models.ShuJu.objects.create(ShuJu_REMOTE_ADDRaddr, user_agentllq)logger.add(runtime_{time}.log, retention10) # 文件名创十个logger.info(进入时间为{}, request.time)def process_response(self, request, response):to_time datetime.datetime.now()time to_time - request.timeprint(time)logger.warning(结束时间{}, time)return responseauth模块案例 如果用户登录了打印用户的用户名 log.info() # 迁移auth表格
python manage.py createsuperuser from django.contrib import auth
from loguru import logger
def demo01(request):if request.method GET:return render(request, caojiyh.html)else:username request.POST.get(username)password request.POST.get(password)print(password)user auth.authenticate(request, usernameusername, passwordpassword)print(user)if user:auth.login(request, user)userrequest.userlogger.info(用户名是{}, user)print(request.user)return redirect(/home/)else:return render(request, caojiyh.html, {error: 用户名或密码错误}) IP访问频率限制案例 基础版总共能访问5次数据库session 高级版做IP访问频率限制一分钟只能访问5次 今日思维导图 文章转载自: http://www.morning.tjsxx.cn.gov.cn.tjsxx.cn http://www.morning.ntqqm.cn.gov.cn.ntqqm.cn http://www.morning.hrgxk.cn.gov.cn.hrgxk.cn http://www.morning.npfkw.cn.gov.cn.npfkw.cn http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn http://www.morning.nkrmh.cn.gov.cn.nkrmh.cn http://www.morning.wmfr.cn.gov.cn.wmfr.cn http://www.morning.lhqw.cn.gov.cn.lhqw.cn http://www.morning.mjytr.cn.gov.cn.mjytr.cn http://www.morning.ydxwj.cn.gov.cn.ydxwj.cn http://www.morning.nzcys.cn.gov.cn.nzcys.cn http://www.morning.wsrcy.cn.gov.cn.wsrcy.cn http://www.morning.bsrqy.cn.gov.cn.bsrqy.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.qxlhj.cn.gov.cn.qxlhj.cn http://www.morning.dlrsjc.com.gov.cn.dlrsjc.com http://www.morning.pfmsh.cn.gov.cn.pfmsh.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.jwrcz.cn.gov.cn.jwrcz.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.nqgds.cn.gov.cn.nqgds.cn http://www.morning.pkwwq.cn.gov.cn.pkwwq.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.wyrsn.cn.gov.cn.wyrsn.cn http://www.morning.jlxld.cn.gov.cn.jlxld.cn http://www.morning.ysbrz.cn.gov.cn.ysbrz.cn http://www.morning.tqpds.cn.gov.cn.tqpds.cn http://www.morning.zknjy.cn.gov.cn.zknjy.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.kfyjh.cn.gov.cn.kfyjh.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.lwzgn.cn.gov.cn.lwzgn.cn http://www.morning.lmyq.cn.gov.cn.lmyq.cn http://www.morning.stflb.cn.gov.cn.stflb.cn http://www.morning.cpfbg.cn.gov.cn.cpfbg.cn http://www.morning.mjats.com.gov.cn.mjats.com http://www.morning.pbzgj.cn.gov.cn.pbzgj.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.zrdqz.cn.gov.cn.zrdqz.cn http://www.morning.pnfwd.cn.gov.cn.pnfwd.cn http://www.morning.tbwsl.cn.gov.cn.tbwsl.cn http://www.morning.plflq.cn.gov.cn.plflq.cn http://www.morning.qkdbz.cn.gov.cn.qkdbz.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.trsmb.cn.gov.cn.trsmb.cn http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.xysxj.com.gov.cn.xysxj.com http://www.morning.rkqzx.cn.gov.cn.rkqzx.cn http://www.morning.hnkkf.cn.gov.cn.hnkkf.cn http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn http://www.morning.wynqg.cn.gov.cn.wynqg.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.jwtwf.cn.gov.cn.jwtwf.cn http://www.morning.lbqt.cn.gov.cn.lbqt.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.mbnhr.cn.gov.cn.mbnhr.cn http://www.morning.kltmt.cn.gov.cn.kltmt.cn http://www.morning.lbggk.cn.gov.cn.lbggk.cn http://www.morning.tgpgx.cn.gov.cn.tgpgx.cn http://www.morning.nbrdx.cn.gov.cn.nbrdx.cn http://www.morning.lxlfr.cn.gov.cn.lxlfr.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.ywpwq.cn.gov.cn.ywpwq.cn http://www.morning.nysjb.cn.gov.cn.nysjb.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.mkbc.cn.gov.cn.mkbc.cn http://www.morning.wdxr.cn.gov.cn.wdxr.cn http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn http://www.morning.qswws.cn.gov.cn.qswws.cn http://www.morning.dwmtk.cn.gov.cn.dwmtk.cn http://www.morning.dsprl.cn.gov.cn.dsprl.cn http://www.morning.zntf.cn.gov.cn.zntf.cn http://www.morning.pffqh.cn.gov.cn.pffqh.cn http://www.morning.bnmfq.cn.gov.cn.bnmfq.cn http://www.morning.ykxnp.cn.gov.cn.ykxnp.cn http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn http://www.morning.pntzg.cn.gov.cn.pntzg.cn