PythonWeb開發(fā)基礎(chǔ)教程-第8章-Django工具課件_第1頁
PythonWeb開發(fā)基礎(chǔ)教程-第8章-Django工具課件_第2頁
PythonWeb開發(fā)基礎(chǔ)教程-第8章-Django工具課件_第3頁
PythonWeb開發(fā)基礎(chǔ)教程-第8章-Django工具課件_第4頁
PythonWeb開發(fā)基礎(chǔ)教程-第8章-Django工具課件_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Python Web開發(fā)基礎(chǔ)教程(Django版)第8章 Django工具本章主要內(nèi)容:Admin站點用戶認(rèn)證發(fā)送E-mail會話控制8.1 Admin站點本節(jié)主要內(nèi)容管理用戶管理組管理模型8.1.1 啟用 Admin 站點 要使用Admin站點,需先完成6個步驟的操作:注冊應(yīng)用、注冊上下文處理器、注冊中間件、配置URL、遷移數(shù)據(jù)庫和創(chuàng)建超級用戶。在執(zhí)行django-admin命令創(chuàng)建項目時,Django會自動完成前4個步驟。1注冊應(yīng)用在settings.py項目配置文件的INSTALLED_APPS變量中注冊Admin應(yīng)用以及相關(guān)的支持應(yīng)用,示例代碼如下。INSTALLED_APPS = d

2、jango.contrib.admin,#Admin站點 django.contrib.auth,#用戶認(rèn)證系統(tǒng) django.contrib.contenttypes,#模型權(quán)限 django.contrib.sessions,#會話管理 django.contrib.messages,#消息管理 2注冊上下文處理器在TEMPLATES模板配置變量的OPTIONS參數(shù)中包含auth和messages上下文處理器,示例代碼如下。TEMPLATES = BACKEND: django.template.backends.django.DjangoTemplates, DIRS: , APP_DI

3、RS: True, OPTIONS: context_processors: django.contrib.auth.context_processors.auth, #用戶認(rèn)證 django.contrib.messages.context_processors.messages,#消息管理 , , ,3注冊中間件在模板配置變量MIDDLEWARE中包含AuthenticationMiddleware中間件和MessageMiddleware 中間件,示例代碼如下。MIDDLEWARE = django.contrib.auth.middleware.AuthenticationMiddle

4、ware,#用戶認(rèn)證django.contrib.messages.middleware.MessageMiddleware,#消息管理默認(rèn)情況下,Admin站點使用英文。如果要使用中文,可注冊本地化中間件,示例代碼如下。MIDDLEWARE = django.middleware.locale.LocaleMiddleware,#本地化中間件4配置URL在urls.py文件中添加Admin站點的URL配置,示例代碼如下。from django.contrib import adminfrom django.urls import pathurlpatterns = path(admin/,

5、admin.site.urls), #Admin站點URL配置啟動開發(fā)服務(wù)器后,在瀏覽器中訪問:8000/admin5遷移數(shù)據(jù)庫Admin站點默認(rèn)在數(shù)據(jù)庫中保存相關(guān)數(shù)據(jù)。在訪問Admin站點之前,應(yīng)先執(zhí)行數(shù)據(jù)庫遷移操作,創(chuàng)建相關(guān)的數(shù)據(jù)表。例如,下面的命令在D盤創(chuàng)建項目chapter8,并執(zhí)行數(shù)據(jù)庫遷移操作。D:django-admin startproject chapter8D:cd chapter8D:chapter8python manage.py makemigrationsD:chapter8python manage.py migrate6創(chuàng)建超級用戶登錄Admin站點的用戶必須具

6、有超級用戶權(quán)限(is_superuser屬性為True)或者具有訪問Admin站點的權(quán)限(is_staff屬性為True)。下面的命令為項目創(chuàng)建超級用戶。D:chapter8python manage.py createsuperuserUsername (leave blank to use xbg): adminEmail address:Password:Password (again):Superuser created successfully.8.1.2管理用戶登錄Admin站點演示8.1.3管理組登錄Admin站點演示8.1.4管理模型默認(rèn)情況下,Admin站點不提供模型管理功能

