Django models,forms,session,cache,crsf,模板标签

前言:Django框架自带orm,会话管理,缓存机制,表单验证还提供了一套非常简单的模板标签使用。

1.Models

models <==> db,django支持由models创建数据库中表,同时也可以反向由数据库表生成models

from django.db import models
# models中field类型对应数据库定义的数据类型,初始化条件可以限定字段长度,是否允许空,是否允许null等
# Meta内部类则可映射数据库表名和定义返回数据的排序方式等,自定义对象输出数据

from django.db import models
# models中field类型对应数据库定义的数据类型,初始化条件可以限定字段长度,是否允许空,是否允许null等
class User(models.model):
      id = models.AutoField(verbose_name=u'id', primary_key=True)
      name = models.CharField(u'用户名', max_length=30, null=False, blank=False)
      password = models.CharField(u'密码', max_length=30, null=False, blank=False)
      class Meta:
        db_table = 'user'
      def __unicode__(self):
        return self.name

2.Forms 

django提供的forms模型支持表单渲染和数据验证,可以动态的创建所需要的表单。

  • feild - 类似与models中作用,可以定义表单元素的数据类型
  • widget - 渲染表单元素,通过定义form元素的属性,attr为关键字
from django import forms
# 该表单可以通过server端直接渲染成用户登录表单
class UserForm(forms.Form):
    name = forms.CharField(label=u'用户名', max_length=30, required=True, help_text=u'*手机号或者邮箱', 
                           widget=forms.TextInput(attrs={"class":"input"}))
    password = forms.CharField(label=u'密码',max_length=30, required=True, widget=forms.PasswordInput(attrs={"class":"input"}))

3.模板标签,CSRF

django模板标签提供了html继承,子模块block的重写和继承提供了极大的方便前端页面的设计

**urls.py中定义路由别名,可以在模板中直接使用别名

**{% csrf_token %}django返回一个随机token用于防御跨站伪造请求,当settings.py配置了csrf的中间件时,则全局生效,

提交表单数据时会校验token,如果没有则会抛出token异常。当然可以通过@csrf_exempt去允许跨站请求

urlpatterns = patterns('',
    url(r'^$', 'views.login',name='index'),
)
{% extends 'base.html' %}
{# 用于加载urls对应url的别名,从而避免引用绝对路由地址 #}
{% load url from future %}
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    {# block标签可以实现模块的继承,重写 #}
    {# 而extends标签提供了继承整个html页面功能 #}
    <title>{% block title %}{% endblock %}</title>
    {# 子模板可以通过重写该模块加载自己所需的样式 #}
    {% block extra-style %}
        {# 该方法可以直接继承父模板的模块 #}
        {{ block.super }}
    {% endblock %}
</head>
<body>
    {# url标签可以翻译出server端urls对应别名 #}
    <a href="{% url 'index' %}"><img src="/static/img/logo.image"></a>
    <form action="/" method="post" id="login-form">
        {% csrf_token %}
        {# django模板标签可以直接使用if,for进行数据呈现 #}
        {% if error_message %}
            <p class="error">{{error_message}}</p><br/>
        {% endif %}
        {% for feild in form %}
            {{ field.label_tag }}
            <p class="form_field">{{ field }}</p>
        {% endfor %}
    </form>
    {# 子模板可以通过重写该模块加载自己所需的js #}
    {% block extra-script %}{% endblock %}
    {# include标签用于引入公共模板 #}
    {% include 'footer.html' %}
</body>
</html>
4.表单验证,session, cache

django拥有表单验证和用户认证模块,使用非常方便

session的使用方式默认为数据库,在settings.py中设置。使用方式key-value的形式储存。

  • SESSION_SAVE_EVERY_REQUEST 
    如果设置为True, django为每次request请求都保存session的内容,默认为False。
  • SESSION_EXPIRE_AT_BROWSER_CLOSE
    如果设置为True,浏览器已关闭session就过期了,默认为False。
  • SESSION_COOKIE_AGE
    设置SESSION的过期时间,单位是秒,默认是两周。

Cache缓存使用数据库方式,还可以支持分布式缓存,文件缓存,本地缓存, 自定义方式

数据库方式

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_cache_table'
    }
}

cache的使用

from django.core.cache import cache
# key-value设置cache
cache.set('key','value',timeout=60 * 60 * 12)
# 取值
cache.get('key',None)

@cache_page(60*10)使用装饰器进行视图缓存,10分钟超时。

login.py

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.contrib.auth.models import User
from django.contrib.auth import authenticate,login
from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext
from forms import *



# 该装饰器用于防止跨站请求
@csrf_protect
def login_account(request):
    # 通过login_form.field['字段名']方式可以获取表单元素
    login_form = Loginform()
    if request.method == 'GET':
        return render_to_response('login.html', {'form':login_form}, context_instance=RequestContext(request))
    elif request.method == 'POST':
        # 1 验证表单 2 验证帐号 3 验证密码
        post_form = Loginform(request.POST)
        # 根据form定义的表单数据类型校验提交的数据是否合法
        if post_form.is_valid():
            page_dict = {}
            try:
                # 使用django自带user表进行校验用户账号是否存在
                # form.cleaned_data 根据form中字段类型进行取值,调用该方法前要进行调用form.is_valid验证表单合法
                user = User.objects.get(username=post_form.cleaned_data['username'])
            except :
                error_message = u'用户名不存在。'
                return render_to_response('login.html', {'error_message': error_message, 'form': login_form}, 
                                          context_instance=RequestContext(request))
            # 使用django自带user授权模块进行用户账号密码校验,底层是校验username和password的hash值
            user = authenticate(username=login_form.cleaned_data['username'], 
                                password=login_form.cleaned_data['password'])
            if user is not None:
                login(request, user)
                # 设置session过期
                request.session.set_expiry()
                request.session["user_info"] = user
                return render_to_response('index.html', page_dict, context_instance=RequestContext(request))
            else:
                error_message = u'请输入正确的密码。请注意密码是大小写敏感的.'
                return render_to_response('login.html', {'error_message':error_message,'form':login_form},
                                          context_instance=RequestContext(request))
        # form invalid
        else:
            error_message = u'请检查输入字段。'
            return render_to_response('login.html', {'error_message':error_message,'form':login_form},
                                      context_instance=RequestContext(request))


def logout(request):
    login_form = Loginform()
    from django.contrib.auth.views import logout
    logout(request,{'template_name':'login.html'})
    return render_to_response('login.html', {'form':login_form}, context_instance=RequestContext(request))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值