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

  • 相关阅读:
    Python之路Day11
    Python之路Day10
    Python中需要注意的一些小坑
    Python之路Day09
    Python之路Day08
    关于谷歌浏览器安装非官方商城插件
    Python之路Day07
    Python之路Day06
    Python之路Day05
    Python 之路Day04
  • 原文地址:https://www.cnblogs.com/wulaoer/p/5342866.html
Copyright © 2020-2023  润新知