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来管理和更新网站的内容,也是一个不错的做法,还可以更安全,听说有很多黑客都是这样做的。

Django: 之用户注册、缓存和静态网页的更多相关文章

  1. wsgiref模块,动静态网页,jinja2模块,django

    基于wsgiref模块搭建服务端 from wsgiref import simple_server def run(request, response): """ :p ...

  2. 第一次在Django上编写静态网页

    新建一个Python Django工程: Win+R进入cmd命令界面,并cd到指定工程目录下,比如我的工程目录是E:\wamp\Apache24\www\ 输入E: 跳转E盘 输入cd wamp\A ...

  3. Django加载静态网页模板

    Django加载静态网页模板 步骤: 第一步:在子系统blog根目录下新建模版目录templates,里面新建一个login.html <!DOCTYPE html> <html l ...

  4. Django实战-用户注册和登陆系统

    1.环境搭建和创建项目 1.环境搭建 每当我们开始一个新项目的时候,通常都会搭建一个全新.独立.隔离的项目环境,这样做的好处自然不必多说.有很多种建立项目虚拟环境的工具,使用比较普遍的是Python中 ...

  5. Django 中的缓存问题

    Django 中的缓存问题 简单介绍 ​ 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. ​ 当一个网站的用户访问量很大的 ...

  6. Django实现内容缓存

    1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...

  7. Django 配置文件settings注解(含静态文件和上传文件配置)

    基于Django1.11配置文件settings.py import os import sys # Build paths inside the project like this: os.path ...

  8. django 项目运行时static静态文件不能加载问题处理

    一.首先检查网页中的加载路径是否正确,如果和文件所在路径不一致,就把html改下路径 二.加载路径和文件实际路径一致,看下配置文件: STATIC_URL = '/static/'STATIC_ROO ...

  9. Django组件补充(缓存,信号,序列化)

    Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...

随机推荐

  1. redis10--主从模式

    redis的主从模式(1)介绍redis存储数据是在内存中运行的,运行速度比关系型数据库要快一些.而且它具有SortSet/Hash等具有特色的数据类型,这是其它数据库无法比拟的.redis有增删改查 ...

  2. Xcode8注释有时会失效的解决方法

    1.苹果开发解决了xcode ghost,而且Xcode8也取消了三方插件的功能,所以注释有时会失效,解决办法终端运行命令:sudo /usr/libexec/xpccachectl  回车 +  输 ...

  3. 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]

      学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...

  4. unity 隐藏GameObject的方法(转)

    改position,移到视野外,推荐,最节省 gameObject.SetActive (false); //要提前引用,要不你就改不回来了... renderer.enabled = false; ...

  5. 通过SvcUtil.exe 生成 Wcf 客户端代理

    WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用. SvcUtil.exe ...

  6. MySQL命令出现字符错误提示原因

    ERROR 2019 (HY000): Can't initialize character set gb2312 搞了好半天,MySQL都重装了两次,号悲剧... 之前设置了系统编码全都是UTF-8 ...

  7. Android实现图片宽度100%ImageView宽度且高度按比例自动伸缩

    在ListView中为了实现图片宽度100%适应ImageView容器宽度,让高度自动按比例伸缩功能,查了很多资料,搞了一下午都没找出个现成的办法,不过貌似有个结论了,就是: Android自身不能实 ...

  8. Chapter 2 Open Book——23

    Mike interrupted us then — he was planning an epic battle of the blizzard in the parking lot after s ...

  9. Dokan[转]

    原文地址:http://www.cnblogs.com/xxonehjh/p/3634889.html 因工作需要,最近与同事合作使用Dokan开发了一个虚拟磁盘的简单程序,初步实现了远程目录映射到本 ...

  10. 【转发】彻底理解 JS 中 this 的指向

    为什么要学习this?如果你学过函数式编程,面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章,当然如果你有兴趣也可以看看,毕竟这是js中必须要掌握的东西. 例子1: f ...