7、。要在Admin站點中管理應(yīng)用中的模型,需要修改應(yīng)用的admin.py文件,在文件中注冊模型。實例:為本章實例項目添加一個應(yīng)用,并在應(yīng)用中定義模型,然后在Admin站點中管理該模型。1為本章實例項目添加應(yīng)用在Windows命令行中進入項目主文件夾,執(zhí)行下面的命令創(chuàng)建test應(yīng)用。D:chapter8python manage.py startapp test2定義模型修改test應(yīng)用中的models.py文件,定義模型,代碼如下。from django.db import modelsclass person(models.Model): name=models.CharField(max_l

8、ength=8) age=models.SmallIntegerField()3注冊應(yīng)用修改項目配置文件settings.py,在INSTALLED_APPS變量中添加test應(yīng)用,示例代碼如下。INSTALLED_APPS = test, 4執(zhí)行數(shù)據(jù)庫遷移操作執(zhí)行下面的命令完成數(shù)據(jù)庫遷移操作。D:chapter8python manage.py makemigrationsD:chapter8python manage.py migrate5注冊模型修改應(yīng)用的admin.py文件,注冊模型,代碼如下。from django.contrib import adminfrom .models i

9、mport personadmin.site.register(person)#注冊模型6在Admin站點中管理模型8.2 用戶認(rèn)證本節(jié)主要內(nèi)容用戶認(rèn)證相關(guān)模型控制臺用戶管理內(nèi)置認(rèn)證視圖自定義視圖中的身份認(rèn)證限制頁面登錄訪問限制頁面訪問權(quán)限8.2.1用戶認(rèn)證相關(guān)模型Django使用內(nèi)置的User、Permission和Group模型來管理用戶認(rèn)證的相關(guān)數(shù)據(jù)。1User模型User模型用于管理用戶數(shù)據(jù),模型包含的字段如下。username:用戶名,必填字段。最長150個字符。可以包含字母、數(shù)字、_、+、.和-等字符。first_name:名字,可選字段。最長30個字符。last_name:姓氏,

10、可選字段。最長150個字符。email:電子郵件地址,可選字段。password:存儲密碼的哈希值,可選字段。密碼可包含任意字符。groups:多對多關(guān)系,可選字段。關(guān)聯(lián)用戶組。user_permissions:多對多關(guān)系,可選字段。關(guān)聯(lián)用戶權(quán)限。is_staff:是否允許訪問Admin站點,可選字段。為True時表示賬戶可以訪問Admin站點。is_active:是否為活動賬戶,可選字段。為True時表示用戶賬戶為活動賬戶,非活動賬戶被禁止訪問。is_superuser:是否為超級用戶,可選字段。為True時表示用戶具有所有權(quán)限,否則為普通用戶。last_login:用戶上次登錄的日期時間,

11、可選字段。date_joined:創(chuàng)建賬戶的日期時間,可選字段。在數(shù)據(jù)庫中,User模型對應(yīng)的數(shù)據(jù)表為auth_user2Permission模型Permission模型用于管理權(quán)限數(shù)據(jù),模型包含的字段如下。name:權(quán)限名稱,必填字段。最長255個字符。content_type:引用數(shù)據(jù)表django_content_type的id字段,必填字段。數(shù)據(jù)表django_content_type保存應(yīng)用包含的模型記錄。codename:用于編程的權(quán)限名稱,必填字段。最長100個字符。在數(shù)據(jù)庫中,Permission模型對應(yīng)的數(shù)據(jù)表為auth_permission3Group模型Group模型用于

