【文档说明】PythonWeb开发基础教程-第8章-Django工具课件.pptx,共(85)页,370.201 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2368.html
以下为本文档部分文字说明:
PythonWeb开发基础教程(Django版)第8章Django工具本章主要内容:Admin站点用户认证发送E-mail会话控制8.1Admin站点本节主要内容管理用户管理组管理模型8.1.1启用Admin站点要使用Admin站点,需先完成6个步骤的操作:注册应用、注册上
下文处理器、注册中间件、配置URL、迁移数据库和创建超级用户。在执行django-admin命令创建项目时,Django会自动完成前4个步骤。1.注册应用在settings.py项目配置文件的INSTALLED_APPS变量中注册Admin应用以及相
关的支持应用,示例代码如下。INSTALLED_APPS=['django.contrib.admin',#Admin站点'django.contrib.auth',#用户认证系统'django.contrib.
contenttypes',#模型权限'django.contrib.sessions',#会话管理'django.contrib.messages',#消息管理……]2.注册上下文处理器在TEMPLATES模板配置变量
的OPTIONS参数中包含auth和messages上下文处理器,示例代码如下。TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[],'APP_DIRS':True,'OPT
IONS':{'context_processors':['django.contrib.auth.context_processors.auth',#用户认证'django.contrib.messages.context_processors.message
s',#消息管理……],},},]3.注册中间件在模板配置变量MIDDLEWARE中包含AuthenticationMiddleware中间件和MessageMiddleware中间件,示例代码如下。MIDDL
EWARE=['django.contrib.auth.middleware.AuthenticationMiddleware',#用户认证'django.contrib.messages.middleware.MessageMiddleware',#
消息管理……]默认情况下,Admin站点使用英文。如果要使用中文,可注册本地化中间件,示例代码如下。MIDDLEWARE=['django.middleware.locale.LocaleMiddl
eware',#本地化中间件……]4.配置URL在urls.py文件中添加Admin站点的URL配置,示例代码如下。fromdjango.contribimportadminfromdjango.urlsimportpathur
lpatterns=[path('admin/',admin.site.urls),#Admin站点URL配置]启动开发服务器后,在浏览器中访问http://127.0.0.1:8000/admin5.迁移数据库A
dmin站点默认在数据库中保存相关数据。在访问Admin站点之前,应先执行数据库迁移操作,创建相关的数据表。例如,下面的命令在D盘创建项目chapter8,并执行数据库迁移操作。D:\>django-adminstartprojectchapter8D:\>cdchapter8D:\ch
apter8>pythonmanage.pymakemigrationsD:\chapter8>pythonmanage.pymigrate6.创建超级用户登录Admin站点的用户必须具有超级用户权限(is_superuser属性为True)或者具有访问Admin站
点的权限(is_staff属性为True)。下面的命令为项目创建超级用户。D:\chapter8>pythonmanage.pycreatesuperuserUsername(leaveblanktouse'xbg'):adminEmailaddress:Pas
sword:Password(again):Superusercreatedsuccessfully.8.1.2管理用户登录Admin站点演示8.1.3管理组登录Admin站点演示8.1.4管
理模型默认情况下,Admin站点不提供模型管理功能。要在Admin站点中管理应用中的模型,需要修改应用的admin.py文件,在文件中注册模型。实例:为本章实例项目添加一个应用,并在应用中定义模型
,然后在Admin站点中管理该模型。1.为本章实例项目添加应用在Windows命令行中进入项目主文件夹,执行下面的命令创建test应用。D:\chapter8>pythonmanage.pystartapptest2.定义模型修改test应用中的model
s.py文件,定义模型,代码如下。fromdjango.dbimportmodelsclassperson(models.Model):name=models.CharField(max_length=8)age
=models.SmallIntegerField()3.注册应用修改项目配置文件settings.py,在INSTALLED_APPS变量中添加test应用,示例代码如下。INSTALLED_APPS=[……'test',]4.执行数据库迁移操作执行下面的命令完成数
据库迁移操作。D:\chapter8>pythonmanage.pymakemigrationsD:\chapter8>pythonmanage.pymigrate5.注册模型修改应用的admin.py文件,注册模型,代码如下。fromdjango.cont
ribimportadminfrom.modelsimportpersonadmin.site.register(person)#注册模型6.在Admin站点中管理模型8.2用户认证本节主要内容用户认证相关模型控制台用户管理内置认证视图自定义视
图中的身份认证限制页面登录访问限制页面访问权限8.2.1用户认证相关模型Django使用内置的User、Permission和Group模型来管理用户认证的相关数据。1.User模型User模型用于管理用户数据,模型
包含的字段如下。username:用户名,必填字段。最长150个字符。可以包含字母、数字、_、@、+、.和-等字符。first_name:名字,可选字段。最长30个字符。last_name:姓氏,
可选字段。最长150个字符。email:电子邮件地址,可选字段。password:存储密码的哈希值,可选字段。密码可包含任意字符。groups:多对多关系,可选字段。关联用户组。user_permissions:多对多关系,可选字段。
关联用户权限。is_staff:是否允许访问Admin站点,可选字段。为True时表示账户可以访问Admin站点。is_active:是否为活动账户,可选字段。为True时表示用户账户为活动账户,非活动账户被禁止访
问。is_superuser:是否为超级用户,可选字段。为True时表示用户具有所有权限,否则为普通用户。last_login:用户上次登录的日期时间,可选字段。date_joined:创建账户的日期时间,可选字段。在数据库中,User模型对应的数据表为a
uth_user2.Permission模型Permission模型用于管理权限数据,模型包含的字段如下。name:权限名称,必填字段。最长255个字符。content_type:引用数据表django_content_type的id字段,必填字段。数据表django_cont
ent_type保存应用包含的模型记录。codename:用于编程的权限名称,必填字段。最长100个字符。在数据库中,Permission模型对应的数据表为auth_permission3.Group模型Group模型用于管理组数据,模型包含的字段如下。name:组名称,必填字段。最长80
个字符。permissions:多对多关系,关联权限。在数据库中,Group模型对应的数据表为auth_group4.模型关系User模型与Permission模型之间是多对多关系,该关系在数据库中对应的数据表为auth_user_user_permissionsUser模型与Group模
型之间是多对多关系,该关系在数据库中对应的数据表为auth_user_groupsGroup模型与Permission模型之间是多对多关系,该关系在数据库中对应的数据表为auth_group_permissions8.2.2控制台用户管理可在Admin站点中交互式地完成添加
、删除和修改等用户管理操作,详细内容请参考8.1.2节。本节主要介绍如何通过代码完成用户管理。1.创建用户调用create()方法创建User对象,示例代码如下。>>>user=User.objects.create(
username='testuser')>>>user.set_password('123456')>>>user.save()注意,为用户设置密码应调用set_password()方法,该方法将明文密码转换成的哈希值存入password
字段。可调用User模型提供的create_user()和create_superuser()方法来创建用户,示例代码如下。>>>user=User.objects.create_user('testuser3','test@admin.net','123456')>>>use
r=User.objects.create_superuser('testuser4','test4@admin.net','123456')create_user()方法用于创建普通用户,create_superuser()方法用
于创建超级用户。2.修改用户可通过模型对象修改用户相关属性,示例代码如下。>>>user=User.objects.get(username='testuser')>>>user.email='123456@qq.com'>>>user.save()3.删除用户调用模
型对象的delete()方法可删除用户,示例代码如下。>>>user=User.objects.get(username='test1')>>>user.delete()(1,{'admin.LogEntry':0,'auth.User
_groups':0,'auth.User_user_permissions':0,'auth.User':1})4.验证用户authenticate()方法将用户名和密码作为参数来验证用户。如果用户名和密码正确,方法返回关联用户名的User模型对象;未通过验证时,返回None。例如:>
>>fromdjango.contrib.authimportauthenticate>>>user=authenticate(username='testuser',password='123456')
>>>print(user)Testuser>>>user=authenticate(username='testuser',password='456')>>>print(user)None5.设置权限User模型与Permission模型之间是多对多关
系,可以从关系的两端为用户设置权限。通过User对象设置权限,示例代码如下。>>>fromdjango.contrib.auth.modelsimportPermission>>>admins=Permission.objects.filter(codename__endswith
='permission')#获得权限>>>user=User.objects.get(username='testuser')>>>user.user_permissions.set(admins)#设置权限>>>forpinuser.user_permissions.all():
#查看权限...print(p.codename,p.name)...add_permissionCanaddpermissionchange_permissionCanchangepermissiondelete_permission
Candeletepermissionview_permissionCanviewpermission创建新权限,并授权给用户,示例代码如下。>>>fromtest.modelsimportperson>>>fromdjango.contrib.contenttypes.
modelsimportContentType>>>content_type_id=ContentType.objects.get_for_model(person)>>>p=Permission.objects.create(co
dename='can_analyse_person',name='能分析person数据',content_type=content_type_id)>>>user.user_permissions.add(p)#添加权限也可通过Permission模型为用户授权,
示例代码如下。>>>p=Permission.objects.get(codename='view_permission')#获得权限对象>>>p.user_set.add(user)#为权限添加关联用户>>>p.user_set.all()<QuerySet[<User:test
user>]>也可通过将用户加入组的方式来为用户授权,示例代码如下。>>>g=Group.objects.get(id=1)>>>g.user_set.add(user)#将用户加入组8.2.3内置认证视图Django在django.contrib
.auth.views.py中定义了几个用于登录、注销和密码管理的认证视图类。要使用内置的认证视图,首先需要在配置文件中添加下面的URL配置。urlpatterns=[path('accounts/',include('django.contr
ib.auth.urls')),#导入内置认证视图URL配置path('accounts/profile/',log_views.login_ok),#映射自定义的视图……]Django在默认视图中会
使用项目配置文件settings.py中设置的3个URL。LOGIN_URL:默认的登录URL,默认值为“/accounts/login/”LOGIN_REDIRECT_URL:默认的登录成功后转向的URL,默认值为“/a
ccounts/profile/”。Django没有为“/accounts/profile/”定义默认视图,上面代码中的“log_views.login_ok”是自定义的视图。LOGOUT_REDIRECT_URL:
默认的注销登录后转向的URL,默认值为None。1.登录视图LoginView登录视图用于处理用户登录操作,该视图默认的URL模式名称为login。在模板中可用{%url'login'%}获取登录视图URL。
在采用GET方法访问登录视图时,视图显示默认登录表单。当用户输入用户名和密码后再提交表单时,登录视图使用用户数据表auth_user中的数据验证用户名和密码是否正确。用户通过验证时,视图调用login()方
法,将用户的User对象写入Session对象,同时会在auth_user表中记录登录时间。用户未通过验证时,重新显示登录页面,并在页面中显示错误提示信息。登录视图会向模板传递下列变量。form:表单对象,默认为AuthenticationForm,可以使用自定义的登
录表单。next:登录成功后的重定向URL。通常,可以在模板中用一个隐藏的表单字段设置next,示例代码如下。<inputtype="hidden"name="next"value="{{next}}">site:当前站点ID,可在配置文件中用SITE_ID变量进
行设置。site_name:站点名称,视图将其设置为request.META['SERVER_NAME']。2.注销登录视图LogoutView注销登录视图用于处理用户注销登录操作,注销登录会删除Session中的用户信息。注销登录视图的默
认URL模式名称为logout。注销登录视图会向模板传递下列变量。title:字符串“Loggedout”。site:当前站点ID,默认为SITE_ID变量值。site_name:站点名称。注销登录视图使用Admin站点的默认注销登录模板。3.密码
修改视图PasswordChangeView密码修改视图用于修改用户密码,视图的默认URL模式名称为password_change。密码修改视图会向模板传递一个form变量,用于引用密码修改表单。默认情况下,密码修改视图使用Admin站点的密码修改模板
。修改前面的登录成功视图模板文件login_ok.html,添加修改密码链接,代码如下。{%ifuser.is_authenticated%}登录成功,欢迎:{{user.username}},登录时间:{{u
ser.last_login}}<br><p><ahref="{%url'password_change'%}">修改密码</a></p>{%ifperms.test%}……4.密码修改完成视图PasswordChangeDoneView密码修改完成视图用于处理成功完成密码修改后的信息
,默认的URL模式名称为password_change_done。密码修改完成视图显示的默认响应页面如图8-30所示。5.密码重置视图PasswordResetView密码重置视图用于在用户忘记密码时申请重置密码,视图默认的URL模式名称为password_re
set。密码重置视图的默认模板文件为registration/password_reset_form.html,同时,视图还使用下面的两个默认模板。密码重置邮件内容模板:registration/password_reset_em
ail.html,可用视图的email_template_name属性设置。密码重置邮件主题模板:registration/password_reset_subject.txt,可用视图的subject_template_name属性设置。6.
密码重置完成视图PasswordResetDoneView密码重置完成视图的默认URL模式名称为password_reset_done,默认模板文件为registration/password_reset_done.html。如果没
有为密码重置视图设置success_url(成功发送密码重置邮件后的重定向URL),Django就会调用密码重置完成视图。如果用户提供的E-mail地址在auth_user表中存在,但用户处于不活动状态或者密码无效时,Django也
会调用密码重置完成视图,但不会发送密码重置邮件。7.密码重置确认视图PasswordResetConfirmView用户在密码重置邮件中单击链接,跳转到密码重置视图返回的新密码设置页面。密码重置确认视图默认的URL
模式名称为password_reset_confirm默认模板文件为registration/password_reset_confirm.html。在配置视图URL时,应在URL中包含两个参数:ui
db64和token,示例代码如下。path('reset/<uidb64>/<token>/',views.PasswordResetConfirmView.as_view(),name='password_reset_confirm'),其中uidb64是
基于64位的用户ID编码,token是用于检查密码是否有效的令牌8.新密码设置完成视图PasswordResetCompleteView成功完成新密码设置后调用新密码设置完成视图视图默认的URL模式名称为password_reset_complete默认的模板文件为registration/
password_reset_complete.html。8.2.4自定义视图中的身份认证在自定义视图中,可调用django.contrib.auth模块提供的下列方法进行身份认证。authenticate():以用户名和密码
为参数验证用户。用户名和密码均正确时,返回该用户的User对象,否则返回None。login():执行登录注册。将用户的User对象保存到Session中。用户登录之前保存在Session中的数据,在登录后仍然会保留。logout():注销登录,删除Session中的会
话数据。8.2.5限制页面登录访问可以使用自定义方式或者登录装饰器来限制页面登录访问。1.使用自定义方法限制页面登录访问通常,可通过request.user.is_authenticated的值来判断用户是否已经登录,其值为True表示用户已经
登录,否则未登录。下面的视图在用户未登录时跳转到登录页面,用户成功登录后,再返回登录前视图。fromchapter8importsettings……deftestlogin(request):ifnotreque
st.user.is_authenticated:returnredirect('%s?next=%s'%(settings.LOGIN_URL,request.path))#未登录时跳转else:n
ews='欢迎:%s,你已经登录,可以访问本页面,<ahref="%s">注销登录?</a>'%\(request.user.username,reverse('logoutdiy'))returnHttpRespo
nse(news)settings.LOGIN_URL是在项目配置文件中定义的默认登录URL2.使用登录装饰器来限制页面登录访问登录装饰器login_required用于限制页面只能在用户登录后访问。例如,前面的testlogin视图可改写为如下代码。fromdja
ngo.contrib.auth.decoratorsimportlogin_required……@login_requireddeftestlogin2(request):news='欢迎:%s,你已经登录,可以访问本页面,<ahref="%s">注销登录?</a>'%\
(request.user.username,reverse('logoutdiy'))returnHttpResponse(news)8.2.6限制页面访问权限装饰器permission_required
可用于限制访问页面必须具备特定权限,示例代码如下。fromdjango.contrib.auth.decoratorsimportpermission_required……@permission_required('test.can_testlog')deftestlogin3(r
equest):news='欢迎:%s,你已经登录,可以访问本页面,<ahref="%s">注销登录?</a>'%\(request.user.username,reverse('logoutdiy'))returnHttpRespon
se(news)8.2.7自定义页面访问限制条件装饰器user_passes_test允许使用自定义函数来检测已登录用户是否可以访问页面,示例代码如下。defcheck_in_blacklist(user):#检测用户是否在黑名单中returnnotuser
.usernameinsettings.LOGIN_BLACKLIST@user_passes_test(check_in_blacklist)deftestlogin4(request):news='欢迎:%s,你已经登录,可以访问本页面,<ahref="%s
">注销登录?</a>'%\(request.user.username,reverse('logoutdiy'))returnHttpResponse(news)装饰器“@user_passes_test(check_in_blac
klist)”在用户未登录或者属于黑名单用户时,会使页面重定向到登录页面。8.3发送E-mail本节主要内容E-mail配置发送密码重置邮件自定义E-mail发送E-mail后端8.3.1E-mail配
置要发送E-mail,需要配置SMTP服务,并在项目配置文件中设置E-mail选项。1.配置SMTP服务以QQ邮件为例,进入QQ邮箱,在账户设置中开启SMTP服务,如图8-37所示。如果SMTP服务器已经开启,可先关闭该服务器,然后重新开启。这样,会收到一个授权密码,该密
码用于在客户端发送E-mail。2.设置E-mail选项在项目配置文件settings.py中添加下列设置。EMAIL_HOST='smtp.qq.com'#发送邮件服务器EMAIL_PORT=465#邮件服务器端口EMAIL_HOST_USER='XXX@qq.
com'#发送邮件账户EMAIL_HOST_PASSWORD=XXX#发送邮件授权密码EMAIL_USE_SSL=True#与SMTP服务器通信时是否使用SSL连接DEFAULT_FROM_EMAIL=XXX@qq.com'#默认邮件发送人8.3.2发送密码重置邮件8.2.3
节介绍了Django提供的重置密码相关的内置视图。要发送密码重置邮件,在浏览器中访问http://127.0.0.1:8000/accounts/password_reset,打开密码重置页面,如图8-38所示。8.3.3自定义E-mail发送django.core.mail模块提供的se
nd_mail()方法用于发送E-mail其基本格式如下。send_mail(subject,message,from_email,recipient_list,fail_silently=False,auth_user=None,auth_password=None,connection
=None,html_message=None)其中,subject、message、from_email和recipient_list是必选参数,其他为可选参数。各参数含义如下。subject:邮件主题字符串。message:邮件内容字符串,text/plain格式。from_em
ail:发件人E-mail地址。recipient_list:收件人E-mail地址列表。fail_silently:True或False。为False时,邮件发送失败会触发异常smtplib.SMTPException。auth_user:发
送账户,默认为EMAIL_HOST_USER值。auth_password:发送邮件的授权密码,默认为EMAIL_HOST_PASSWORD值。connection:邮件发送后端,默认为SMTP后端。html_m
essage:HTML格式的邮件内容,text/html格式。邮箱通常显示HTML格式的邮件内容,并可切换为纯文本的message内容。实例1.定义邮件发送表单2.定义邮件发送视图3.定义邮件发送模板4.配置URL8.3.4E-mai
l后端邮件发送操作由E-mail后端完成。Django默认使用SMTP后端,即邮件由SMTP服务器发送。也可在Django配置文件中明确使用的后端配置,示例代码如下。EMAIL_BACKEND='django.core.mail.backends.smtp.E
mailBackend'使用SMTP后端时,需在配置文件中配置下列变量。EMAIL_HOST:邮件发送服务器地址。EMAIL_PORT:邮件发送服务器端口。EMAIL_HOST_USER:发送邮件使用的账户名称。EMAIL_HOST_PASSWOR:发
送邮件使用的授权密码。EMAIL_USE_SSL:发送邮件时是否使用SSL连接。DEFAULT_FROM_EMAIL:默认发件人。1.控制台后端在配置文件中使用下面的代码启用控制台后端。EMAIL_BACKEND='djang
o.core.mail.backends.console.EmailBackend'控制台后端会将邮件发送到控制台。运行开发服务器时,可在控制台中看到邮件信息,如图8-42所示。2.文件后端文件后端会将邮件信息写
入文件。在配置文件中使用下面的代码启用文件后端。EMAIL_BACKEND='django.core.mail.backends.filebased.EmailBackend'EMAIL_FILE_PATH=os.path.join(BASE_DI
R,'test/email_files')#邮件文件路径每次发送邮件时,Django会将时间戳作为文件名,将邮件内容写入文本文件3.内存后端在配置文件中使用下面的代码启用内存后端。EMAIL_BACKEND='django.core.mail.back
ends.locmem.EmailBackend'在使用内存后端时,Django会为django.core.mail模块创建一个outbox属性,用其保存邮件内容。outbox属性值是一个列表,其中的每
一封邮件是一个EmailMessage对象。4.虚拟后端在配置文件中使用下面的代码启用虚拟后端。EMAIL_BACKEND='django.core.mail.backends.dummy.EmailBackend'使用虚拟后端时,可在浏览器中完成邮件发送操作,
但虚拟后端不对邮件执行任何操作。8.4会话控制本节主要内容启用会话控制会话对象方法在视图中使用会话会话通常指浏览器与Web服务器之间的通信。HTTP协议是无状态的,Web服务器无法知道用户上一次的会话数据。会话控制维
护用户在访问网站过程中的状态。会话控制通常使用Session和Cookie来实现。通常把Session称为会话对象,Web服务器会为每个用户创建一个Session对象,Session对象在服务器端保存用户数据。Cookie用于在浏览器端保存用户数据,Web服务器可创建和读写Cookie。8
.4.1启用会话控制启用Django会话控制包括注册会话应用、启用会话中间件和配置会话引擎等操作。1.注册会话应用在配置文件的INSTALLED_APPS变量中添加django.contrib.sessions应用,示例代码如下。INSTALLED_AP
PS=[……'django.contrib.sessions',]默认情况下,Django会注册django.contrib.sessions应用。如果不使用会话控制,可从INSTALLED_APPS变量中将其删除,以节省项目运行开销。2.启用会话中间件在配置文件的MIDDLEW
ARE变量中添加会话中间件(Django默认启用),示例代码如下。MIDDLEWARE=[……'django.contrib.sessions.middleware.SessionMiddleware',]3.配置会话引擎会话引擎负责存储会话数据。配置文件中的SESS
ION_ENGINE变量用于配置会话引擎。Django提供5种会话引擎:数据库后端、缓存、数据库+缓存、文件和Cookie。基于数据库后端的会话数据库后端会话引擎用于实现基于数据库的会话,其配置语句如下。SESSION_ENGINE='django.contr
ib.sessions.backends.db'数据库后端会话引擎是Django的默认设置,可以省略SESSION_ENGINE变量的配置。基于数据库的会话使用数据库中的django_session表存储会话数据。可以通过django.contrib.sessions.models.Ses
sion模型访问django_session表。django_session表保存会话关键字、会话数据和会话过期时间等数据,基于缓存的会话缓存会话引擎用于实现基于缓存的会话,其配置语句如下。SESSION_ENGINE='django.contrib.sessions.backends.c
ache'基于缓存的会话在高速缓存中存储会话数据,除了需要配置缓存会话引擎外,还需要配置缓存。例如,下面的语句设配置Django在数据库表中存储缓存数据。CACHES={'default':{'BACK
END':'django.core.cache.backends.db.DatabaseCache','LOCATION':chapter8_cache_table',#指定数据库缓存表名称}}同时,执行下面的命令创建数据库缓存表。pytho
nmanage.pycreatecachetable基于数据库+缓存的会话数据库+缓存会话引擎用于实现基于数据库+缓存的会话,其配置语句如下。SESSION_ENGINE='django.contrib.sessions.backends.cached_db使
用基于数据库+缓存的会话时,Django将会话数据同时写入缓存和数据库表。基于文件的会话文件会话引擎用于实现基于文件的会话,引擎将会话数据写入临时文件,其配置语句如下。SESSION_ENGINE='django.contrib.sessions.b
ackends.file'SESSION_FILE_PATH='chapter8/session_file'#会话文件路径基于Cookie的会话Cookie会话引擎用于实现基于Cookie的会话,引擎将会话数
据写入Cookie,其配置语句如下。SESSION_ENGINE='django.contrib.sessions.backends.signed_cookies'4.会话相关配置配置文件中的会话相关配置如下
。SESSION_CACHE_ALIAS='default'#存放会话数据的后端名称,默认为defaultSESSION_COOKIE_NAME='sessionid'#Cookie中的会话名称,默认为sessionidSES
SION_COOKIE_AGE=60*60*24*7*2#Cookie有效时间,默认为2周SESSION_COOKIE_DOMAIN=None#Cookie中的会话域名,默认为NoneSESSION_COOKIE_
SECURE=False#是否使用HTTPS协议传输Cookie,默认为FalseSESSION_COOKIE_PATH='/'#Cookie中的会话路径,默认为/SESSION_COOKIE_HTTPONLY=True#会话Cookie是否只支持HTTP传
输,默认为TrueSESSION_SAVE_EVERY_REQUEST=False#每次请求后保存会话,默认为FalseSESSION_EXPIRE_AT_BROWSER_CLOSE=False#每次关闭浏览器使会话失效SESSION_
COOKIE_HTTPONLY值设置为True时,客户端不能通过JavaScript脚本访问会话Cookie,从而提高Cookie的安全性。8.4.2会话对象方法在命令行,可用下面的命令创建会话对象。>>>fromdjango.contrib.sess
ions.backends.dbimportSessionStore>>>session=SessionStore()#创建会话对象会话对象的常用操作如下。__setitem__(key,value
):以字典方式修改会话数据,示例代码如下。>>>session['data']=123__getitem__(key):以字典方式读取会话数据。该方法在会话对象不包含指定的键(key)时会报错__delitem__(key):支持用del
语句删除指定会话数据。该方法在会话对象不包含指定的键时会报错。>>>delsession['data']__contains__(key):支持in操作符,判断会话中是否包含指定的键,示例代码如下。>>>'data'insessionTrue>>>'data
2'insessionFalseget(key,default=None):读取会话数据。如果指定的键不存在,方法默认返回None。可在方法的第二个参数中指定默认返回值示例代码如下。>>>session.get('data')123>>>session.get('dat
a2',False)Falsepop(key,default=__not_given):读取会话数据,并将其从会话中删除,示例代码如下。>>>session.pop('data')123>>>'data'insessionFalse>>
>session.pop('data2',False)Falsekeys():返回会话中的全部键,示例代码如下。>>>session.keys()dict_keys([])>>>session['data']=123>>>session['data2']='abc'
>>>session.keys()dict_keys(['data','data2'])tems():返回会话中的全部键值对,示例代码如下。>>>session.items()dict_items([('data',12
3),('data2','abc')])clear():删除所有会话数据,示例代码如下。>>>session.clear()flush():删除所有会话数据,包括会话Cookie,示例代码如下。>>>session.flush()set_test_cookie():创建
一个测试Cookie,用于检测浏览器是否支持Cookie,示例代码如下。>>>session.set_test_cookie()test_cookie_worked():在创建了测试Cookie之后调用该方法,方法返回True或False,True表示客户端浏览器支持
Cookie,示例代码如下。>>>session.test_cookie_worked()Truedelete_test_cookie():删除测试Cookie,示例代码如下。>>>session.delete_test
_cookie()set_expiry(value):设置会话过期时间。value为0时,会话在关闭浏览器时过期,示例代码如下。>>>session.set_expiry(600)#设置过期时间为10分钟。get_expiry_age():返回会话过期时间的秒数,示例
代码如下。>>>session.get_expiry_age()600get_expiry_date():返回会话过期的日期,示例代码如下。>>>session.get_expiry_date()dateti
me.datetime(2019,8,1,9,19,23,762028,tzinfo=<UTC>)get_expire_at_browser_close():返回True或False,True表示会
话在关闭浏览器时过期,示例代码如下。>>>session.get_expire_at_browser_close()Falseclear_expired():删除已过期的会话,示例代码如下。>>>session.clear_e
xpired()cycle_key():创建一个新的会话关键字,保留当前会话数据。>>>session.cycle_key()8.4.3在视图中使用会话视图函数的第一个参数为HttpRequest对象(
参数名称按惯例为request)。启用会话时,Django会为HttpRequest对象创建一个session属性,用于引用会话对象。8.5实践:自定义User模型本节主要内容