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_*") # 全局通配符
相關文章
相關標籤/搜索