12、管理組數(shù)據(jù),模型包含的字段如下。name:組名稱,必填字段。最長80個字符。permissions:多對多關(guān)系,關(guān)聯(lián)權(quán)限。在數(shù)據(jù)庫中,Group模型對應(yīng)的數(shù)據(jù)表為auth_group4模型關(guān)系User模型與Permission模型之間是多對多關(guān)系,該關(guān)系在數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)表為auth_user_user_permissionsUser模型與Group模型之間是多對多關(guān)系,該關(guān)系在數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)表為auth_user_groupsGroup模型與Permission模型之間是多對多關(guān)系,該關(guān)系在數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)表為auth_group_permissions8.2.2控制臺用戶管理可在A

13、dmin站點中交互式地完成添加、刪除和修改等用戶管理操作,詳細(xì)內(nèi)容請參考8.1.2節(jié)。本節(jié)主要介紹如何通過代碼完成用戶管理。1創(chuàng)建用戶調(diào)用create()方法創(chuàng)建User對象,示例代碼如下。 user=User.objects.create(username=testuser) user.set_password(123456) user.save()注意,為用戶設(shè)置密碼應(yīng)調(diào)用set_password()方法,該方法將明文密碼轉(zhuǎn)換成的哈希值存入password字段??烧{(diào)用User模型提供的create_user()和create_superuser()方法來創(chuàng)建用戶,示例代碼如下。 user=

14、User.objects.create_user(testuser3,test,123456) user=User.objects.create_superuser(testuser4,test4,123456)create_user()方法用于創(chuàng)建普通用戶,create_superuser()方法用于創(chuàng)建超級用戶。2修改用戶可通過模型對象修改用戶相關(guān)屬性,示例代碼如下。 user=User.objects.get(username=testuser) user.email=123456 user.save()3刪除用戶調(diào)用模型對象的delete()方法可刪除用戶,示例代碼如下。 user=U

15、ser.objects.get(username=test1) user.delete()(1, admin.LogEntry: 0, auth.User_groups: 0, auth.User_user_permissions: 0, auth.User: 1)4驗證用戶authenticate()方法將用戶名和密碼作為參數(shù)來驗證用戶。如果用戶名和密碼正確,方法返回關(guān)聯(lián)用戶名的User模型對象;未通過驗證時,返回None。例如: from django.contrib.auth import authenticate user=authenticate(username=testuser,

16、 password=123456) print(user)Testuser user=authenticate(username=testuser, password=456) print(user)None5設(shè)置權(quán)限User模型與Permission模型之間是多對多關(guān)系,可以從關(guān)系的兩端為用戶設(shè)置權(quán)限。通過User對象設(shè)置權(quán)限,示例代碼如下。 from django.contrib.auth.models import Permission admins=Permission.objects.filter(codename_endswith=permission)#獲得權(quán)限 user=Use

17、r.objects.get(username=testuser) user.user_permissions.set(admins)#設(shè)置權(quán)限 for p in user.user_permissions.all():#查看權(quán)限. print(p.codename,).add_permission Can add permissionchange_permission Can change permissiondelete_permission Can delete permissionview_permission Can view permission創(chuàng)建新權(quán)限,并授權(quán)給用戶,示例代碼如下

18、。 from test.models import person from django.contrib.contenttypes.models import ContentType content_type_id=ContentType.objects.get_for_model(person) p=Permission.objects.create(codename=can_analyse_person, name=能分析person數(shù)據(jù),content_type=content_type_id) user.user_permissions.add(p)#添加權(quán)限也可通過Permissio

19、n模型為用戶授權(quán),示例代碼如下。 p=Permission.objects.get(codename=view_permission)#獲得權(quán)限對象 p.user_set.add(user) #為權(quán)限添加關(guān)聯(lián)用戶 p.user_set.all()QuerySet 也可通過將用戶加入組的方式來為用戶授權(quán),示例代碼如下。 g=Group.objects.get(id=1) g.user_set.add(user)#將用戶加入組8.2.3內(nèi)置認(rèn)證視圖Django在django.contrib.auth.views.py中定義了幾個用于登錄、注銷和密碼管理的認(rèn)證視圖類。要使用內(nèi)置的認(rèn)證視圖,首先需要在

20、配置文件中添加下面的URL配置。urlpatterns = path(accounts/, include(django.contrib.auth.urls),#導(dǎo)入內(nèi)置認(rèn)證視圖URL配置path(accounts/profile/,log_views.login_ok),#映射自定義的視圖 Django在默認(rèn)視圖中會使用項目配置文件settings.py中設(shè)置的3個URL。LOGIN_URL:默認(rèn)的登錄URL,默認(rèn)值為“/accounts/login/”LOGIN_REDIRECT_URL:默認(rèn)的登錄成功后轉(zhuǎn)向的URL,默認(rèn)值為“/accounts/profile/”。Django沒有為“/

21、accounts/profile/”定義默認(rèn)視圖,上面代碼中的“l(fā)og_views.login_ok”是自定義的視圖。LOGOUT_REDIRECT_URL:默認(rèn)的注銷登錄后轉(zhuǎn)向的URL,默認(rèn)值為 None。1登錄視圖LoginView登錄視圖用于處理用戶登錄操作,該視圖默認(rèn)的URL模式名稱為login。在模板中可用% url login %獲取登錄視圖URL。在采用GET方法訪問登錄視圖時,視圖顯示默認(rèn)登錄表單。當(dāng)用戶輸入用戶名和密碼后再提交表單時,登錄視圖使用用戶數(shù)據(jù)表auth_user中的數(shù)據(jù)驗證用戶名和密碼是否正確。用戶通過驗證時,視圖調(diào)用login()方法,將用戶的User對象寫入S

22、ession對象,同時會在auth_user表中記錄登錄時間。用戶未通過驗證時,重新顯示登錄頁面,并在頁面中顯示錯誤提示信息。登錄視圖會向模板傳遞下列變量。form:表單對象,默認(rèn)為AuthenticationForm,可以使用自定義的登錄表單。next:登錄成功后的重定向URL。通常,可以在模板中用一個隱藏的表單字段設(shè)置next,示例代碼如下。site:當(dāng)前站點ID,可在配置文件中用SITE_ID變量進行設(shè)置。site_name:站點名稱,視圖將其設(shè)置為request.METASERVER_NAME。2注銷登錄視圖LogoutView注銷登錄視圖用于處理用戶注銷登錄操作,注銷登錄會刪除Ses

23、sion中的用戶信息。注銷登錄視圖的默認(rèn)URL模式名稱為logout。注銷登錄視圖會向模板傳遞下列變量。title:字符串“Logged out”。site:當(dāng)前站點ID,默認(rèn)為SITE_ID變量值。site_name:站點名稱。注銷登錄視圖使用Admin站點的默認(rèn)注銷登錄模板。3密碼修改視圖PasswordChangeView密碼修改視圖用于修改用戶密碼,視圖的默認(rèn)URL模式名稱為password_change。密碼修改視圖會向模板傳遞一個form變量,用于引用密碼修改表單。默認(rèn)情況下,密碼修改視圖使用Admin站點的密碼修改模板。修改前面的登錄成功視圖模板文件login_ok.html,添

24、加修改密碼鏈接,代碼如下。% if user.is_authenticated % 登錄成功,歡迎: user.username ,登錄時間: user.last_login 修改密碼 % if perms.test % 4密碼修改完成視圖PasswordChangeDoneView密碼修改完成視圖用于處理成功完成密碼修改后的信息,默認(rèn)的URL模式名稱為password_change_done。密碼修改完成視圖顯示的默認(rèn)響應(yīng)頁面如圖8-30所示。5密碼重置視圖PasswordResetView密碼重置視圖用于在用戶忘記密碼時申請重置密碼,視圖默認(rèn)的URL模式名稱為password_reset。

25、密碼重置視圖的默認(rèn)模板文件為registration/password_reset_form.html,同時,視圖還使用下面的兩個默認(rèn)模板。密碼重置郵件內(nèi)容模板:registration/password_reset_email.html,可用視圖的email_template_name屬性設(shè)置。密碼重置郵件主題模板:registration/password_reset_subject.txt,可用視圖的subject_template_name屬性設(shè)置。6密碼重置完成視圖PasswordResetDoneView密碼重置完成視圖的默認(rèn)URL模式名稱為 password_reset_done

26、,默認(rèn)模板文件為registration/password_reset_done.html。如果沒有為密碼重置視圖設(shè)置success_url(成功發(fā)送密碼重置郵件后的重定向URL),Django就會調(diào)用密碼重置完成視圖。如果用戶提供的E-mail地址在auth_user表中存在,但用戶處于不活動狀態(tài)或者密碼無效時,Django也會調(diào)用密碼重置完成視圖,但不會發(fā)送密碼重置郵件。7密碼重置確認(rèn)視圖PasswordResetConfirmView用戶在密碼重置郵件中單擊鏈接,跳轉(zhuǎn)到密碼重置視圖返回的新密碼設(shè)置頁面。密碼重置確認(rèn)視圖默認(rèn)的URL模式名稱為 password_reset_confirm默

27、認(rèn)模板文件為registration/password_reset_confirm.html。在配置視圖URL時,應(yīng)在URL中包含兩個參數(shù):uidb64和token,示例代碼如下。path(reset/, views.PasswordResetConfirmView.as_view(), name=password_reset_confirm),其中uidb64是基于64位的用戶ID編碼,token是用于檢查密碼是否有效的令牌8新密碼設(shè)置完成視圖PasswordResetCompleteView成功完成新密碼設(shè)置后調(diào)用新密碼設(shè)置完成視圖視圖默認(rèn)的URL模式名稱為 password_reset_

28、complete默認(rèn)的模板文件為registration/password_reset_complete.html。8.2.4自定義視圖中的身份認(rèn)證在自定義視圖中,可調(diào)用django.contrib.auth模塊提供的下列方法進行身份認(rèn)證。authenticate():以用戶名和密碼為參數(shù)驗證用戶。用戶名和密碼均正確時,返回該用戶的User對象,否則返回None。login():執(zhí)行登錄注冊。將用戶的User對象保存到Session中。用戶登錄之前保存在Session中的數(shù)據(jù),在登錄后仍然會保留。logout():注銷登錄,刪除Session中的會話數(shù)據(jù)。8.2.5限制頁面登錄訪問可以使用自定

29、義方式或者登錄裝飾器來限制頁面登錄訪問。1使用自定義方法限制頁面登錄訪問通常,可通過request.user.is_authenticated的值來判斷用戶是否已經(jīng)登錄,其值為True表示用戶已經(jīng)登錄,否則未登錄。下面的視圖在用戶未登錄時跳轉(zhuǎn)到登錄頁面,用戶成功登錄后,再返回登錄前視圖。from chapter8 import settingsdef testlogin(request): if not request.user.is_authenticated: return redirect(%s?next=%s % (settings.LOGIN_URL, request.path) #

30、未登錄時跳轉(zhuǎn) else: news=歡迎:%s,你已經(jīng)登錄,可以訪問本頁面,注銷登錄?% (request.user.username,reverse(logoutdiy) return HttpResponse(news)settings.LOGIN_URL是在項目配置文件中定義的默認(rèn)登錄URL2使用登錄裝飾器來限制頁面登錄訪問登錄裝飾器login_required用于限制頁面只能在用戶登錄后訪問。例如,前面的testlogin視圖可改寫為如下代碼。from django.contrib.auth.decorators import login_requiredlogin_requiredd

31、ef testlogin2(request): news=歡迎:%s,你已經(jīng)登錄,可以訪問本頁面,注銷登錄?% (request.user.username,reverse(logoutdiy)return HttpResponse(news)8.2.6限制頁面訪問權(quán)限裝飾器permission_required可用于限制訪問頁面必須具備特定權(quán)限,示例代碼如下。from django.contrib.auth.decorators import permission_requiredpermission_required(test.can_testlog)def testlogin3(requ

32、est): news=歡迎:%s,你已經(jīng)登錄,可以訪問本頁面,注銷登錄?% (request.user.username,reverse(logoutdiy) return HttpResponse(news)8.2.7自定義頁面訪問限制條件裝飾器user_passes_test允許使用自定義函數(shù)來檢測已登錄用戶是否可以訪問頁面,示例代碼如下。def check_in_blacklist(user):#檢測用戶是否在黑名單中 return not user.username in settings.LOGIN_BLACKLISTuser_passes_test(check_in_blackli

33、st)def testlogin4(request): news=歡迎:%s,你已經(jīng)登錄,可以訪問本頁面,注銷登錄?% (request.user.username,reverse(logoutdiy)return HttpResponse(news)裝飾器“user_passes_test(check_in_blacklist)”在用戶未登錄或者屬于黑名單用戶時,會使頁面重定向到登錄頁面。8.3 發(fā)送E-mail本節(jié)主要內(nèi)容E-mail配置發(fā)送密碼重置郵件自定義E-mail發(fā)送E-mail后端8.3.1E-mail配置要發(fā)送E-mail,需要配置SMTP服務(wù),并在項目配置文件中設(shè)置E-mai

34、l選項。1配置SMTP服務(wù)以QQ郵件為例,進入QQ郵箱,在賬戶設(shè)置中開啟SMTP服務(wù),如圖8-37所示。如果SMTP服務(wù)器已經(jīng)開啟,可先關(guān)閉該服務(wù)器,然后重新開啟。這樣,會收到一個授權(quán)密碼,該密碼用于在客戶端發(fā)送E-mail。2設(shè)置E-mail選項在項目配置文件settings.py中添加下列設(shè)置。EMAIL_HOST= #發(fā)送郵件服務(wù)器EMAIL_PORT=465 #郵件服務(wù)器端口EMAIL_HOST_USER=XXX#發(fā)送郵件賬戶EMAIL_HOST_PASSWORD=XXX#發(fā)送郵件授權(quán)密碼EMAIL_USE_SSL=True#與SMTP服務(wù)器通信時是否使用SSL連接DEFAULT_FR

35、OM_EMAIL=XXX#默認(rèn)郵件發(fā)送人8.3.2發(fā)送密碼重置郵件8.2.3節(jié)介紹了Django提供的重置密碼相關(guān)的內(nèi)置視圖。要發(fā)送密碼重置郵件,在瀏覽器中訪問:8000/accounts/ password_reset,打開密碼重置頁面,如圖8-38所示。8.3.3自定義E-mail發(fā)送django.core.mail模塊提供的send_mail()方法用于發(fā)送E-mail其基本格式如下。send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_passw

36、ord=None, connection=None, html_message=None) 其中,subject、message、from_email和recipient_list是必選參數(shù),其他為可選參數(shù)。各參數(shù)含義如下。subject:郵件主題字符串。message:郵件內(nèi)容字符串,text/plain格式。from_email:發(fā)件人E-mail地址。recipient_list:收件人E-mail地址列表。fail_silently:True或False。為False時,郵件發(fā)送失敗會觸發(fā)異常smtplib.SMTPException。auth_user:發(fā)送賬戶,默認(rèn)為EMAIL_H

37、OST_USER值。auth_password:發(fā)送郵件的授權(quán)密碼,默認(rèn)為EMAIL_HOST_PASSWORD值。connection:郵件發(fā)送后端,默認(rèn)為SMTP后端。html_message:HTML格式的郵件內(nèi)容,text/html格式。郵箱通常顯示HTML格式的郵件內(nèi)容,并可切換為純文本的message內(nèi)容。實例1定義郵件發(fā)送表單2定義郵件發(fā)送視圖3定義郵件發(fā)送模板4配置URL8.3.4E-mail后端郵件發(fā)送操作由E-mail后端完成。Django默認(rèn)使用SMTP后端,即郵件由SMTP服務(wù)器發(fā)送。也可在Django配置文件中明確使用的后端配置,示例代碼如下。EMAIL_BACKEN

38、D = django.core.mail.backends.smtp.EmailBackend使用SMTP后端時,需在配置文件中配置下列變量。EMAIL_HOST:郵件發(fā)送服務(wù)器地址。EMAIL_PORT:郵件發(fā)送服務(wù)器端口。EMAIL_HOST_USER:發(fā)送郵件使用的賬戶名稱。EMAIL_HOST_PASSWOR:發(fā)送郵件使用的授權(quán)密碼。EMAIL_USE_SSL:發(fā)送郵件時是否使用SSL連接。DEFAULT_FROM_EMAIL:默認(rèn)發(fā)件人。1控制臺后端在配置文件中使用下面的代碼啟用控制臺后端。EMAIL_BACKEND = django.core.mail.backends.conso

39、le.EmailBackend控制臺后端會將郵件發(fā)送到控制臺。運行開發(fā)服務(wù)器時,可在控制臺中看到郵件信息,如圖8-42所示。2文件后端文件后端會將郵件信息寫入文件。在配置文件中使用下面的代碼啟用文件后端。EMAIL_BACKEND = django.core.mail.backends.filebased.EmailBackendEMAIL_FILE_PATH = os.path.join(BASE_DIR, test/email_files) #郵件文件路徑 每次發(fā)送郵件時,Django會將時間戳作為文件名,將郵件內(nèi)容寫入文本文件3內(nèi)存后端在配置文件中使用下面的代碼啟用內(nèi)存后端。EMAIL_

40、BACKEND = django.core.mail.backends.locmem.EmailBackend在使用內(nèi)存后端時,Django會為django.core.mail模塊創(chuàng)建一個outbox屬性,用其保存郵件內(nèi)容。outbox屬性值是一個列表,其中的每一封郵件是一個EmailMessage對象。4虛擬后端在配置文件中使用下面的代碼啟用虛擬后端。EMAIL_BACKEND = django.core.mail.backends.dummy.EmailBackend使用虛擬后端時,可在瀏覽器中完成郵件發(fā)送操作,但虛擬后端不對郵件執(zhí)行任何操作。8.4會話控制本節(jié)主要內(nèi)容啟用會話控制會話對象

41、方法在視圖中使用會話會話通常指瀏覽器與Web服務(wù)器之間的通信。HTTP協(xié)議是無狀態(tài)的,Web服務(wù)器無法知道用戶上一次的會話數(shù)據(jù)。會話控制維護用戶在訪問網(wǎng)站過程中的狀態(tài)。會話控制通常使用Session和Cookie來實現(xiàn)。通常把Session稱為會話對象,Web服務(wù)器會為每個用戶創(chuàng)建一個Session對象,Session對象在服務(wù)器端保存用戶數(shù)據(jù)。Cookie用于在瀏覽器端保存用戶數(shù)據(jù),Web服務(wù)器可創(chuàng)建和讀寫Cookie。8.4.1啟用會話控制啟用Django會話控制包括注冊會話應(yīng)用、啟用會話中間件和配置會話引擎等操作。1注冊會話應(yīng)用在配置文件的INSTALLED_APPS變量中添加djang

42、o.contrib.sessions應(yīng)用,示例代碼如下。INSTALLED_APPS = django.contrib.sessions,默認(rèn)情況下,Django會注冊django.contrib.sessions應(yīng)用。如果不使用會話控制,可從INSTALLED_APPS變量中將其刪除,以節(jié)省項目運行開銷。2啟用會話中間件在配置文件的MIDDLEWARE變量中添加會話中間件(Django默認(rèn)啟用),示例代碼如下。MIDDLEWARE = django.contrib.sessions.middleware.SessionMiddleware, 3配置會話引擎會話引擎負(fù)責(zé)存儲會話數(shù)據(jù)。配置文件中

43、的SESSION_ENGINE變量用于配置會話引擎。Django提供5種會話引擎:數(shù)據(jù)庫后端、緩存、數(shù)據(jù)庫+緩存、文件和Cookie?;跀?shù)據(jù)庫后端的會話數(shù)據(jù)庫后端會話引擎用于實現(xiàn)基于數(shù)據(jù)庫的會話,其配置語句如下。SESSION_ENGINE=django.contrib.sessions.backends.db數(shù)據(jù)庫后端會話引擎是Django的默認(rèn)設(shè)置,可以省略SESSION_ENGINE變量的配置。基于數(shù)據(jù)庫的會話使用數(shù)據(jù)庫中的django_session表存儲會話數(shù)據(jù)??梢酝ㄟ^django.contrib.sessions.models.Session模型訪問django_session

44、表。django_session表保存會話關(guān)鍵字、會話數(shù)據(jù)和會話過期時間等數(shù)據(jù),基于緩存的會話緩存會話引擎用于實現(xiàn)基于緩存的會話,其配置語句如下。SESSION_ENGINE=django.contrib.sessions.backends.cache基于緩存的會話在高速緩存中存儲會話數(shù)據(jù),除了需要配置緩存會話引擎外,還需要配置緩存。例如,下面的語句設(shè)配置Django在數(shù)據(jù)庫表中存儲緩存數(shù)據(jù)。CACHES = default: BACKEND: django.core.cache.backends.db.DatabaseCache, LOCATION: chapter8_cache_table

45、,#指定數(shù)據(jù)庫緩存表名稱 同時,執(zhí)行下面的命令創(chuàng)建數(shù)據(jù)庫緩存表。python manage.py createcachetable基于數(shù)據(jù)庫+緩存的會話數(shù)據(jù)庫+緩存會話引擎用于實現(xiàn)基于數(shù)據(jù)庫+緩存的會話,其配置語句如下。SESSION_ENGINE=django.contrib.sessions.backends.cached_db使用基于數(shù)據(jù)庫+緩存的會話時,Django將會話數(shù)據(jù)同時寫入緩存和數(shù)據(jù)庫表。基于文件的會話文件會話引擎用于實現(xiàn)基于文件的會話,引擎將會話數(shù)據(jù)寫入臨時文件,其配置語句如下。SESSION_ENGINE=django.contrib.sessions.backends.

46、fileSESSION_FILE_PATH= chapter8/session_file#會話文件路徑基于Cookie的會話Cookie會話引擎用于實現(xiàn)基于Cookie的會話,引擎將會話數(shù)據(jù)寫入Cookie,其配置語句如下。SESSION_ENGINE=django.contrib.sessions.backends.signed_cookies4會話相關(guān)配置配置文件中的會話相關(guān)配置如下。SESSION_CACHE_ALIAS = default#存放會話數(shù)據(jù)的后端名稱,默認(rèn)為defaultSESSION_COOKIE_NAME = sessionid#Cookie中的會話名稱,默認(rèn)為sess

47、ionidSESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2#Cookie有效時間,默認(rèn)為2周SESSION_COOKIE_DOMAIN = None#Cookie中的會話域名,默認(rèn)為NoneSESSION_COOKIE_SECURE = False#是否使用HTTPS協(xié)議傳輸Cookie,默認(rèn)為FalseSESSION_COOKIE_PATH = /#Cookie中的會話路徑,默認(rèn)為/SESSION_COOKIE_HTTPONLY = True#會話Cookie是否只支持HTTP傳輸,默認(rèn)為TrueSESSION_SAVE_EVERY_REQUEST = Fa

48、lse#每次請求后保存會話,默認(rèn)為FalseSESSION_EXPIRE_AT_BROWSER_CLOSE = False#每次關(guān)閉瀏覽器使會話失效SESSION_COOKIE_HTTPONLY值設(shè)置為True時,客戶端不能通過JavaScript腳本訪問會話Cookie,從而提高Cookie的安全性。8.4.2會話對象方法在命令行,可用下面的命令創(chuàng)建會話對象。 from django.contrib.sessions.backends.db import SessionStore session=SessionStore()#創(chuàng)建會話對象會話對象的常用操作如下。_setitem_(key, value):以字典方式修改會話數(shù)據(jù),示例代碼如下。 sessiondata=123_getitem_(key):以字典方式讀取會話數(shù)據(jù)。該

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論