`
lvscar
  • 浏览: 2537 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
最近访客 更多访客>>
社区版块
存档分类
最新评论

无cookie环境实现django会话

阅读更多
django的会话(session)中间件不提供类似j2ee和php中基于url重写的会话机制。
引用

Session IDs in URLs
The Django sessions framework is entirely, and solely, cookie-based. It does not fall back to putting session IDs in URLs as a last resort, as PHP does. This is an intentional design decision. Not only does that behavior make URLs ugly, it makes your site vulnerable to session-ID theft via the "Referer" header.


以下脚本通过中间件为django增添无cookie时的会话支持,在django1.0.2版本下工作正常,  注意,该中间件在setting模块MIDDLEWARE_CLASSES tuple中的位置必须优先于SessionMiddleware

#-*- coding:utf-8 -*-
from django.http  import  HttpResponseRedirect
import re,pdb

class CookielessSessionMiddleware(object):
    def __init__(self):

        self._re_links = re.compile(r'<a(?P<pre_href>[^>]*?)href=["\'](?P<in_href>[^"\']*?)(?P<anchor>#\S+)?["\'](?P<post_href>[^>]*?)>', re.I)

        self._re_forms = re.compile('</form>', re.I)

    def _prepare_url(self, url):
        patt = None
        if url.find('?') == -1:
            patt = '%s?'
        else:
            patt = '%s&amp;'
        return patt % (url,)

    def process_request(self, request):
        if not request.COOKIES.has_key('sessionid'):
            value = None
            if hasattr(request, 'POST') and request.POST.has_key('sessionid'):
                value = request.POST['sessionid']
            elif hasattr(request, 'GET') and request.GET.has_key('sessionid'):
                value = request.GET['sessionid']
            if value:
                request.COOKIES['sessionid'] = value        

    def process_response(self, request, response):

        if not request.path.startswith("/admin")  and response.cookies.has_key('sessionid'):
            try:
                sessionid = response.cookies['sessionid'].coded_value
                if type(response) is HttpResponseRedirect:

                    if not sessionid: sessionid = ""
                    redirect_url = [x[1] for x in response.items() if x[0] == "Location"][0]
                    redirect_url = self._prepare_url(redirect_url)
                    return HttpResponseRedirect('%ssessionid=%s' % (redirect_url,sessionid,)) 


                def new_url(m):
                    anchor_value = ""
                    if m.groupdict().get("anchor"): anchor_value = m.groupdict().get("anchor")
                    return_str = '<a%shref="%ssessionid=%s%s"%s>' % \
                         (m.groupdict()['pre_href'],
                         self._prepare_url(m.groupdict()['in_href']),
                         sessionid,
                         anchor_value,
                         m.groupdict()['post_href'])
                    return return_str                                 
                response.content = self._re_links.sub(new_url, response.content)


                repl_form = '<div><input type="hidden" name="sessionid" value="%s" /></div>' + \
                    '</form>'
                repl_form = repl_form % (sessionid,)
                response.content = self._re_forms.sub(repl_form, response.content)

                return response
            except:

                return response
        else:
            return response        

分享到:
评论
1 楼 skyfen 2009-11-12  
感觉还可以啊。

相关推荐

    Django实现登录-注册等功能

    在本文中,我们将深入探讨如何使用Django框架来实现用户登录和注册功能,这对于任何Web应用程序来说都是核心组件。Django是一个用Python编写的高级Web框架,它鼓励快速开发和简洁实用的设计理念。 首先,我们需要...

    django框架之cookie/session的使用示例(小结)

    在Web开发中,Django框架提供了方便的cookie和session管理机制,用于解决HTTP协议无状态的问题。HTTP协议本身不支持会话跟踪,因此需要借助额外的技术,如cookie和session,来实现用户状态的维护。 一、HTTP协议无...

    python 零基础学习篇python课程django框架 django会话保持和视图5 cookie的2点说明 .mp4

    python 零基础学习篇

    python-Django实现用户登录

    除了基本的登录功能,Django还支持记住我(Remember Me)功能,通过在cookie中存储一个长期有效的令牌,使用户在关闭浏览器后再次访问时仍能保持登录状态。还可以实现注册功能,允许新用户创建账户,并添加自定义的...

    Django框架会话技术实例分析【Cookie与Session】

    Token是一种手动实现的会话管理机制,通常用于实现无状态的服务端验证。它可以作为一种替代方案来增强安全性。 **特点:** - **唯一性:** 每个Token都应该具有唯一性。 - **生成方式:** 通常通过组合多种因素(如...

    Python后台开发Django会话控制的实现

    本篇文章将详细阐述如何在Django中实现会话控制,主要包括页面跳转、Cookie管理以及Session的使用。 首先,页面跳转在Web开发中是常见的操作。在Django中,可以使用`redirect()`函数进行本地或外部网址的跳转。例如...

    Django Session和Cookie分别实现记住用户登录状态操作

    在Django框架中,有两种主要方法可以实现这一功能:Django Session和Cookie。理解这两者的工作原理和如何在Django中使用它们至关重要。 首先,让我们深入了解Cookie。Cookie是由服务器发送到用户浏览器的一小段数据...

    Python Web框架之Django框架cookie和session用法分析

    通过这些操作,可以有效地使用Django框架中的cookie和session来跟踪用户的会话状态,并在此基础上进行相应的业务逻辑处理。在实际开发中,为了保证安全,开发者应当遵循最佳实践,比如设置合理的过期时间,使用...

    django-user-sessions:使用外键将Django会话扩展回用户,从而允许枚举所有用户的会话

    `django-user-sessions`库就是为了解决这个问题而设计的,它通过添加一个外键将Django会话与用户模型连接起来,使得我们可以方便地枚举和管理所有用户的会话。 首先,让我们深入了解Django的默认会话机制。Django...

    django,mysql,全栈 搭建的web.seesion,cookie权限

    cookie通常用于实现会话管理、用户偏好设置等功能,但其存储容量有限且安全性相对较低。 5. **权限管理**: Django提供了一套强大的权限和认证系统,包括用户模型、组和权限。可以使用`@login_required`装饰器限制...

    基于Django的网站平台系统源码

    同时,可以使用Django的内置session和cookie管理来安全地处理用户认证和会话信息。 6. **随机图片验证码**: Django可以集成第三方库如django-simple-captcha来生成和验证随机图片验证码,防止机器人自动提交表单...

    使用django实现用户登录

    默认情况下,Django使用cookie来存储会话ID,然后在服务器端根据这个ID查找并恢复会话数据。 对于登录页面的错误处理,比如输入验证和防止跨站请求伪造(CSRF),Django也提供了内置支持。你可以通过在表单中添加`{...

    django-redis-sessions:用于将会话存储在Redis数据库中的Django的会话后端

    1. **Django会话管理**:Django原生支持会话管理,可以通过设置`SESSION_ENGINE`配置项来选择不同的会话后端。默认使用的是基于Cookie的会话,但也可以选择其他数据库,如Redis。 2. **Redis作为会话存储**:Redis...

    基于Django的web人脸识别登录功能设计与实现-源码

    8. **权限管理**:如果用户通过人脸识别登录成功,使用Django的内置认证系统进行用户会话管理,设置cookie以保持登录状态。 9. **测试与优化**:进行功能测试,确保人脸识别准确无误,同时优化性能,如调整人脸检测...

    2019Django全套教程【千锋Python】课件PPT模板.pptx

    Django支持cookie和session两种方式来实现会话管理。 【安全与认证】 Django内置了强大的安全功能,包括CSRF(跨站请求伪造)保护和session tokens。CSRF保护通过验证请求中的特定token来防止恶意操作。同时,...

    Django cookie 与 session

    总的来说,Django中的Cookie和Session都是为了在HTTP无状态环境下维护用户状态。Cookie主要存储轻量级信息,如会话标识符,而Session用于存储更复杂的数据并在服务器端保持状态。两者结合使用,可以提供安全、高效的...

    Django会员管理系统

    1. **Django认证系统**:Django自带的认证系统包括用户模型、会话管理、权限和组等。开发者创建了`manager`和`member`两个用户模型,扩展了Django的默认用户模型`AbstractBaseUser`或`User`,以存储额外的字段,如...

    Python3.5Django实战篇视频.zip

    目录网盘文件永久链接 1.Python3.5 DjangoWeb开发框架 ...5.Python3,5 Django会话与表单验证21课rar 6,Python3.5项目架构与设计13课rar 7.Python3.5ajax与编辑器扩展插件18课,rar 8.Python3.5博客系统开发演练14课rar

    Django组件之cookie与session的使用方法

    但是,你说你每次上网的时候,只需要登录一下就行了,并没有我说的让你每次都登录,这是会话路径技术帮你记录了你的登录信息,现在我们们就来讲讲Django的会话路径技术cookie和session,实现会话追踪。 二、cookie ...

Global site tag (gtag.js) - Google Analytics