Django 用戶註冊系統html
Django 的源碼中已經有登陸,退出,重設密碼等相關的視圖函數,在下面這個app中python
django.contrib.auth
能夠點擊對應的版本查看相關源代碼:1.9 1.8 1.7 1.6 1.5 1.4git
1、建立一個wulaoer項目github
django-admin startproject wulaoer
打開wulaoer/setting.py能夠看到django.contrib.auth 已經在 INSTALLED_APPS中:redis
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
注:各版本的Django生成的文件可能有些差別,請按照你的Django版本爲準。sql
2、修改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中的內容,改好後,咱們試着訪問一下:django
http://127.0.0.1:8000/accounts/login/ 報錯信息說:緩存
3、準備相關的模版文件[此步閱讀便可,不須要照着作]安全
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改進後作出來的。
4、用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來管理和更新網站的內容,也是一個不錯的作法,還能夠更安全,據說有不少黑客都是這樣作的。