在Django 模板中使用session

幾經周折終於找到了在Django 模板中使用session的方法。

需求

實現權限管理:登錄網站後,需要在頁面上顯示用戶名,以及根據用戶的角色(也存在於session中)顯示不同的菜單。

最初的解決方法

在所有與顯示相關的view函數裏,定義用戶名和角色的變量:

username = request.session["username"]
role = request.session["role"]
t = get_template('自定義的html頁面')
c = RequestContext(request,locals())
return HttpResponse(t.render(c))

然後在相應的模板裏使用{{username}}及{{role}}。但這樣做,需要在每個view函數都寫一遍,任務量較大,以後還會有其他人增加新的函數,且是重複勞動,所以要尋求一種一勞永逸的解決方法。

原因

不會使用的最基本原因是搞錯了request.session在html代碼中的類型(request.session在python中是當做字典類型使用的,可以這麼用request.session[“username”])。但它在html頁面中卻是不同的類型,在html代碼中寫上{{request.session}},瀏覽器中顯示的內容是:

<django.contrib.sessions.backends.db.SessionStore object at 0x7f8af046f190>

可以看出它是數據庫django.contrib.sessions.backends.db中的類SessionStore;類似於我們在models.py中定義的類,以user類爲例:

class user(models.Model):
    username = models.CharField(max_length=50, blank='false')
    password = models.CharField(max_length=50, blank='false')
    email = models.CharField(max_length=50, blank='false')
    role = models.CharField(max_length=50, blank='false')

    def __unicode__(self):
        return self.username

文件中我們是這麼調用的:

p = user.objects.get(username=uname)
request.session["username"] = p.username
request.session["role"] = p.role

所以,對於request.session我們也可以按這種方式使用。

解決方法

  1. 在html頁面中使用{{request.session.username}}和{{request.session.role}}即可實現
  2. 啓發來自:http://blog.csdn.net/shanliangliuxing/article/details/7988595,裏面還提到了另一種用法,試了試也是可行的(不過裏面有錯誤,就是不必加.role_name):
{% for key,value in request.session.items %}
    {% ifequal 'role' key %}
        {{ value }}
    {% endifequal %}
{% endfor %}

嘗試的其他解決方法

  1. 直接在html頁面中使用{{request.session[“username”]}},發現語法錯誤,python無法識別;
  2. 通過中間件的Response後處理函數: process_response(self, request, response)實現,修改response:
def process_response(self, request, response):
    if request.path != '/' or request.path != '/favicon.ico' :
        pass
    elif request.session.has_key('username') and len(user.objects.filter(username=request.session['username'])) == 1:
        response['username'] = request.session['username']
        response['role'] = request.session['role']
    return response

失敗,沒有起到想要的效果。response的類型還需要研究一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章