Django tips: 沒有了request對象,還能找到當前登入使用者user嗎?

來源:互聯網
上載者:User

先來看看我們之前是怎樣擷取到當前登入user的:在view中,我們常常就會通過request對象來擷取目前使用者user的引用:

def comment_add(request):    # do something...    user = request.user    # to do .....

 

這樣,確實很方便就能擷取多使用者的資訊。可是,如果要做別的地方擷取user呢?例如要在model中擷取user呢?

class Post(models.Model):    title = models.CharField('Post標題', maxlength=100, db_index=True)    create_date = models.DateTimeField('發布時間', default=datetime.now(), editable=False)    modified_date = models.DateTimeField('最後修改時間', default=datetime.now(), editable=False)    author = models.ForeignKey(User, verbose_name="作者", editable=False)    content = models.TextField('內容')    last_visitor_IP = models.IPAddressField('最後的訪問者IP', null=True, blank=True, editable=False)    tags = models.ManyToManyField(Tag, verbose_name="the list of tags", null=True, blank=True)    slug = models.SlugField('自訂url', maxlength=100, null=True, blank=True)    hits = models.IntegerField('點擊數', editable=False, default=0)


可以看到,author是editable=False的,即我們想Post被儲存是自動化佈建author為當前登入使用者user。而這裡沒有request,怎樣擷取到這個user呢?找了一下django的文章,提到了使用middleware來解決這個需求。

好吧,先在項目中建立一個"middleware"模組(即帶有一個空__init__.py檔案的目錄),接著建立"threadlocals.py"到此目錄,代碼如下:

#!/usr/bin/python# -*- coding: utf-8 -*-# Description: thread locals middleware# Create: 2008-6-4try:    from threading import localexcept ImportError:    from django.utils._threading_local import local_thread_locals = local()def get_current_user():    return getattr(_thread_locals, 'user', None)class ThreadLocals(object):    """Middleware that gets various objects from the    request object and saves them in thread local storage."""    def process_request(self, request):        _thread_locals.user = getattr(request, 'user', None)

接著將此middleware添加到項目中,開啟setting.py,修改代碼如下:

MIDDLEWARE_CLASSES = (    "django.middleware.common.CommonMiddleware",    "django.contrib.sessions.middleware.SessionMiddleware",    "django.contrib.auth.middleware.AuthenticationMiddleware",    "yourproject.middleware.threadlocals.ThreadLocals", )

寫到這裡,發現這不類似與asp.net中的HttpModule嗎?

然後為了自動化佈建author為目前使用者,我們需要重載post的save方法:

先匯入middleware

from net4.middleware import threadlocals
def save(self):    if self.id is None:        self.author = threadlocals.get_current_user()    super(Post, self).save()

編碼工作完成了,還不快點進入admin看看是否可以正常工作了呢?

 

其實大部分都是算直接在參考文章裡哪過來的,呵呵,反正是花了點時間才找到,呵呵,就拿來主義,讓大家一齊分享咯。

 

希望對你有用! ^_^


本文參考:

Making User info available outside requests

Technorati: django, python, middleware, get_current_user

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.