Django:之安全、國際化和session

Django 安全python

如下是關於Django安全的一些特徵,它包括如何使基於Django的網站的一些建議。數據庫

關於安全的官方文檔:https://docs.djangoproject.com/en/dev/#securitydjango

官方文檔包括如下幾個方面:安全

Django表單用在模版中的時候咱們會加一句{% csrf_token %}服務器

Django 國際化cookie

Django官方教程:https://docs.djangoproject.com/en/1.7/#internationalization-and-localizationsession

Django支持國際化,多語言。Django的國際化是默認開啓的,若是您不須要國際化支持,那麼您能夠在您的設置文件中設置USE_I18N = False,那麼Django會進行一些優化,不加載國際化支持機制。框架

NOTE: 18表示Internationlization這個單詞首字母I和結尾字母N之間的字母有18個。I18N就是Internationlization的意思。post

Django徹底支持文本翻譯,日期時間數字格式和時區。優化

本質上講,Django作了兩件事:

一、它容許開發者指定要翻譯的字符串

二、Django根據特定的訪問者的偏好設置,進行調用相應的翻譯文本。

開啓國際化的支持,須要在settings.py文本中設置

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.locale.LocaleMiddleware',
)
 
 
LANGUAGE_CODE = 'en'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
 
LANGUAGES = (
    ('en', ('English')),
    ('zh-cn', ('中文簡體')),
    ('zh-tw', ('中文繁體')),
)
 
#翻譯文件所在目錄,須要手工建立
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
 
TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "django.core.context_processors.i18n",
)

生成需翻譯的文本

django-admin.py makemessages -l zh-cn
django-admin.py makemessages -l zh-tw

手工翻譯locale中的文本後,咱們須要編譯如下,這樣翻譯纔會生效

django-admin.py compilemessages

Django session

Django 徹底支持也匿名會話,簡單說就是使用跨網頁之間能夠進行通信,好比顯示用戶名,用戶是否已經發表評論,session框架讓你存儲盒獲取訪問者的數據信息,這些信息保存在服務器上(默認是數據庫中),以cookies的方式發送和獲取一個包含session ID的值,並非用cookies傳遞數據自己。

啓用session

編輯settings.py中的一些配置

MIDDLEWARE_CLASSES確保其中包含如下內容

'django.contrib.sessions.middleware.SessionMiddleware',

INSTALLED_APPS是包含

'django.contrib.sessions',

這些是默認啓用的。若是你不用等話,也能夠關掉這個以節省一點服務器的開銷。

提示:您也能夠配置使用好比cache來存儲session

在視圖中使用session

request.session能夠在視圖中任何地方使用,它相似於python中的字典

session默認有效時間爲兩週,能夠在settings.py中修改默認值:參加這裏

# 建立或修改 session:
request.session[key] = value
# 獲取 session:
request.session.get(key,default=None)
# 刪除 session
del request.session[key] # 不存在時報錯

session例子

好比寫一個不讓用戶評論兩次的應用:

from django.http import HttpResponse
 
def post_comment(request, new_comment):
    if request.session.get('has_commented', False):
        return HttpResponse("You've already commented.")
    c = comments.Comment(comment=new_comment)
    c.save()
    request.session['has_commented'] = True
    return HttpResponse('Thanks for your comment!')

一個簡化的登錄認證:

def login(request):
    m = Member.objects.get(username=request.POST['username'])
    if m.password == request.POST['password']:
        request.session['member_id'] = m.id
        return HttpResponse("You're logged in.")
    else:
        return HttpResponse("Your username and password didn't match.")
         
         
def logout(request):
    try:
        del request.session['member_id']
    except KeyError:
        pass
    return HttpResponse("You're logged out.")

當登錄時驗證用戶名和密碼,並保存用戶id在session中,這樣就能夠在視圖中使用request.session['member_id']來檢查用戶是否登錄,當退出的時候,刪除掉它。

相關文章
相關標籤/搜索