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',
这些是默认启用的。若是你不用等话,也能够关掉这个以节省一点服务器的开销。
在视图中使用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']来检查用户是否登录,当退出的时候,删除掉它。