cookiesession使用

# 概念cookie客户端浏览器上的键值

# 目的:为了做会话保持
# 来源服务端写入的,服务端返回响应中写入,浏览器自动取出

                存起来是以key value 形式,有过期时间pathhttp only等等


# 使用:只要浏览器中cookie,再次向当前发送请求,都会自动携带在请求头中
        cookie:”name=lqz;age=19″
# 不安全问题—》cookie中发了敏感数据—》客户看到

obj.set_cookie()   # cookie设置
request.COOKIES.get()   # cookie取值  
request.COOKIES.clear()    # 清空        

# 我们需要cookie变的安全—》敏感数据不在cookie方法,而放在session
    –session服务的键值对
    –sessioncookie什么关系呢?把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 对象放入name=lqz
2 当前视图函数结束—->经过 【中间件】——>返回给了前端
       django 内置一个session中间件
       判断request.session没有变化,如果有变化
# 情况一:django-session表中没有数据
表中创建一条数据随机生成个字符串[随机字符串session_key],把数据存入django-session表
           session_key:adsfasd
           session_data: name=lqz  加密后存到里面
            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_PATH='c://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  cors
    'django.middleware.csrf.CsrfViewMiddleware',
    # 认证request.user--->这个中间件做的
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # django消息框架---》flask--》闪现
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 自定义中间件来使用记录用户的请求地址useragent

class SaveRemoteAddr(MiddlewareMixin):
    def process_request(self, request):
        # request 是WSGIRequest 的对象
        # print(request.session) # 一定要保证,session的中间件要在上面
        # 这个request 就是当次请求的request
        # 取出ip
        ip = 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 请求体中urlencoded,formdata):{csrfmiddlewaretoken:asdfasdf}
        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和formdata格式
# 如果使用ajax发送请求: 
                    redirect  render就用不了了
                    尽量使用JsonResponse

Auth的使用

# 概念:Auth就是django 的一个app,做用户管理
# 作用:Auth模块是Django自带的用户认证模块
        我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时需要实现包括用户注册、用户登录、用户认证、注销修改密码功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统auth,它默认使用 auth_user 表来存储用户数

# 默认的用户表示auth_user创建一个用户:可以用代码,可以用命令
# 模块常用方法
authenticate():一般需要usernamepassword两个关键字参数

        提供了用户认证功能,即验证用户名以及密码是否正确,如果认证成功(用户名密码正确有效),便会返回一个 User 对象, authenticate()会在该 User 对象设置一个属性标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

user = authenticate(username='usernamer',password='password')

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

3、

auth模块案例

如果用户登录了,打印用户的用户名
log.info(”)

IP访问频率限制案例

基础版:总共能访问5次(数据库,session)

高级版:做IP访问频率限制,一分钟只能访问5次

今日思维导图:

原文地址:https://blog.csdn.net/qq_48064830/article/details/134814578

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47538.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注