8-django——发送邮件和缓存

发送邮件

概述:Django中内置了邮件发送功能,发送邮件须要使用SMTP服务,经常使用的免费服务器有:16三、12六、QQcss

  • 注册并登录163邮箱
  • 打开POP3/SMTP服务与IMAP/SMTP服务
  • 重置受权密码

配置

#邮件发送
EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST='smtp.163.com'
EMAIL_PORT=25
#发送邮件的邮箱
EMAIL_HOST_USER='clement@163.com'
#邮箱的受权密码
EMAIL_HOST_PASSWORD='a12345678'
#收件人看到的发件人
EMAIL_FROM='DAI<clement@163.com>'

发送

send_mail(subject, message, from_email, recipient_list)html

from django.conf import settings
from django.core.mail import send_mail
def sendMail(request):
    msg = '<a href="http://127.0.0.1:8000/index/">点击激活</a>'
    send_mail("注册激活","",settings.EMAIL_FROM,["clement@163.com"],html_message=msg)
    return HttpResponse("邮件已发送")

缓存

概述:对于中等流量的网站来讲,尽量的减小开销是很是必要的。缓存数据就是为了保存那些须要不少计算资源的结果,这样的话就没必要在下次重复消耗计算资源。获取数据的数据的时候就是去缓存中拿,拿到了直接返回,没拿到就去数据库中查询,筛选,而后缓存到数据库, 而后返回给模板。python

Django自带了一个健壮的缓存系统来保存动态页面,避免每次请求都从新计算。redis

Django提供了不一样级别的缓存策略,能够缓存特定的视图的输出、能够仅仅缓存那些很难计算出来的部分、或者缓存整个网站算法

目的:优化数据结构;优化了对数据的查询;筛选,过滤;减小了对磁盘的IO数据库

官方文档:https://docs.djangoproject.co...django

设置缓存

经过设置决定把数据缓存在哪里,是数据库中、文件系统中仍是内存中缓存

默认缓存(内存)

CACHES={
    'default':{
        'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'TIMEOUT':60
    }
}

参数TIMEOUT:缓存的默认过时时间,以秒为单位服务器

  • 默认为300秒
  • 设置为None,表示永不过时
  • 设置为0形成缓存当即失效

文件缓存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': 'c:/foo/bar',
        'TIMEOUT':300,
    }
}

数据库缓存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': '60',
        'KEY_PREFIX': 'bbs',
        'VERSION': '1',
        'OPTIONS': {
            'MAX_ENTRIES': '300'
        }
    }
}

建立缓存表: python manage.py createcachetable网络

redis缓存

官网: http://django-redis-chs.readt...

redis操做文档:http://redisdoc.com

默认使用redis中的1数据库,但能够指定使用哪一个db

安装pip install django-redis

配置

# ---配置Session和Cache---
CACHES={
    'default':{
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION':'127.0.0.1:6379/12', # 指定db12
        'TIMEOUT':60,
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',  # 指定链接Redis的客户端类
            # 'PASSWORD': 'mysecret',
             # "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
             # "SOCKET_TIMEOUT": 5,  # in seconds
             # "CONNECTION_POOL_KWARGS": {"max_connections": 100},
             # "CONNECTION_POOL_CLASS": "myproj.mypool.MyOwnPool",
        }
    }
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# --结束Session和Cache配置
参数 解释
SOCKET_CONNECT_TIMEOUT socket 创建链接超时设置
SOCKET_TIMEOUT 链接创建后的读写操做超时设置
CONNECTION_POOL_KWARGS 设置链接池的最大链接数量
CONNECTION_POOL_CLASS 本身的链接池子类

链接池

django-redis 使用 redis-py 的链接池接口, 并提供了简单的配置方式. 除此以外, 你能够为 backend 定制化链接池的产生。redis-py 默认不会关闭链接, 尽量重用链接。

链接池概念

为何使用链接池?

首先Redis也是一种数据库,它基于C/S模式,所以若是须要使用必须创建链接,稍微熟悉网络的人应该都清楚地知道为何须要创建链接,C/S模式自己就是一种远程通讯的交互模式,所以Redis服务器能够单独做为一个数据库服务器来独立存在。假设Redis服务器与客户端分处在异地,虽然基于内存的Redis数据库有着超高的性能,可是底层的网络通讯却占用了一次数据请求的大量时间,由于每次数据交互都须要先创建链接,假设一次数据交互总共用时30ms,超高性能的Redis数据库处理数据所花的时间可能不到1ms,也便是说前期的链接占用了29ms,链接池则能够实如今客户端创建多个连接而且不释放,当须要使用链接的时候经过必定的算法获取已经创建的链接,使用完了之后则还给链接池,这就免去了数据库链接所占用的时间。

配置默认链接池

配置默认链接池很简单, 你只须要在 CACHES 中使用 CONNECTION_POOL_KWARGS 设置链接池的最大链接数量便可

你能够得知链接池已经打开多少链接:

from django.core.cache import get_cache
from django_redis import get_redis_connection

r = get_redis_connection("default")  # Use the name you have defined for Redis in settings.CACHES
connection_pool = r.connection_pool
print("Created connections so far: %d" % connection_pool._created_connections)

使用本身的链接池子类

有时你想使用本身的链接池子类. django-redis 提供了 CONNECTION_POOL_CLASS 来配置链接池子类

myproj/mypool.py

from redis.connection import ConnectionPool

class MyOwnPool(ConnectionPool):
    # Just doing nothing, only for example purpose
    pass

缓存的用法

单个view缓存

django.views.decorators.cache.cache_page装饰器用于对视图的输出进行缓存

from django.views.decorators.cache import cache_page

@cache_page(60 * 2)
def index(request):
    # return HttpResponse("sunck is a good man")
    return HttpResponse("sunck is a nice man")
参数:
timeout : 有效时长  # we've written it as 60 * 15 for the purpose of readability
cache: 缓存到哪个库中;不多使用;针对于系统配置了多个缓存
       如: @cache_page(timeout=60, cache='filecache')
key_prefix: 前缀

模板片断缓存

cache标签: 参数

  • 缓存时间,以秒为单位
  • 给缓存片断起名字
{#{% load static from staticfiles %}#}
{% load static %}
{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>

{#    <link rel="stylesheet" type="text/css" href="/static/css/index.css">#}
    <link rel="stylesheet" type="text/css" href="{% static 'css/index.css' %}">
</head>
<body>
    <h1>sunck is a nice man</h1>
    {% cache 120 sunck %}
        <h1>nice man</h1>
        <!--<h1>good man</h1>-->
    {% endcache %}
</body>
</html>

原生cache

from django.core.cache import cache
查看全部缓存的key: cache.keys('*')
设置:cache.set(键, 值, 有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear()
>>> cache.set_many({'a': 1, 'b': 2, 'c': 3})
>>> cache.getmany(['a','b','c'])
{'a': 1, 'b': 2, 'c': 3}
cache.delete_pattern("foo_*") # 全局通配符
相关文章
相关标签/搜索