前言: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))