Django入门全套(第三部)

Posted 张岩林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django入门全套(第三部)相关的知识,希望对你有一定的参考价值。

前两部链接

本章内容:

  • Django 发送邮件
  • Django cookie
  • Django session
  • Django CSRF 

Django 发送邮件

我们常常会用到一些发送邮件的功能,比如有人提交了应聘的表单,可以向HR的邮箱发邮件,这样,HR不看网站就可以知道有人在网站上提交了应聘信息。今天我们尝试用django发送邮件做尝试

1、配置相关参数settings

往settings添加下面几行数据

EMAIL_BACKEND = \'django.core.mail.backends.smtp.EmailBackend\'

EMAIL_USE_TLS = False
# 邮箱服务器
EMAIL_HOST = \'smtp.163.com\'
# 端口号
EMAIL_PORT = 25
# 发件邮箱账号
EMAIL_HOST_USER = \'zhangyanlin8851@163.com\'
# 发件邮箱密码
EMAIL_HOST_PASSWORD = \'邮箱密码\'
# 发件人
DEFAULT_FROM_EMAIL = \'zhangyanlin<zhangyanlin8851@163.com>\'

下面是一些常用的邮箱参数:

2、官方事例

2.1、先看下官方给的例子

from django.core.mail import send_mail
 
send_mail(\'Subject here\', \'Here is the message.\', \'from@example.com\',
    [\'to@example.com\'], fail_silently=False)

2.2、发送多个邮件

from django.core.mail import send_mass_mail
 
message1 = (\'Subject here\', \'Here is the message\', \'from@example.com\', [\'first@example.com\', \'other@example.com\'])
message2 = (\'Another Subject\', \'Here is another message\', \'from@example.com\', [\'second@test.com\'])
 
send_mass_mail((message1, message2), fail_silently=False)

3、发送邮件

from django.shortcuts import render,HttpResponse
from django.conf import settings
from django.core.mail import EmailMultiAlternatives

def email(request):
    subject = \'来自张岩林的问候\'

    text_content = \'这是一封重要的邮件.\'

    html_content = \'<p>这是一封<strong>重要的</strong>邮件.</p>\'

    from_email = settings.DEFAULT_FROM_EMAIL

    msg = EmailMultiAlternatives(subject, text_content, from_email, [\'75501664@qq.com\'])

    msg.attach_alternative(html_content, "text/html")

    msg.send()

    return HttpResponse(\'OK\')

写完这段代码访问以下相对应得URL可以看看邮件有没有发送成功哟

Django Cookie

1、获取cookie

# 方式一
request.COOKIES[\'key\']
# 方式二
request.COOKIES.get(\'key\')
# 方式三
request.get_signed_cookie(key, default=RAISE_ERROR, salt=\'\', max_age=None)
# 参数:
    default: 默认值
    salt: 加密盐
    max_age: 后台控制过期时间

2、设置cookie

rep = HttpResponse(...) 或 rep = render(request, ...)
 
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt=\'加密盐\',...)
    参数:
        key,              键
        value=\'\',         值
        max_age=None,     超时时间
        expires=None,     超时时间(IE requires expires, so set it if hasn\'t been already.)
        path=\'/\',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
        domain=None,      Cookie生效的域名
        secure=False,     https传输
        httponly=False    只能http协议传输,无法被javascript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

Django Session

一、session使用

    def index(request):
        # 获取、设置、删除Session中数据
        request.session[\'k1\']
        request.session.get(\'k1\',None)
        request.session[\'k1\'] = 123
        request.session.setdefault(\'k1\',123) # 存在则不设置
        del request.session[\'k1\']
 
        # 所有 键、值、键值对
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
 
        # 用户session的随机字符串
        request.session.session_key
 
        # 将所有Session失效日期小于当前日期的数据删除
        request.session.clear_expired()
 
        # 检查 用户session的随机字符串 在数据库中是否
        request.session.exists("session_key")
 
        # 删除当前用户的所有Session数据
        request.session.delete("session_key")

二、session种类

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

1、数据库Session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

配置 settings.py
 
    SESSION_ENGINE = \'django.contrib.sessions.backends.db\'   # 引擎(默认)
     
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

2、缓存Session

配置 settings.py
 
    SESSION_ENGINE = \'django.contrib.sessions.backends.cache\'  # 引擎
    SESSION_CACHE_ALIAS = \'default\'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 
    SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存

3、文件Session

配置 settings.py
 
    SESSION_ENGINE = \'django.contrib.sessions.backends.file\'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                      
  
    SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存

4、缓存+数据库Session

数据库用于做持久化,缓存用于提高效率
 
配置 settings.py
 
    SESSION_ENGINE = \'django.contrib.sessions.backends.cached_db\'        # 引擎

5、加密cookie Session

配置 settings.py
     
    SESSION_ENGINE = \'django.contrib.sessions.backends.signed_cookies\'   # 引擎

6、session自定义验证登录,装饰器

def login(func):
    def wrap(request, *args, **kwargs):
        # 如果未登陆,跳转到指定页面
        if request.path == \'/index/\':
            return redirect(\'/login/\')
        return func(request, *args, **kwargs)
    return wrap

Django CSRF

一、简介

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

二、应用

1、普通表单

veiw中设置返回值:
   return render_to_response(\'Account/Login.html\',data,context_instance=RequestContext(request))  
     或者
    return render(request, \'xxx.html\', data)
  
html中设置Token:
  {% csrf_token %}

2、ajax

view.py

from django.template.context import RequestContext
# Create your views here.
    
def test(request):
  
    if request.method == \'POST\':
        print request.POST
        return HttpResponse(\'ok\')
    return  render_to_response(\'app01/index.html\',context_instance=RequestContext(request))

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    {% csrf_token %}
  
    <input type="button" onclick="Do();"  value="Do it"/>
  
    <script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
    <script src="/static/plugin/jquery/jquery.cookie.js"></script>
    <script type="text/javascript">
        var csrftoken = $.cookie(\'csrftoken\');
  
        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
        function Do(){
  
            $.ajax({
                url:"/app01/test/",
                data:{id:1},
                type:\'POST\',
                success:function(data){
                    console.log(data);
                }
            });
  
        }
    </script>
</body>
</html>

注:原文出处http://www.cnblogs.com/wupeiqi/articles/5237704.html

以上是关于Django入门全套(第三部)的主要内容,如果未能解决你的问题,请参考以下文章

Django入门全套(第一部)

🤖全套Java教程_Java基础入门教程,零基础小白自学Java必备教程🙋‍♂️002 # 第三单元 运算符方法入门 #

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化

HTML动画特效-小游戏(第三部)

Go 语言入门三部曲:能用 Go 写“生产-消费者”模型

Django rest_framewok框架的基本组件