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

  • 相关阅读:
    TCP/IP三次握手四次挥手
    注解(JDK1.5之后)
    枚举(JDK1.5之后)
    局部内部类
    非静态内部类
    静态内部类
    匿名内部类
    接口
    根父类:java.lang.Object
    native关键字
  • 原文地址:https://www.cnblogs.com/wulaoer/p/5313292.html
Copyright © 2011-2022 走看看