Django: 之用戶注冊、緩存和靜態網頁


Django 用戶注冊系統

Django 的源碼中已經有登錄,退出,重設密碼等相關的視圖函數,在下面這個app中

django.contrib.auth

可以點擊對應的版本查看相關源代碼:1.9  1.8  1.7  1.6  1.5  1.4

一、創建一個wulaoer項目

django-admin startproject wulaoer

打開wulaoer/setting.py可以看到django.contrib.auth 已經在 INSTALLED_APPS中:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

注:各版本的Django生成的文件可能有些差異,請按照你的Django版本為准。

二、修改urls.py [此步閱讀即可,不需要照着做]

from django.conf.urls import url, include
from django.contrib import admin
from django.contrib.auth import urls as auth_urls
 
 
urlpatterns = [
    url(r'^accounts/', include(auth_urls, namespace='accounts')),
    url(r'^admin/', admin.site.urls),
]

我們引入來django.contrib.auth.urls中的內容,改好后,我們試着訪問一下:

http://127.0.0.1:8000/accounts/login/ 報錯信息說:

三、准備相關的模版文件[此步閱讀即可,不需要照着做]

Django默認配置下會自動尋找app下的模版,但是Django.contrib.auth這個官方提供的,我們修改這個app不太容易,我們可以建立一個公用的模版文件夾。

3.1 添加一個公用的放模版的文件夾

Django 1.8 及以上的版本settings.py,修改TEMPLATES中的DIRS

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

Django 1.7 及一下的版本,修改TEMPLATE_DIRS:

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

注:如果是舊的項目已經存在公用的,可以不添加上面的目錄

這個文件夾需要我們手工創建出來,創建后如下:

wolf@mac ~/workspace/dj19/prj/wulaoer $ pwd   
/Users/tu/workspace/dj19/prj/wulaoer
 
wolf@mac ~/workspace/dj19/prj/wulaoer $ tree .
.
├── db.sqlite3
├── manage.py
├── templates  # 手工創建的模板文件
└── wulaoer
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
 
2 directories, 6 files

3.2 模版文件

熟悉Django的同學知道,Django的后台是有登錄,重設密碼等功能,那么在django.contrib.admin中應該是有相應的模版文件的,一找,果然有,查看鏈接

我們把這些文件拷貝出來。

需要注意的是,有人已經按照類似的方法,做成了一個包,地址在這里:https://github.com/mishbahr/django-users2

這個包比較完善里,我們沒必要重新發明輪子,上面的示例只是讓你明白,這個包其實是有官方的django.contrib.auth改進后做出來的。

四、用django-users2這個包來實現登陸注冊及找回密碼等功能。

django-users2 這個包在 Django 1.5 - Django 1.9 中使用都沒有問題。

4.1 安裝

pip install django-users2

4.2 把users這個app加入到INSTALLES_APPS

INSTALLED_APPS = (
    ...
    'django.contrib.auth',
    'django.contrib.sites',
    'users',
    ...
)
 
 
AUTH_USER_MODEL = 'users.User

AUTH_USER_MODEL是替換成自定義的用戶認證,參考這里

4.3 修改urls.py

urlpatterns = patterns('',
    ...
    url(r'^accounts/', include('users.urls')),
    ...
)

4.4 同步數據,創建相應的表

python manage.py syncdb
 
Django 1.7 及以上
python manage.py makemigrations
python manage.py migrate

4.5 配置登陸注冊的一些選項,找密碼時發郵件的郵箱

USERS_REGISTRATION_OPEN = True
 
USERS_VERIFY_EMAIL = True
 
USERS_AUTO_LOGIN_ON_ACTIVATION = True
 
USERS_EMAIL_CONFIRMATION_TIMEOUT_DAYS = 3
 
# Specifies minimum length for passwords:
USERS_PASSWORD_MIN_LENGTH = 5
 
# Specifies maximum length for passwords:
USERS_PASSWORD_MAX_LENGTH = None
 
# the complexity validator, checks the password strength
USERS_CHECK_PASSWORD_COMPLEXITY = True
 
USERS_SPAM_PROTECTION = False  # important!
 
 
#  ---------------------------------------------------------
#  Email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
 
EMAIL_USE_TLS = False
EMAIL_HOST = 'smtp.wulaoer.org'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'mail@wulaoer.org'
EMAIL_HOST_PASSWORD = 'xxxx'
DEFAULT_FROM_EMAIL = 'mail@wulaoer.org'
#  ---------------------------------------------------------

