Django的MVC架构(4)

来源:互联网 发布:linux 硬盘空间扩容 编辑:程序博客网 时间:2024/06/07 02:53

我胡汉三又回来了:)

------那就不写满袖河山,写草草浮生百年------

今儿个总结下网站的session功能。session机制存在的目的就是为了可以让浏览器记住用户。
cookie是网站通过客户端的浏览器在某些限定的硬盘位置中写入某些数据:cookie是网站记住我们之前一些浏览行为的原因。Django设计网站时可以使用如下代码来检查客户端浏览器是否接受cookie:
def index(request, del_pass = None):    template = get_template('index.html')    if request.session.test_cookie_worked():        request.session.delete_test_cookie()        message = 'cookie supported!'    else:        message = 'cookie not supported!'    request.session.set_test_cookie()    html = template.render(locals())    return HttpResponse(html)
cookie的工作原理是每一次request前后相互独立的,因此再测试是否支持cookie写入功能时要先写入一次测试数据(request.set_test_cookie()),在下一次request时才能够读出来看看有没有之前写入的数据。
窗体类处理的标准化做法:
一开始检查是否以POST方法进入此函数,若是就以login_form = forms.LOginForm(request.POST)取得登陆的窗体属性,并使用login_form.is_valid()询问窗体属性的正确性:不正确则显示提示信息,否则request.POST[]来取得相关数据。cookie是request中的一个字典COOKIES。注销操作只需要把cookie删除并重新导向index.html就可以了,示例代码如下:
def logout(request):    response = redirect('/')#from django.shortcut import redirect    response.delete_cookie(key)    return response
设置cookie必须是在执行完HttpResponse之后,先以一个变量记录此实例(response = HttpRespoonse(html)),然后以response.set_cookie('key', value)形式把cookie放在response中。
session同样可以处理同一个浏览者跨网页的识别问题,而session把数据存放在服务端(cookie存放在客户端),客户端只存放一个识别的信息。session存在时间可通过set_expiry(value)来设置,该函数可设置的值和方式如下表:
value内容说明整数内容以秒为时间设置session过期时间datetime格式设置到指定的时间点就过期0浏览器关闭时过期None使用系统默认设置查询session期限的函数如下表:
函数名称说明get_expiry_age()以秒为单位,返回还有多长时间session过期get_expiry_date()返回session到期时刻get_expiry_at_brower_close()返回浏览器关闭时session是否到期,True或Falsesession中的数据存储依然是字典的形式。不同于cookie,session直接可以通过reqest设置:request.session['key'] = value,查询也可通过value = request.session['key']来取值。

许多暂时性的信息很有用,比如‘成功登陆’,Django针对这个功能提供了一个messages framework,只要from django.contrib import messages就可以通过它提供的函数和框架自动实现跨网页显示信息。主要提供两个函数:
from django.contrib import messagesmessages.add_messagfe(request, messages.INFO/DEBUG/SUCCESS/WARNING/ERROR, '想要显示的字符串')messages.get_messages(request)
其中,add_messages用来加上一段消息,消息内容默认分为以下几个等级:
DEBUG,INFO,SUCCESS,WARNING,ERROR
对应到几个消息等级也可以用以下函数来简化:
messages.debug(request, 'Debugging')
messages.info(request, 'Information')
messages.success(request, 'Success')
messages.warning(request, 'Warning')
messages.error(request, 'Error')
以上,我们可以通过session/cookie设计出浏览器是否记住用户的行为,若将Django用于admin管理网页这套系统中,程序可以进一步简化,不需自行设置session变量。
Django对象在auth.models中,使用之前需要导入:
from django.contrib.auth.models import User
User默认属性有username, password, email, first_name, last_name。创建用户的语句如下:
user = User.objects.create_user()
修改属性时也很简单:
user.last_name = 'balabala'user.save()
Django.contrib.auth提供了三个主要函数:authenticate, login, logout。
from django.contrib import authuser = authenticate(username, password)# 若user不为空,则可使用auth.login(request, user)#将此用户的数据存入session中
#auth.logout(request)来登出用户
之后我们可以使用request.user.is_authenticated()函数来检查用户是否已经登录。
由于django.contrib.authmodels中的User只提供了五个字段,往往不够用,有时需要增加新的字段:
class Profile(models.Model):    user = models.OneToOneField(User, on_delete = CASCADE)    new_attribute1 = balabala    new_attribute2 = balabala
OneToOneField有没有和ForeignField很像2333……OTOF也就是每个Profile只能和一个User对应。







原创粉丝点击