设为首页 收藏本站
查看: 391|回复: 2

如何通过Django操作cookie操作

[复制链接]
累计签到:521 天
连续签到:2 天
发表于 2022-10-21 00:52:40 | 显示全部楼层 |阅读模式
# cookie和session
发展史
1.网站都没有保存用户功能的需求 所有用户访问返回的结果都一样
    eg:新闻、博客、文章
   
2、出现了一些需要博爱村用信息的网站
    eg:淘宝、京东、支付宝、
[]
    以登录功能为例:如果不保存用户登陆状态,也就意味着用户每次访问网站都需要重复输入用户名和密码(你觉得还想要继续使用吗)
当用户第一次登录成功之后 将用户的用户名和面膜返回给用户浏览器 让用户浏览器保存本地,之后访问网站的时候浏览器自动将保存的
用户名和密码发送服务端,服务端获取之后做验证
    早期这种方式非常大的安全隐患
[]
    优化:
        当用户登陆成功之后,服务端会随机产生一个字符串(在服务端保存用户数,用k,v键值对的形式),交给客户端保存
            随机字符串1:用户1相关信息
            随机字符串2:用户2相关信息
            随机字符串3:用户3相关信息
        之后访问服务端的时候,都带着该随机字符串,服务端去数据库比对时候有对应的随机字符串从而获取到用户的信息
    但如果你拿到了或者截获到了该随机字符串,那么你就可以充当当前用户 其实还是有安全隐患的
    你要知道在web领域没有绝对的安全和不安全