這樣登陸注冊和找回密碼功能應該就沒有問題了。

另外大家也可以用 http://django-userena.readthedocs.org/en/latest/ 這個來實現。

Django 緩存系統

Django 官方關於cache的介紹:https://docs.djangoproject.com/en/1.6/topics/cache/

Django 是動態網站,一般來說需要實時地生成訪問的網頁,展示給訪問訪問者,這樣,內容可以隨時變化,但是從數據庫讀多次把所需要的數據取出來,要比從內存或者硬盤等一次讀出來付出的成本很多。

緩存系統工作原理:

對於給定多網址,嘗試從緩存中找到網址,如果頁面在緩存中,直接返回緩存的頁面,如果緩存中沒有一系列操作(比如查數據庫)后,保存生成的頁面內容到緩存系統以供下次使用,然后返回生成到頁面內容。

Django settings 中cache默認為

{
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

也就是默認利用本地的內存來當緩存,速度很快,當然可能出來內存不夠用的情況,其它的一些內建可用的Backends有

'django.core.cache.backends.db.DatabaseCache'
'django.core.cache.backends.dummy.DummyCache'
'django.core.cache.backends.filebased.FileBasedCache'
'django.core.cache.backends.locmem.LocMemCache'
'django.core.cache.backends.memcached.MemcachedCache'
'django.core.cache.backends.memcached.PyLibMCCache'

在github上也有用redis做Django的緩存系統的開源項目:https://github.com/niwibe/django-redis 

利用文件系統來緩存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

利用數據庫來緩存,利用命令創建相應的表:python manage.py createcachetable cache_table_name

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table_name',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

下面用一些實例來說明如何使用Django緩存系統

一般來說我們用Django來搭建一個網站,要用到數據庫等。

from django.shortcuts import render
def index(request):
    # 讀取數據庫等 並渲染到網頁
    # 數據庫獲取的結果保存到 queryset 中
    return render(request, 'index.html', {'queryset':queryset})

 像這樣每次訪問都要讀區數據庫,一般的小網站沒有什么,當訪問量大的時候,就會有很多次的數據庫查詢,肯定會造成訪問速度變慢服務器資源占用較多等問題。

from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
@cache_page(60 * 15) # 秒數,這里指緩存 15 分鍾,不直接寫900是為了提高可讀性
def index(request):
    # 讀取數據庫等 並渲染到網頁
    return render(request, 'index.html', {'queryset':queryset})

當使用了cache后,訪問情況變成了如下:

訪問一個網址時, 嘗試從 cache 中找有沒有緩存內容
如果網頁在緩存中顯示緩存內容,否則生成訪問的頁面,保存在緩存中以便下次使用,顯示緩存的頁面。
given a URL, try finding that page in the cache
if the page is in the cache:
    return the cached page
else:
    generate the page
    save the generated page in the cache (for next time)
    return the generated page

Memcached是目前Django可用的最快的緩存,

另外,Django還可以共享緩存。

Django 生成靜態頁面

如果網站的流量過大,每次訪問時都動態生成,執行SQL語句,消耗大量服務器資源,這時候可以考慮生成靜態頁面,生成靜態頁面很簡單,下面是一個例子:

from django.shortcuts import render
from django.template.loader import render_to_string
import os
 
 
def my_view(request):
    context = {'some_key': 'some_value'}
 
    static_html = '/path/to/static.html'
 
    if not os.path.exists(static_html):
        content = render_to_string('template.html', context)
        with open(static_html, 'w') as static_file:
            static_file.write(content)
 
    return render(request, static_html)

上面的例子中,當用戶訪問時,如果判斷沒有靜態頁面就自動生成靜態頁面,然后返回靜態文件,當靜態文件不存在時就重新成成。也可以用一個文件夾,比如在project下建一個static_html文件夾,把生成的靜態文件都放在這里,讓用戶像訪問靜態文件那樣訪問頁面。

更佳辦法

但是一般情況下都不需要生成靜態頁面,因為Django有緩存功能,使用Django Cache(緩存)就相當於生成靜態頁面,而且還有自動更新的功能,比如30分鍾刷新一下頁面的內容。

用Django管理靜態網站內容

如果服務器上不支持Django環境模擬可以在本地上搭建一個Django環境,然后生成靜態頁面,把這些頁面放到不知Django的服務器上去,在本地更新,然后上傳到服務器,用Django來管理和更新網站的內容,也是一個不錯的做法,還可以更安全,聽說有很多黑客都是這樣做的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM