`
san_yun
  • 浏览: 2639196 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

django lazy user实现

 
阅读更多

代码如下:

 

from people.service import userQueryService 

class LazyUser(object):
    
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            request._cached_user = self.get_user(request) 
        return request._cached_user
    
    def get_user(self,request):
        print 'request.user_id=%s'%request.user_id
        return userQueryService.findUserById(request.user_id)
    
class UserMiddleware(object):
    def process_request(self, request):
        print 'user session process_request'
        request.user_id = request.session.get('_auth_user_id')
        request.__class__.user = LazyUser()
        return None

 

 

这里面的魔法代码是

request.__class__.user

 

访问到request.user才会触发__get__方法,并返回数据,这是一个demo:

class LazyUser(object):
    def __init__(self,id):
        self.id = id
        
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            request._cached_user = self.get_user(request) 
        return request._cached_user
    
    def get_user(self,request):
        return self.id
    
class Request(object):
    pass

request1 = Request()
request1.__class__.user = LazyUser(1)

print request1.user

request2 = Request() 
request2.__class__.user = LazyUser(2)


print request2.user
print request1.user    

 

分享到:
评论

相关推荐

    django 自定义用户user模型的三种方法

    django version: 1.7.1 最简单的推荐: 使用abstractuser扩充fields ...from django.utils.translation import ugettext_lazy as _ # Create your models here. class KarmaUser(AbstractUser): karma = models.Positiv

    单独提取django_orm

    Django会自动创建一个名为`user`的数据库表,包含username、email和created_at三列。 三、数据操作 1. 创建(Create):使用`.save()`方法创建新记录。 ```python new_user = User(username='testuser', email='...

    django tutorial

    基于类的视图是一种更加灵活的方式,允许你通过继承自 Django 内置的视图类来实现复杂的功能。 ##### 3.3 基于类的视图 基于类的视图提供了一种更高级的方式来组织和重用代码。 例如,创建一个基于类的视图来显示...

    Django前端模板及crispy form美化等

    本文档作为对上一篇关于Django用户登录注册等内容的延续,主要聚焦于如何利用第三方库Crispy Forms来实现前端页面的美化与优化。对于初学者而言,掌握Django前端模板的应用以及如何结合Bootstrap框架来提升用户体验...

    Django 重写用户模型的实现

    from django.utils.translation import gettext_lazy as _ class MyUser(AbstractBaseUser): identifier = models.CharField(max_length=40, unique=True) email = models.EmailField(_('email address'), unique...

    Python库 | django-lazycrud-1.5.3.tar.gz

    3. **自动分页**:对于大数据集的展示,`django-lazycrud` 提供了自动分页功能,帮助开发者轻松实现前端的分页展示。 4. **简洁的 CRUD 方法**:库为每个模型提供了简单的 CRUD 方法,如 `create()`, `read()`, `...

    PyPI 官网下载 | django-lazysignup-0.1.1.tar.gz

    1. 模型(Models):扩展Django的User模型,添加一个"lazy_user"状态来标识未完全注册的用户。 2. 视图(Views):提供处理用户升级其帐户到完整用户的过程。 3. 表单(Forms):可能包括用于完成注册的表单。 4. ...

    Python-ActiveRecord类似Django的查询嵌套式加载和美化reprforSQLAlchemy

    默认情况下,SQLAlchemy使用懒加载(Lazy Loading),即只有在需要访问关联对象时才执行额外的SQL查询。为了减少数据库交互次数,我们可以使用`joinedload`或`subqueryload`来实现嵌套式加载: ```python user_...

    python3.6+django2.0+mysql搭建网站过程详解

    如果你想将Django管理界面的语言设置为中文,可以在`settings.py`文件开头导入`ugettext_lazy`,然后更改`LANGUAGE_CODE`和`LANGUAGES`设置: ```python from django.utils.translation import ugettext_lazy as _ ...

    Django 拼接两个queryset 或是两个不可以相加的对象实例

    当我们需要合并或连接两个或更多的QuerySet时,通常有多种方法可以实现。本篇文章将详细探讨如何在Django中拼接两个QuerySet,以及相关的筛选和集合操作。 **一、QuerySet的拼接** 1. **使用`|`操作符拼接** ...

    基于Nginx的负载均衡管理系统Lazybalancer.zip

    Lazy-Balancer 项目起源于好哥们需要一个 7 层负载均衡器,无奈商业负载均衡器成本高昂,操作复杂。又没有特别喜欢(好看,好用)的开源产品,作为一名大 Ops 怎么能没有办法?正好最近在看 Django 框架,尝试...

    解决更改AUTH_USER_MODEL后出现的问题

    ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'user.patient', but app 'users' isn’t installed. ``` 这个错误意味着Django尝试引用一个不存在的应用(`users`)中的模型...

    Python编写ORM共6页.pdf.zip

    Django的ORM也提供了丰富的查询API,可以轻松实现复杂的查询操作。 例如,如果你想获取所有电子邮件地址以'@gmail.com'结尾的用户,你可以这样做: ```python from django.db.models import Q users = User....

    一个完整的管理系统或demo的源码.docx

    role = db.relationship('Role', backref=db.backref('users', lazy=True)) class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True, nullable=...

    Weather-app

    - **Node.js/Python/Django/Ruby on Rails**: 可能使用的后端语言和框架,用于处理请求、管理数据库和与API交互。 - **RESTful API**: 设计和实现符合REST原则的接口,使前后端能够有效通信。 - **Authentication...

Global site tag (gtag.js) - Google Analytics