[cookie:
    服务端保存在客户端的浏览器上的信息都成之为cookie
    他的表现形式一般都是k:v键值对(可以有多个-
[session:
    数据是保存在服务端的,一般也是kv键值对
下述内容暂了解即可,先给我搞明白sessioncookie使用在说话!]

[token:
    session虽然数据是保存在服务端的 但是禁不住量大
    服务端不在保存数据
        登陆成功之后 讲一段信息进行加密处理(加密算法之后你公司开发知道)
        将加密之后的结果拼接在信息后面 整体信息返回给浏览器保存
        浏览器下次访问的时候带着该信息 服务端自动切取前面一段信息再次使用自己的加密算法,
        去和浏览器尾部的密文进行比对]

jwt认证
    三段信息
    后期会讲

总结:
    1.cookie保存在客户端浏览器的信息
    2.session保存在服务端上的信息
    3.session是基于cookie工作的(大部分的保存用户状态的操作都需要使用cookie)

# cookie
虽然cookie是服务端告诉客户端浏览器需要保存的内容
但是客户端浏览器可以选择拒绝保存  如果禁止了 那么 只要是需要记录用户状态网站登录功能都无法正常使用

[视图函数的返回值]
return HttpResponse()
return render()
return redirect()obj1 = HttpResponse()
# 操作cookie
return obj1
obj2= render()
# 操作cookie
return obj2
obj3 = redirect()
# 操作cookie
return obj3
如果你想要操作cookie,你就不得不利用obj对象

[设置cookie]
    obj.set_cookie(key,value)
[获取cookie]
    request.COOKIES.get(key)
在设置cookie到时候可以添加一个超时时间
    obj.set_cookie('username','jason666',max_age=3,expires=3)

[cookie前戏
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            obj=redirect('/home/')
            obj.set_cookie('username', 'jason666')
        return obj
    return render(request,'login.html')

def home(request):
    if request.COOKIES.get('username') == 'jason666':
        return HttpResponse('我是登录后才能看的界面')
    return redirect('/login/')def login_auth(func):
    def inner(request,*args,**kwargs):
        # print(request.path_info)
        # print(request.get_full_path())  # 能够获取到用户上一次想要访问的url
        target_url = request.get_full_path()
        if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
        else:
            return redirect('/login/?next=%s'%target_url)
    return inner

[推导出的完成一个真正的登录功能
def login_auth(func):
    def inner(request,*args,**kwargs):
        # print(request.path_info)
        # print(request.get_full_path())  # 能够获取到用户上一次想要访问的url
        target_url = request.get_full_path()
        if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
        else:
            return redirect('/login/?next=%s'%target_url)
    return inner

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':

            # 获取用户上一次想要访问的url
            target_url = request.GET.get('next')  # 这个结果可能是None
            if target_url:
                obj = redirect(target_url)
            else:
                # 保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
            # 超时时间3秒到期
            """
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着它过来
            """
            # 跳转到一个需要用户登陆之后才能看的页面
            return obj
    return render(request,'login.html')


@login_auth
def home(request):
    # 获取cookie信息 判断你有没有
    # if request.COOKIES.get('username') == 'jason666':
    #     return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
    # # 没有登陆应该跳转到登陆页面
    # return redirect('/login/')
    return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1002585-1-1.html 上篇帖子: 构建BBS项目的表设计与如何建表 下篇帖子: 项目中如何利用forms组件实现登录功能
累计签到:521 天
连续签到:2 天
 楼主| 发表于 2022-11-1 00:32:39 | 显示全部楼层
如何来实现登录认证装饰的功呢?1、先把登录认证装饰器模板写出来
def login_auth(func):
    def inner(*args,**kwargs):
        
if request.COOKIES.get('username'):
            return func(*args,**kwargs)
        else:
            return redirect('/login/')
    return inner

2、研究如何在未登录前可以把自己想访问的页面,等候后跳转过去,而不是只是跳到自己写死home页面?   1、我们对于装饰器先做个变形,因为我们是基于request的完成的一切操作,我们想办法把request传过去才对       eg:          def inner(request,*args,**kwargs):   2、我们拿到request后可以利用request.get_full_path()获取到当前输入的url(request.path_info这个可以获取到用户输入的参数)   3、当我们可以拿到用户输入的参数后,我们可以利用未登录返回的参数做一个简单的拼接,把这个路径的值传回login做处理      eg:         def inner(request,*args,**kwargs):              target_url=request.get_full_path()              if request.COOKIES.get('username'):                  return func(*args,**kwargs)
              else:
                  return redirect(
'/login/?next=%s'%target_url)   4、这样就可以把数据交给login函数去做下一步处理了,可以直接通过request.GET.get('next')方法获取到传来的url进行redirect跳转      eg:         def login(request):            if request.method == 'POST':
               username = request.POST.get('username')
               password = request.POST.get('password')
               if username=='jason' and password=='123':
                #
获取当前路径
                   tatget_url = request.GET.get('next') [可能为None,当没有走装饰器的时候,直接走login那么会走else里面]
                   if target_url:
                       #
保存用户登陆状态
                       obj=redirect(target_url)
                   else:
                       obj = redirect('/home/') 代表用户只是点了登录页而已,那么我们自己手东帮他跳转一个页面即可了
            #
让浏览器记录cookie数据
               obj.set_cookie('username','jason666')
            # """
            #
浏览器不单单会帮你存
            # 而且后面每次访问你的时候都还会带着他过来
            # """
            #
跳转到一个登录之后才能看的页面
               return obj
           return render(request,'login.html')
     5、上面代码实现思路是,先获取到未登录传来的url,然后进行判断,如果获取到了,直接obj=redirect('target_url')跳转到目标页,     如果没有获取到值也没有关系,代表着用户只点了登录页面,我们自己可以设定用户点击登录后跳转到指定页既可以了,但是比较重要的     obj.set_cookie('username','jason666'),只要登录的账号和密码正确是自己设置的jason和123,那么就会产生cookie值,当我们进行,     跳转的时候,登录认证会去校验是否有cookie然后在访问目标页面,这样可以完成需求了     eg:         @login_auth        def index(request):             return HttpRersonse('index页面')

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

累计签到:521 天
连续签到:2 天
 楼主| 发表于 2022-11-1 23:50:00 | 显示全部楼层
1、cookie还有两种用法:
a:设置超时 max_age(秒),expires(秒)针对IE浏览器设置的超时
   obj.set_cookie('username'='jason',max_age=5)

b:删除功能 delete_cookie@login_auth
def logout(request)
   obj=redirect('/login/')
   obj.delete_cookie('username')
   return obj




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表