1. 程式人生 > >85 快取, 驗證碼 序列化

85 快取, 驗證碼 序列化

主要內容:http://www.cnblogs.com/maple-shaw/articles/7563029.html

1 快取: 把資料存在某個地方, 下次再讀取的時候不用再去原位置讀取

    快取即是將一個某個views的返回值儲存至記憶體或者是memcache中, 在你所設定的時間內, 如果有人再來訪問的時候, 則不會再執行view中的操作, 而是直接從記憶體或者memcache中之前的快取的內容中拿到.

  jango提供的六種快取方式: 見老師部落格:

  1: 快取應用在檢視中:  粒度適中

    先在settings中設定

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        'LOCATION': 'unique-snowflake',
        'TIMEOUT': 300,  # 快取超時時間(預設300,None表示永不過期,0表示立即過期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大快取個數(預設300)
            'CULL_FREQUENCY': 3,  # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3)
        },
    }
}

    2 接著寫url, 檢視函式, HTML檔案

from django.views.decorators.cache import cache_page
@cache_page(15)
def user_list(request):
    print('this is user')
    all_user = models.User.objects.all()
    return render(request, 'user.html', {'all_user': all_user})

    結論: 在15 秒之內訪問該檢視, 直接從快取中取值, 不走資料庫, 提高效率

  2 快取在檔案中

    1 settings裡的配置, views裡不變

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': 'C:\cache' ,
        'TIMEOUT': 300,  # 快取超時時間(預設300,None表示永不過期,0表示立即過期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大快取個數(預設300)
            'CULL_FREQUENCY': 3,  # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3)
        },
    }
}

  3 全站應用:  力度最大

    setings裡的配置:

MIDDLEWARE = [
		'django.middleware.cache.UpdateCacheMiddleware',
		# 其他中介軟體...
		'django.middleware.cache.FetchFromCacheMiddleware',
				]

    

  4 區域性應用: 粒度最細

    用法:  先在模板中{% load cache%}

        使用快取: {% cache 5 '隨意的字串'%}快取內容{%endcache%}

    檢視中的用法:

# 區域性應用快取
# 此時應該把中介軟體中的全站的應用給登出掉
def user_list(request):
    now = time.time()
    all_user = models.User.objects.all()
    return render(request, 'user.html', {'all_user': all_user, 'now': now})

    模板中的用法:

<body>
{{ now }}
<ul>
    {% cache 5 'asss' %}
        {{ now }}
        {% for user in all_user %}
            <li>{{ user.name }}-{{ user.age }}</li>
        {% endfor %}
    {% endcache %}
</ul>
</body>

2  序列化:關於Django中的序列化主要應用在將資料庫中檢索的資料返回給客戶端使用者,特別的Ajax請求一般返回的為Json格式。

  1 , serializes

from django.core import serializers
# def user_list(request):
#     now = time.time()
#     all_user = models.User.objects.all()
#     print(all_user)
#     # <QuerySet [<User: User object>, <User: User object>, <User: User object>]>
#     data = serializers.serialize('json', all_user)
#     print('this si 序列化的結果', data)
#     #  [{"model": "app01.user", "pk": 1, "fields": {"name": "\u8bd7\u8bd7", "age": 28}},]

  2 , json.dumps, 由於queryset不支援dumps, 所以轉換成list

all_user = models.User.objects.all().values('name')
    # <QuerySet [{'name': '詩詩'}, {'name': '菲菲'}, {'name': '圓圓'}]>
    all_user1 = models.User.objects.all().values_list('name')
    ret = list(all_user1)
    # 把ret轉換成列表
    # [('詩詩',), ('菲菲',), ('圓圓',)]
    result = json.dumps(ret)
    print(result)
    # <QuerySet [('詩詩',), ('菲菲',), ('圓圓',)]>

 3 , 由於json.dumps時無法處理datetime日期,所以可以通過自定義處理器來做擴充套件,如:

import json
from datetime import datetime, date
data = [
    {"pk": 1, "name": "\u83b9\u83b9", "age": 18, 'birth': datetime.now()},
    {"pk": 2, "name": "\u5c0f\u5fae", "age": 16, 'birth': datetime.now()},
    {"pk": 3, "name": "\u5c0f\u9a6c\u54e5", "age": 8, 'birth': datetime.now()},
    {"pk": 4, "name": "qqq", "age": 5, 'birth': datetime.now()},
    {"pk": 5, "name": "www", "age": 5, 'birth': datetime.now()}
]

# 由於日期型別不支援json序列化, 所以自定義類來擴充套件:
class JsonCustomEncoder(json.JSONEncoder):

    def default(self, field):

        if isinstance(field, datetime):
            return field.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(field, date):
            return field.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, field)
print(json.dumps(data, cls=JsonCustomEncoder))

3 訊號:Django中提供了“訊號排程”,用於在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,訊號允許特定的傳送者去提醒一些接受者。

  1 : jango的內建訊號,見老師部落格

  2 : 用法:對於Django內建的訊號,僅需註冊指定訊號,當程式執行相應操作時,自動觸發註冊函式:註冊訊號,寫入與project同名的資料夾下的_init_.py檔案中,也是換資料庫引擎的地方。

from django.db.models.signals import pre_save, post_save
# 方法一
def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender, kwargs)
post_save.connect(callback)

  3 在建立物件的時候, 自動觸發註冊函式

def get_value(request):
    # users = models.User.objects.all().values('pk', 'name', 'age')
    users = models.User.objects.create(name='ale', age=12)
    # ret = serializers.serialize('json', users)
    # ret = serializers.serialize('json', users)
    return HttpResponse('ok')
#  觸發顯示的內容:
# xxoo_callback
# <class 'app01.models.User'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000026D2F38F898>, 'instance': <User: User object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

   自定義訊號見老師部落格

4  驗證碼: