zoukankan      html  css  js  c++  java
  • Django:之安全、国际化和session

    Django 安全

    以下是关于Django安全的一些特征,它包括如何使基于Django的网站的一些建议。

    关于安全的官方文档:https://docs.djangoproject.com/en/dev/#security

    官方文档包括以下几个方面:

    Django表单用在模版中的时候我们会加一句{% csrf_token %}

    Django 国际化

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

    Django支持国际化,多语言。Django的国际化是默认开启的,如果您不需要国际化支持,那么您可以在您的设置文件中设置USE_I18N = False,那么Django会进行一些优化,不加载国际化支持机制。

    NOTE: 18表示Internationlization这个单词首字母I和结尾字母N之间的字母有18个。I18N就是Internationlization的意思。

    Django完全支持文本翻译,日期时间数字格式和时区。

    本质上讲,Django做了两件事:

    1、它允许开发者指定要翻译的字符串

    2、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']来检查用户是否登陆,当退出的时候,删除掉它。

  • 相关阅读:
    利用DTrace实时检测MySQl
    改进MySQL Order By Rand()的低效率
    RDS for MySQL查询缓存 (Query Cache) 的设置和使用
    RDS For MySQL 字符集相关说明
    RDS for MySQL 通过 mysqlbinlog 查看 binlog 乱码
    RDS for MySQL Mysqldump 常见问题和处理
    RDS for MySQL Online DDL 使用
    RDS MySQL 表上 Metadata lock 的产生和处理
    RDS for MySQL 如何使用 Percona Toolkit
    北京已成为投融资诈骗重灾区:存好骗子公司黑名单,谨防上当!
  • 原文地址:https://www.cnblogs.com/wulaoer/p/5342866.html
Copyright © 2011-2022 走看看