亚洲成人一区在线观看_天堂网www_国产精品久久9_中文在线播放_伊人天天_久久精品久久久精品美女

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > 翻譯www.djangobook.com之第十五章:貢獻的其它子框架

翻譯www.djangobook.com之第十五章:貢獻的其它子框架
2010-01-13 23:43:14  作者:  來源:
Python的眾多力量中的一個是它的"電池導入"哲學,當你安裝了Python,它自帶了一個巨大的常用模塊"標準庫",你不需要
下載任何其它東西就可以立即開始使用,Django打算遵循這個哲學,它包含了它自己的對常用Web開發任務有用的附加標準庫
本章就講述這些附加物

關于標準庫
Django的標準庫位于django.contrib,其中每個子包都是一個單獨部分的附屬功能,這些包沒有必要互相關聯,但是有些
django.contrib子包可能需要其它包
在django.contrib里功能類型沒有硬性需求,其中有些包包含模型(這樣就需要在你的數據庫安裝數據庫表),其它的包含單
獨的中間件或模板標簽
django.contrib包的共有特性是:如果你刪除整個django.contrib包,你仍然可以無誤的使用Django的基本功能,當Django
開發人員往框架添加新功能時,他們使用該規則來決定新功能應該位于django.contrib還是別的地方
django.contrib包含了如下包:
1,admin--自動admin站點,參考第6章
2,auth--Django的認證框架,參考第12章
3,comments--一個注釋框架,參考第13章
4,contenttypes--一個深入內容類型的框架,其中每個安裝的Django模型是單獨的內容類型,參考下面的"內容類型"
5,csrf--防止跨站點請求偽造(Cross Site Request Forgeries),參考下面的"CSRF預防"
6,flatpages--在數據庫管理簡單的"平坦的"HTML,參考下面的"Flatpages"
7,formtools--Django表單的高級抽象工具,參考下面的"表單工具"
8,humanize--一些Django模板過濾器,對于給數據添加"人類感觀"很有用,參考下面的"使數據人性華"
9,markup--一些Django模板過濾器,它們實現了一些常用的標記語言,參考下面的"標記過濾器"
10,redirects--一個管理重定向的框架,參考下面的"重定向"
11,sessions--Django的session框架,參考第12章
12,sitemaps--一個生成站點圖XML文件的框架,參考下面的"Sitemaps"
13,sites--一個讓你操作同一數據庫和Django安裝的多個網站的框架,參考下面的"Sites"
14,syndication--一個在RSS和Atom生成syndication種子的框架,參考下面的"Syndication種子"
本章的其它部分進入每個django.contrib包的細節

Sites
Django的"sites"系統是一個讓你操作同一數據庫和Django項目的多個網站的框架,由于這是個抽象概念,它很難理解,所以
我們以幾個例子開始

例子1:在多個站點重用數據
我們第1章解釋到,Django驅動的站點LJWorld.com和Lawrence.com被同一新聞組織操作--堪薩斯勞倫斯的Lawrence Journal-
World報紙,LJWorld.com關注新聞,而Lawrence.com關注本地娛樂,但是有時候編輯想在兩個站點發表同一文章
解決此問題的要命的方法是為每個站點使用不同的數據庫,然后讓站點生成者發表同一個故事兩次:一次在LJWorld.com一次
在Lawrence.com,但是這使站點生成者很低效,并且它在數據庫里存儲了同一故事的多份拷貝從而造成冗余
更好的解決方案非常簡單:兩個站點使用同一文章數據庫,并且文章通過多對多關系關聯到多個站點,Django的sites框架提
供了文章可以被關聯的數據庫表,同多個"sites"關聯數據是個鉤子

例子2:在一個地方存儲你的站點名/域名
LJWorld.com和Lawrence.com都有e-mail提醒功能,這讓讀者訂閱并當新聞發生時得到告示,這非常基本:讀者在一個Web表單
訂閱,然后他立即得到一個e-mail說,"感謝你的訂閱"
實現該登錄處理代碼兩次是非常低效和冗余的,所以sites在幕后使用了同樣的代碼,但是"感謝你的訂閱"這個通知需要當前
站點的name(如'LJWorld.com')和domain(如'www.ljworld.com')的值
Django的sites框架提供了一個讓你在你的Django項目里為每個站點存儲name和domain的地方,這意味著你可以用一個一般的
方式來重用這些值

使用sites框架
sites框架不像是一個框架而更像是一些慣例,它整個東西是基于兩個簡單的概念:
1,Site模型,位于djang.contrib.sites,它有domain和name域
2,settings文件里的SITE_ID設置指定了Site對象的數據庫ID
怎樣使用這兩個概念取決于你,但是Django通過簡單的慣例用一些方式自動的使用它們
按下面的步驟安裝sites app:
1,添加'django.contrib.sites'到你的INSTALLED_APPS
2,運行命令manage.py syncdb來在你的數據庫安裝django_site表
3,通過Django的admin站點或者Python API來添加一個或多個Site對象,為該Django項目擁有的每個站點/域名創建Site對象
4,在你的每個settings文件中定義SITE_ID,這個值應該為該settings文件驅動的站點的Site對象的數據庫ID

你可以用sites框架做的事情
在多個站點間重用數據
為了像"例子1"中解釋的那樣在多個站點重用數據,只需在你的模型中創建一個ManyToManyField到Site,例如:
Java代碼 復制代碼
  1. from django.db import models   
  2. from django.contrib.sites.models import Site   
  3.   
  4. class Article(models.Model):   
  5.     headline = models.CharField(maxlength=200)   
  6.     # ...   
  7.     sites = models.ManyToManyField(Site)  

這是為了在你的數據庫中將文章關聯到多個站點所需的必要基本組織,而且你還可以對多個站點重用同樣的Django視圖代碼
繼續Article例子,這里是article_detail的視圖的樣子:
Java代碼 復制代碼
  1. from django.conf import settings   
  2.   
  3. def article_detail(request, article_id):   
  4.     try:   
  5.         a = Article.objects.get(id=article_id, sites__id=settings.SITE_ID)   
  6.     except Article.DoesNotExist:   
  7.         raise Http404   
  8.     # ...  

該視圖方法是可重用的,因為它根據SITE_ID設置的值來動態檢查文章的站點
例如,LJWorld.com的settings文件的SITE_ID設置為1而Lawrence.com的settings文件的SITE_ID設置為2,如果當LJWorld.
com的settings文件是活動時調用該視圖,則它將限制文章查詢在包含LJWorld.com的sites列表的文章

與單獨的站點關聯內容
同樣的,你可以使用ForeignKey和多對一關系來關聯模型到Site模型
例如,如果文章只允許在一個單獨的站點,你可以像這樣使用模型:
Java代碼 復制代碼
  1. from django.db import models   
  2. from django.contrib.sites.models import Site   
  3.   
  4. class Article(models.Model):   
  5.     headline = models.CharField(maxlength=200)   
  6.     # ...   
  7.     site = models.ForeignKey(Site)  

上一部分描述了同樣的好處

從視圖進入當前站點
在更低的級別,你可以基于視圖在哪個site調用在你的Django視圖使用sites框架來做特殊的事情,例如:
Java代碼 復制代碼
  1. from django.conf import settings   
  2.   
  3. def my_view(request):   
  4.     if settings.SITE_ID == 3:   
  5.         # Do something.   
  6.     else:   
  7.         # Do something else.  

當然,這丑陋的硬編碼了站點IDs,你最好趕緊修正它,一個達到同樣目的的稍微干凈的方式是檢查當前站點的域名:
Java代碼 復制代碼
  1. from django.conf import settings   
  2. from django.contrib.sites.models import Site   
  3.   
  4. def my_view(request):   
  5.     current_site = Site.objects.get(id=settings.SITE_ID)   
  6.     if current_site.domain == 'foo.com':   
  7.         # Do something   
  8.     else:   
  9.         # Do something else.  

根據settings.SITE_ID得到Site對象的慣例非常常見,所以Site模型的manager(Site.objects)有一個get_current()方法
這個例子等同于前面的:
Java代碼 復制代碼
  1. from django.contrib.sites.models import Site   
  2.   
  3. def my_view(request):   
  4.     current_site = Site.objects.get_current()   
  5.     if current_site.domain == 'foo.com':   
  6.         # Do something   
  7.     else:   
  8.         # Do something else.  

注意在這個最好的例子中,你不需要import djang.conf.settings

得到當前域名來顯示
對于在"例子2"中解釋的DRY(Don't Repeat Yourself)方式的存儲你的站點名和域名,只需在當前Site對象引用name和domain
例如:
Java代碼 復制代碼
  1. from django.contrib.sites.models import Site   
  2. from django.core.mail import send_mail   
  3.   
  4. def register_for_newsletter(request):   
  5.     # Check form values, etc., and subscribe the user.   
  6.     # ...   
  7.     current_site = Site.objects.get_current()   
  8.     send_mail('Thanks for subscribing to %s alerts' % current_site.name,   
  9.         'Thanks for your subscription. We appreciate it.\n\n-The %s team.' % current_site.name,   
  10.         'editor@%s' % current_site.domain,   
  11.         [user_email])   
  12.     # ...  

繼續我們的LJWorld.com和Lawrence.com的例子:在Lawrence.com,這個e-mail有一個主題行"Thanks for subscribing to La
wrence.com alers."在LJWorld.com,這個e-mail主題為"Thanks for subscribing to LJWorld.com alerts."同樣的站點特
有的行為在e-mail的信息主體里完成
注意一個更靈活(但是更重量級)的完成這個的方式是使用Django的模板系統,假設Lawrence.com和LJWorld.com有不同的模板
目錄(TEMPLATE_DIRS),你可以像這樣簡單的委派給模板系統:
Java代碼 復制代碼
  1. from django.core.mail import send_mail   
  2. from django.template import loader, Context   
  3.   
  4. def register_for_newsletter(request):   
  5.     # Check form values, etc., and subscribe the user.   
  6.     # ...   
  7.     subject = loader.get_template('alerts/subject.txt').render(Context({}))   
  8.     message = loader.get_template('alerts/message.txt').render(Context({}))   
  9.     send_mail(subject, message, 'do-not-reply@example.com', [user_email])   
  10.     # ...  

這種情況下,你不需要在LJWorld.com和Lawrence.com模板目錄都創建subject.txt和message.txt模板,這給你更多的靈活性
但是也更復雜
盡可能多的使用Site對象來刪除不必要的復雜性和冗余是個好主意

為完整URLs得到當前域名
Django的get_absolute_url()慣例對不要域名而得到你的對象的URL很好,但是某些情況下你可能想顯示完整的URL--用http:
//和域名和任何東西--對于一個對象,為了做這個,你可以使用sites框架,一個簡單的例子:
Java代碼 復制代碼
  1. >>> from django.contrib.sites.models import Site   
  2. >>> obj = MyModel.objects.get(id=3)   
  3. >>> obj.get_absolute_url()   
  4. '/mymodel/objects/3/'  
  5. >>> Site.objects.get_current().domain   
  6. 'example.com'  
  7. >>> 'http://%s%s' % (Site.objects.get_current().domain, obj.get_absolute_url())   
  8. 'http://example.com/mymodel/objects/3/'  


CurrentSiteManager
如果Sites在你的程序里擔任一個關鍵的角色,考慮在你的模型里使用有用的CurrentSiteManager,是模型manager(參考第5
章)自動過濾它的查詢來包含當前Site相關的對象
通過顯示的添加CurrentSiteManager到你的模型中來使用它,例如:
Java代碼 復制代碼
  1. from django.db import models   
  2. from django.contrib.sites.models import Site   
  3. from django.contrib.sites.managers import CurrentSiteManager   
  4.   
  5. class Photo(models.Model):   
  6.     photo = models.FileField(upload_to='/home/photos')   
  7.     photographer_name = models.CharField(maxlength=100)   
  8.     pub_date = models.DateField()   
  9.     site = models.ForeignKey(Site)   
  10.     objects = models.Manager()   
  11.     on_site = CurrentSiteManager()  

對這個模型,Photo.objects.all()將返回數據庫中所有的Photo對象,但是Photo.on_site.all()將根據SITE_ID設置只返回
當前站點相關聯的Photo對象
換句話說,這兩個語句是相等的:
Java代碼 復制代碼
  1. Photo.objects.filter(site=settings.SITE_ID)   
  2. Photo.on_site.all()  

CurrentSiteManager怎么知道Photo的哪個域是Site?它默認查找叫site的域,如果你的模型有一個ForeignKey或者ManyToMan
yField叫site以外的東西,你需要將它作為參數顯示的傳遞給CurrentSiteManager,下面的域叫publish_on的模型做了示范:
Java代碼 復制代碼
  1. from django.db import models   
  2. from django.contrib.sites.models import Site   
  3. from django.contrib.sites.managers import CurrentSiteManager   
  4.   
  5. class Photo(models.Model):   
  6.     photo = models.FileField(upload_to='/home/photos')   
  7.     photographer_name = models.CharField(maxlength=100)   
  8.     pub_date = models.DateField()   
  9.     publish_on = models.ForeignKey(Site)   
  10.     objects = models.Manager()   
  11.     on_site = CurrentSiteManager('publish_on')  

如果你嘗試使用CurrentSiteManager并傳遞一個不存在的域的名字Django將觸發ValueError
最后,注意即使你使用CurrentSiteManager,你可能想在你的模型保持一個普通(非站點專有)的Manager,在第5章解釋了,
如果你手動定義一個manager,則Django不會為你自動創建objects = models.Manager(),同時注意Django的某些部分--即
Django的admin站點和generic views--使用模型中首先定義的manager,所以如果你想讓你的admin站點訪問所有的對象(而
不只是站點專有的對象),在定義CurrentSiteManager之前把objects = models.Manager()放置到你的模型中

Django怎樣使用sites框架
盡管使用sites框架不是必需的,但這是強力推薦的,因為Django在一些地方使用它,即使你的Django安裝只是單站點驅動
你應該花費兩秒鐘來使用你的domain和name來創建site對象,并在你的SITE_ID設置里指出它的ID
這里是Django怎樣使用sites框架:
1,在重定向框架(參考下面的"重定向")中,每個重定向對象與特殊的站點相關聯,當Django搜索一個重定向時,它考慮當
前的SITE_ID
2,在注釋框架(參考第13章)中,每個注釋與特殊的站點相關聯,當發表一個注釋時,它的site設置為SITE_ID,當注釋通過
合適的模板標簽列出時,只顯示當前站點的注釋
3,在flatpages框架中(參考下面的"Flatpages"),每個flatpage與一個特殊的站點相關聯,當flatpage創建時,你指定它的
site,并且flatpage中間件在得到flatpages時檢查當前SITE_ID來顯示
4,在syndication框架中(參考下面的"Syndication種子"),title和description的模板自動訪問{{{ site }}}變量,它是
表示當前站點的Site對象,而且如果你不指定完整的域名,提供條目URLs的鉤子將使用當前Site對象的domain

Flatpages
你經常有一個數據庫驅動的Web程序要運行,但是你將需要添加一些"一次性的"靜態頁面,例如"About"頁面或者"私有政策"
頁面,可以使用標準Web服務器如Apache來將其作為平坦的HTML文件服務,但是這在你的程序中導致了額外級別的復雜度,因
為你需要擔心配置Apache,你需要建立讓你的團隊編輯這些文件的訪問方式,并且你不能使用Django的模板系統來給這些頁
面添加風格
這個問題的解決方案是Django的"flatpages"app,它位于django.contrib.flatpages包,這個app讓你通過Django的admin站
點管理這些"一次性"頁面,并讓你使用Django的模板系統為它們指定模板,它在幕后使用Django模型,這意味著你在數據庫
存儲這些頁面,就像你的其它數據一樣,并且你可以使用Django的標準數據庫API訪問flatpages
Flatpages通過它們的URL和site作為鍵來維護,當你創建一個flatpage,你指定它關聯的URL以及它所在的站點(參考上面的
"Sites"部分得到更多關于sites)

使用Flatpages
按下面步驟安裝flatpages app:
1,把'django.contrib.flatpages'添加到你的INSTALLED_APPS
2,把'django.contrib.flatpages.middleware.FlatpageFallbckMiddleware'添加到你的MIDDLEWARE_CLASSES設置
3,運行命令manage.py syncdb來安裝兩個必需的表到你的數據庫

它怎樣工作
flatpages app在你的數據庫創建了兩個表:django_flatpage和django_flatpage_sites,django_flatpage是一個簡單映射
一個URL到一個title和一些文本內容的查詢表,django_flatpage_sites是將一個flatpage同一個或多個站點關聯的多對多表
該app帶有一個單獨的FlatPage模型,定義在django/contrib/flatpages/models.py,它看起來像這樣:
Java代碼 復制代碼
  1. from django.db import models   
  2. from django.contrib.sites.models import Site   
  3.   
  4. class FlatPage(models.Model):   
  5.     url = models.CharField(maxlength=100)   
  6.     title = models.CharField(maxlength=200)   
  7.     content = models.TextField()   
  8.     enable_comments = models.BooleanField()   
  9.     template_name = models.CharField(maxlength=70, blank=True)   
  10.     registration_required = models.BooleanField()   
  11.     sites = models.ManyToManyField(Site)  

讓我們一次看看所有這些域:
1,url--flatpage位于的URL,不包含域名但包含前置斜線,例如:'/about/contact/'
2,title--flatpage的title,框架不對它做任何特殊的事情,在模板中顯示它是你的責任
3,content--flatpage的內容,即頁面的HTML,框架不對它做任何特殊的事情,在模板中顯示它是你的責任
4,enable_comments--是否在flatpage允許注釋,框架不對它做任何特殊的事情,你可以在你的模板中檢查該值并需要的話
顯示一個注釋表單
5,template_name--用來渲染該flatpage的的模板名,它是可選的,如果它沒有給出,框架將使用模板flatpages/default.
html
6,registration_required--注冊對于查看該flatpage是否必需,它與第12章解釋的Django的認證/用戶框架集成
7,sites--該flatpage位于的站點,它與上面的"Sites"部分解釋的Django的sites框架繼承
你可以通過Django的admin界面或者Django數據庫API創建flatpages,參考下面的"怎樣添加,更改和刪除flatpages"
一旦你創建了flatpages,FlatpageFallbackMiddleware做所有的工作,每次Django程序觸發404錯誤時,該中間件對請求的
URL檢查flatpages數據庫作為最后的手段,特別的,它使用給定的URL和表示SITE_ID設置的站點ID來檢查flatpage
如果它找到一個匹配,它就載入flatpage的模板或者如果flatpage沒有指定自定義模板時使用flatpages/default.html,它
傳遞給模板一個單獨的context變量flatpage,它是flatpage對象,然后使用RequestContext渲染模板
如果它沒找到匹配,請求繼續照常處理
注意該中間件只為404激活--而不為500或其它狀態碼的應答,同時注意MIDDLEWARE_CLASSES的順序有關系,一般來說,你可
以將FlatpageFallbackMiddleware放在列表的末尾,因為它是最后的手段

怎樣添加,更改和刪除flatpages
通過admin界面
如果你激活了自動的Django的admin界面,你應該在admin首頁看到一個"Flatpages"部分,在系統中像編輯其它對象一樣編輯
flatpages
通過Python API
上面描述了,flatpages通過位于django/contrib/flatpages/models.py的標準Django模型來表示,這樣,你可以通過標準
Django數據庫API訪問flatpage對象,例如:
Java代碼 復制代碼
  1. >>> from django.contrib.flatpages.models import FlatPage   
  2. >>> from django.contrib.sites.models import Site   
  3. >>> fp = FlatPage(   
  4. ...     url='/about/',   
  5. ...     title='About',   
  6. ...     content='<p>About this site...</p>',   
  7. ...     enable_comments=False,   
  8. ...     template_name='',   
  9. ...     registration_required=False,   
  10. ... )   
  11. >>> fp.save()   
  12. >>> fp.sites.add(Site.objects.get(id=1))   
  13. >>> FlatPage.objects.get(url='/about/')   
  14. <FlatPage: /about/ -- About>  


Flatpage模板
flatpages默認通過模板flatpages/default.html渲染,但是你可以對應該特殊的flatpage覆蓋它
創建flatpages/default.html模板是你的責任,在你的模板目錄創建flatpages目錄并包含一個default.html文件
Faltpage模板傳遞了一個單獨的context變量flatpage,它是flatpage對象
這里是flatpages/default.html模板的例子:
Java代碼 復制代碼
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"  
  2.     "http://www.w3.org/TR/REC-html40/loose.dtd">   
  3. <html>   
  4. <head>   
  5. <title>{{ flatpage.title }}</title>   
  6. </head>   
  7. <body>   
  8. {{ flatpage.content }}   
  9. </body>   
  10. </html>  


重定向
Django的重定向框架讓你通過在數據庫里存儲它們來輕松管理重定向并把它們當作其它Django模型對象,例如你可以使用重
定向框架來告訴Django,"重定向任何對/music/的請求到/sections/arts/music/"

使用重定向框架
按下面步驟安裝重定向app:
1,把'django.contrib.redirects'安裝到你的INSTALLED_APPS
2,把'django.contrib.redirects.middleware.RedirectFallbackMiddleware'添加到你點MIDDLEWARE_CLASSES設置
3,運行命令manage.py syncdb來安裝單獨的必需表到你的數據庫

它怎樣工作
manage.py syncdb在你的數據庫安裝了一個django_redirect表,它是有site_id,old_path和new_path域的簡單查詢表
你可以通過Django的admin界面或者Django數據庫API創建重定向,參考下面的"怎樣添加,更改和刪除重定向"
一旦你創建了重定向,RedirectFallbackMiddleware做所有的工作,每次Django程序觸發了404錯誤,中間件都將檢查重定向
表作為最后的手段,特別的,它使用給定的old_path和表示SITE_ID設置的站點ID來檢查重定向(參考上面的"Sites"來得到更
多關于SITE_ID和sites框架),然后,它遵循下面的步驟:
1,如果它找到匹配,并且new_path不為空,則它將重定向到new_path
2,如果它找到匹配,并且new_path為空,它發送一個410("不存在")HTTP頭部和空(無內容)應答
3,如果它找不到匹配,請求繼續照常處理
中間件只為404激活--不為400或者任何其它狀態碼的應答
注意MIDDLEWARE_CLASSES的順序有關系,一般來說,你可以將RedirectFallbackMiddleware放置在列表末尾,因為它是最后
的手段

怎樣添加,更改和刪除重定向
通過admin界面
如果你激活了自動的Django的admin界面,你應該在admin首頁看到一個"重定向"部分,在系統中像編輯任何其它對象一樣編
輯重定向
通過Python API
重定向通過位于django/contrib/redirects/models.py的標準Django模型表示,這樣你可以通過Django數據庫API訪問重定向
對象,例如:
Java代碼 復制代碼
  1. >>> from django.contrib.redirects.models import Redirect   
  2. >>> from django.contrib.sites.models import Site   
  3. >>> red = Redirect(   
  4. ...     site=Site.objects.get(id=1),   
  5. ...     old_path='/music/',   
  6. ...     new_path='/sections/arts/music/',   
  7. ... )   
  8. >>> red.save()   
  9. >>> Redirect.objects.get(old_path='/music/')   
  10. <Redirect: /music/ ---> /sections/arts/music/>  


CSRF防護
django.contrib.csrf包提供了容易使用的跨站點請求偽造Cross-Site Request Forgeries(CSRF)防護

CSRF解釋
CSRF,也稱為"session駕馭",它是一個Web站點安全開拓,當一個惡毒的網站欺騙用戶未知的從一個他們已經認證站點載入
一個URL--這樣就可以使用他們的認證狀態,這起初可能有點難以理解,所以這里我們包含了兩個例子:
一個簡單的例子
比如說你已經在example.com登錄了一個webmail帳號,這個webmail站點有一個"注銷"按鈕指向URL為example.com/logout--
即你為了注銷所需要做的唯一的動作是訪問example.com/logout頁面
惡毒的站點可以通過把URL example.com/logout包含在他自己(惡毒的)頁面的一個隱藏的iframe來強迫你訪問該URL,這樣
如果你在example.com登錄了webmail帳號并訪問有example.com/logout的iframe的惡毒頁面,訪問該惡毒頁面的結果是將
你從example.com注銷
顯然,不按你的意愿從一個webmail站點注銷不是令人恐怖的安全漏洞,但是同類型的開拓可以發生在任何"信任"用戶的站點
--例如銀行站點或電子商務站點
一個更復雜的例子
在上個例子中,example.com部分有故障,因為他允許通過HTTP GET方法做狀態更改(即注銷你自己),對任何請求需要HTTP
POST來在服務器更改狀態是一個良好實踐,但是即使Web站點需要POST來做狀態改變對于CSRF也很易受到攻擊
比方說example.com升級了它的"注銷"功能為一個form按鈕來通過POST到URL example.com/logout來請求,而且,注銷form
包含下面隱藏域:
Java代碼 復制代碼
  1. <input type="hidden" name="confirm" value="true" />  

這保證了簡單的POST到URL example.com/logout將不執行注銷,為了讓用戶注銷,用戶必須通過POST并發送confirm POST變
量且值為'true'
但是不管額外的安全,這種方式仍然可以被CSRF開拓,惡毒的頁面只需做一點更多的工作,取代在iframe載入example.com/
logout頁面,它可以通過使用JavaScript和POST來調用該URL,并傳遞confirm=true變量
防止
這樣的話,怎樣防止你的站點被開拓呢?
第一步是確認所有的GET請求沒有副作用,這樣,如果惡毒的站點包含了一個你的頁面作為iframe,它將沒有壞作用
第二步是給每個POST表單一個隱藏域,值為隱秘的并從用戶的session ID生成,這樣,當在服務器端處理時檢查隱秘域,如
果它不合法則觸發一個異常
這就是Django的CSRF預防層做的事情

使用CSRF中間件
djang.csrf包只包含一個模塊:middleware.py,該模塊包含了Django的中間件類CsrfMiddleware,它實現了CSRF預防
為了使用它,把'django.contrib.csrf.middleware.CsrfMiddleware'添加到你的settings文件的MIDDLEWARE_CLASSes設置中
這個中間件需要在SessionMiddleware之后處理應答,所以CsrfMiddleware必須放在列表的SessionMiddleware之前,它也必
須在應答被壓縮或切碎之前處理,所以CsrfMiddleware必須放在GZipMiddleware之后
一旦你將它添加到你的MIDDLEWARE_CLASSES設置中,你就完成了,這是你需要做的所有的事情

它怎樣工作
如果你感興趣,這里是關于CsrfMiddleware怎樣工作,它做這兩件事情:
1,它通過使用csrfmiddlewaretoken名和session ID加上密碼的hash值來添加一個隱藏域到所有的POST表單來修改外出的請
求,如果沒有session ID設置則中間件不修改應答,所以執行處罰對于不使用sessions的請求可以忽略
2,對于所有進來的有session cookie設置的POST請求,它檢查csrfmiddlewaretoken存在并正確,如果不是這樣,用戶將得
到一個403HTTP錯誤,403錯誤頁面的內容是"發現跨站點請求偽造,請求中止"的信息
這確保了只有你的網站的原始表單可以用來POST回數據
該中間件故意只針對HTTP POST請求(以及相應的POST表單),我們上面解釋了,GET請求應該從來沒有副作用,確保這點是你
自己的責任
不通過session cookie完成的POST請求不被預防,但是它們也不需要預防,因為惡毒的網站不會偽造這種類型的請求
為了防止更改非文本請求,中間件在修改它之前檢查應答的Content-Type頭部,只有格式為text/html或者application/xml
+xhtml的頁面被修改

限制
CsrfMiddleware需要Django的session框架來工作(參考第12章),如果你正在使用一個自定義的手動慣例session cookie的
session或者認證框架,該中間件將不能幫助你
如果你的app用一些不尋常的方式創建HTML頁面和表單--例如,如果它用JavaScript的document.write語句傳遞HTML碎片--你
可能迂回添加隱藏域到表單的過濾器,這種情況下,表單提交將一直出錯(這會發生因為CsrfMiddleware使用正則表達式來在
頁面發送到客戶端之前添加csrfmiddlewaretoken域到你的HTML,而正則表達式有時候不能處理古怪的HTML),如果你懷疑這
可能發生,只需在你的瀏覽器查看源代碼來看看csrfmiddlewaretoken是否插入到你的表單
訪問http://en.wikipedia.org/wiki/Csrf來得到更多關于CSRF的信息和例子

內容類型
This section hasn't been written yet.

表單工具
This section hasn't been written yet.

使數據人性化
This section hasn't been written yet.

標記過濾器
This section hasn't been written yet.

Syndication種子
This section hasn't been written yet.
安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
主站蜘蛛池模板: 99精品久久久久 | av在线免费观看一区二区 | 午夜精品久久久久久久星辰影院 | 国产传媒毛片精品视频第一次 | 在线成人亚洲 | 不卡一二| 亚洲国产视频一区 | 成人日韩 | 国产精品久久九九 | 日韩毛片 | 久久精品亚洲精品国产欧美kt∨ | 日韩视频在线一区二区 | 国产成人精品久久二区二区91 | t66y最新地址一地址二69 | 亚州av | h视频免费看 | 免费的黄色网 | 午夜一级毛片 | 久久手机免费视频 | 日日夜夜免费精品视频 | 91视频电影| 欧美成人影院在线 | 国产在线第一页 | 久久蜜桃精品一区二区三区综合网 | 国产一区二区三区四区在线观看 | 成人在线视频一区 | 精品久久一区二区 | 日韩天堂 | 一区二区三区视频 | 亚洲成人精品久久久 | 久久久蜜桃一区二区人 | 国产精品综合一区二区 | 国产真实精品久久二三区 | 操操日| www久久久久 | 久久久久久成人精品 | 免费看片91 | 热re99久久精品国产99热 | 激情婷婷综合 | 国产精品xxxx | 亚洲一区二区三区久久久 | 精品视频网 | 国产精品成人一区二区三区 | 国产目拍亚洲精品99久久精品 | 欧美一区二区三区免费 | 日韩在线精品 | 亚洲欧美视频 | 97国产一区二区精品久久呦 | 成人国产精品一级毛片视频 | 欧美精品成人一区二区三区四区 | 欧美一区二区三区精品 | 天天碰天天操 | 成人毛片视频免费 | 日韩一区二区在线观看 | 一区自拍 | 日本成人中文字幕 | 亚洲精久 | 精品国产一区二区三区久久久蜜臀 | 欧美日韩亚洲一区二区 | 欧美日韩中文字幕在线 | 日韩喷潮 | 亚洲欧洲综合 | 亚洲黄色免费观看 | 国产毛片毛片 | 国产精选一区二区三区 | 国产偷录视频叫床高潮对白 | 日韩精品一区二 | 免费高潮视频95在线观看网站 | 亚洲国产高清在线 | 日韩色av | 精品久久久久久久久久久 | 亚洲欧美精品一区 | 青青草网站| 麻豆视频国产 | 中国免费看的片 | 99热播在线 | 日韩成人免费 | 精品天堂 | 国产又色又爽又黄 | 国产精品视频一二三区 | 国产羞羞视频 | 国产一区91 | 久久久久久亚洲精品 | 亚洲视频在线看 | 精品成人在线 | 黄色大片观看 | 国产精品一区二区三区在线播放 | 中文久久| 亚洲一区二区在线电影 | 九九精品视频在线 | 奇米av在线 | 精品一区二区三区在线视频 | 精品视频| 精品久久国产老人久久综合 | 韩日精品在线观看 | 精品伊人久久 | 毛片免费在线 | 日韩免费在线观看视频 | 色偷偷888欧美精品久久久 | 中文字幕在线日韩 | 色一情一乱一伦一区二区三区 | 91精品国产一区二区三区四区在线 | 美女视频一区二区三区 | 北条麻妃一区二区三区在线观看 | 精品视频在线观看一区二区三区 | 精品视频一区二区三区 | 91精品国产91久久久久久 | 午夜精品一区二区三区在线 | 91色爱| 国产乱码精品一区二区三区五月婷 | 亚洲人在线观看视频 | 日韩电影一区 | 午夜在线观看视频网站 | 国产一区二区精品在线 | 色花av | 亚洲国产精品99久久久久久久久 | 性xxxxxxxxx18欧美 | 91视频免费播放 | 日韩视频中文字幕 | 男女羞羞羞视频午夜视频 | 欧美| 亚洲欧美日韩精品 | 久久亚洲精品中文字幕 | 在线观看三级av | 日韩欧美二区 | 色小妹一二三区 | 亚洲成人av片 | 国产高清毛片 | av网站免费在线 | 久久久久久香蕉 | 激情在线观看视频 | 精品成人佐山爱一区二区 | 91人人| 91xxx在线观看 | 黄理论视频 | 国产又色又爽又黄 | 国产综合亚洲精品一区二 | 成人精品一区二区三区 | 久久青草av | 日韩精品久久久久久 | 天堂一区 | 免费久久久 | 久久久久久久久久久久久久久久久久久 | 亚洲人成网站999久久久综合 | 成人国产精品久久 | 国产精品久久久久一区二区三区共 | 国产成人一区 | 可以在线观看的黄色 | av一区二区三区四区 | 成人性大片免费观看网站 | 精品久久香蕉国产线看观看亚洲 | 免费成人av | 国产中文视频 | 天堂在线一区二区 | 九色在线播放 | 国产激情一区二区三区成人免费 | 一区二区三区国产免费 | 日韩一区二区三区在线观看 | 99色影院| aaaaaa黄色片 | 国产精品99在线观看 | 久在线 | 久久99精品久久久久久琪琪 | av大片 | 韩国精品一区 | 91福利在线播放 | 国产亚洲欧美一区 | 久久久久久免费免费 | 国产传媒视频 | 亚洲伦理一区 | 一级片在线观看网站 | 日韩成人免费中文字幕 | 天天干网 | 亚洲国产一区二区三区四区 | h网站在线观看 | 亚洲欧美日韩另类精品一区二区三区 | 久久草草影视免费网 | 99在线视频播放 | 久久久精品网站 | 久久久国产视频 | 午夜爱视频 | 99亚洲国产| 日韩精品视频免费专区在线播放 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 羞羞视频免费网站 | 亚洲激情av| www.成人| 91精品一区二区三区久久久久久 | 成人高清视频在线 | 欧洲成人午夜免费大片 | 99热播在线| 国产一区二区视频在线观看 | 激情久久久久 | 久久精品国产77777蜜臀 | 成人欧美一区二区三区 | 欧洲毛片 | 国产一区二区免费 | 一区二区久久 | 密室大逃脱第六季大神版在线观看 | 天堂动漫| 国产在线网站 | 韩国一区二区视频 | 国产成人免费视频 | 国产精品亚洲第一 | 欧美日韩一区二区在线 | 国产欧美综合视频 | 国产一区二区精品在线 | 91精品久久 | 久久一区 | 亚洲一区二区三区四区在线 | 欧美国产日本一区 | 国产乱码精品一区二区三区手机版 | 91亚洲高清 | 免费v片在线观看 | 欧美性一区二区 | 欧美精品一区二区三区在线播放 | 天天操天天插天天干 | 欧美日韩视频在线 | 日韩在线成人av | 久久福利 | 日韩国产高清在线 | 日韩精品专区在线影院重磅 | 久久99国产伦子精品免费 | 宅男伊人| 精品国产黄a∨片高清在线 激情网站免费 | 国产精品2 | 日韩精品在线免费观看视频 | 激情网在线观看 | 午夜视| 96自拍视频 | 中文无码久久精品 | 日日爽 | 国产精品一区二区无线 | 久久久久久国产精品 | 美女久久久| 91久久久久久久久久久久久久 | 欧美精品三区 | 狠狠se| 日韩成人免费av | 日本精品在线 | 天天干天天谢 | 亚洲视频观看 | 福利片一区二区 | 91色在线 | 天天爽夜夜爽夜夜爽精品视频 | 成人不卡视频 | 午夜影皖 | 国产精品久久久久久婷婷天堂 | 国产午夜精品一区二区三区嫩草 | 毛片免费网站 | av影音在线 | 三级黄视频在线观看 | 欧美成人免费观看 | 在线看91| 一区二区免费视频 | 日韩不卡一区二区三区 | 成人精品福利视频 | 国产视频精品在线观看 | 欧日韩毛片 | 性高湖久久久久久久久 | 亚洲国产成人久久一区二区三区 | 91精品国产综合久久国产大片 | 五月婷婷综合久久 | 久久黄色网 | 久久精品中文 | 欧美日韩一区二区三区在线观看 | 久久久毛片| 日韩福利在线 | 伊人网站| 久久久久久久91 | 国产人成精品一区二区三 | 日韩一区二区在线播放 | 我爱操| 91文字幕巨乱亚洲香蕉 | 一级二级黄色大片 | 精品国产一区二区三区成人影院 | 日韩av在线中文字幕 | a级在线 | 成人免费视频观看视频 | 国产精品久久久久久久久免费桃花 | 欧洲毛片 | 91精品国产欧美一区二区成人 | 99久久精品免费看国产四区 | 亚洲色图p | 在线观看日韩 | av影片在线| 国产精品一区二区三区在线播放 | 日韩一区二区在线视频 | 小草av| 日本三级黄色录像 | 欧美一级二级片 | 国产视频久久 | 卡通动漫第一页 | www.一区二区三区 | 国产乡下妇女做爰视频 | 精品久久久久一区二区国产 | 欧美精品1区 | 国产在线一区观看 | 黄色av网站免费 | 羞羞视频在线观看入口 | 亚洲人成中文字幕在线观看 | 中文字幕亚洲一区二区三区 | 99热精品视 | 一级毛片免费播放 | 一区二区三区在线免费观看 | 亚洲人免费视频 | 亚洲一级视频在线 | 国产天天操| 欧美精品一区自拍a毛片在线视频 | 自拍偷拍亚洲欧洲 | 国产日韩欧美一区二区 | 免费亚洲一区二区 | 四虎最新网站 | 久久久久女人精品毛片九一韩国 | 久久成人国产视频 | 天堂在线中文 | 香蕉视频91| 久久精品久久久久久久久久久久久 | 男女羞羞视频免费在线观看 | k8久久久一区二区三区 | 亚洲网站视频 | 求av网址| 久久久久成人精品 | 欧美一区二区三区 | 国产综合精品一区二区三区 | 亚洲国产成人精品女人 | 国产精产国品一二三产区视频 | 中文字幕日韩欧美一区二区三区 | 日韩av视屏 | 亚洲欧美中文日韩在线v日本 | 久久美女| 一区二区不卡视频在线观看 | 久久久.com | 精品欧美一区二区三区久久久 | 国产精品视频 | av网站大全免费 | 中文字幕一区二区三区不卡 | 国产麻豆乱码精品一区二区三区 | 国产第一亚洲 | 欧洲精品在线观看 | 毛片视频播放 | 亚洲精品中文字幕乱码无线 | 在线视频一区二区三区 | 黄色影视在线免费观看 | 最新av中文字幕 | 欧美亚洲天堂 | av福利网站| 成人一级视频在线观看 | 一级a毛片 | 青青草一区| 国产精品一区二 | 三级视频在线 | 狠狠狠| 成人免费视频观看 | 国产91视频在线观看 | 91免费看网站 | 免费成人一级片 | 好姑娘影视在线观看高清 | 玖玖玖精品视频 | 亚洲看片 | 欧美成年视频 | 蜜桃免费一区二区三区 | 欧美日韩综合一区 | 成人免费视频网站在线看 | 国产精品第一国产精品 | 亚洲精品电影在线观看 | 日韩在线播放一区二区三区 | 国产精品视频播放 | 欧美国产在线观看 | 国产精品日产欧美久久久久 | 精品国产高清一区二区三区 | 精品亚洲一区二区三区在线观看 | 日本一级毛片视频 | 成人蜜桃视频 | 国内外成人在线视频 | 亚洲网站在线观看 | 日韩成人影院 | 一区二区日韩精品 | 中文无吗 | 五月激情综合 | 国产男女爽爽爽免费视频 | 国产区免费在线观看 | 精品久久久久久久久久 | 正在播放国产精品 | 操人在线观看 | 我要看一级黄色 | av在线一区二区三区 | 国产一区| 国产精品久久久久国产精品 | 在线视频一二区 | 99re在线免费 | 国产区福利 | 最新日韩精品在线观看 | 日韩欧美国产精品一区二区三区 | 亚洲一区二区三区在线观看免费 | 国产精品美女久久久久aⅴ国产馆 | 精品国产一区二区三区日日嗨 | 天堂在线一区二区 | 日本黄a三级三级三级 | 老司机狠狠爱 | 欧美日本久久 | 999久久久国产精品 免费视频一区 | 中文在线播放 | 国产综合精品一区二区三区 | 黄色大片在线 | 欧美在线一区二区三区 | 久久国产亚洲 | 可以看av的网站 | 另类久久| 亚洲福利一区二区 | 成人h动漫免费观看网站 | 欧美黑人xxx| 亚洲精品在线视频 | 99精品欧美一区二区蜜桃免费 | 精品国产乱码久久久久久1区2区 | 中字幕视频在线永久在线观看免费 | 亚洲成人观看 | 国产精品毛片无码 | 亚洲精品片 | 国产精品精品久久久 | 国产一区二区三区四区在线观看 | 成人作爱视频 | 国产精品一区二区三区免费 | 中文字幕在线免费 | 国产亚洲在线 | 国产婷婷久久 | 国产目拍亚洲精品99久久精品 | 免费一区二区三区 | 久久国产精品免费一区二区三区 | jlzzjlzz亚洲日本少妇 | 99re在线观看 | 国产精品伦一区二区三级视频 | 国产午夜视频 | 国产一区二区三区免费播放 | 免费v片| 羞羞视频网站 | 精品国产一区二区在线 | 免费国产黄色大片 | 久久91精品国产91久久跳 | 日韩精品一区二区三区老鸭窝 | 97在线视频免费 | 蜜桃视频在线播放 | av免费在线观看网站 | 久久国产精品视频 | 神马久久久久久久久 | 国产一区 欧美 | 成人av片在线观看 | 精品成人久久 | 久久精品亚洲精品 | 九九视频网 | 午夜视频在线观看免费视频 | 亚洲一区播放 | 91久久91久久精品免观看 | 久草.com| 国产精品网站在线看 | 久热最新 | 嫩草成人影院 | 日韩一区二区三区精品 | 日韩一区二区三区在线观看 | 日韩福利电影 | 天天干狠狠 | 日韩一区二区在线播放 | 亚洲综合精品 | 国产午夜精品久久久久免费视高清 | 日韩国产二区 | 国产精品丝袜一区二区 | a级片网站 | 亚洲成人精品av | 在线欧美视频 | 国产视频1区 | 国产精品久久久久婷婷二区次 | 国产一区二区影院 | 在线免费观看黄 | 国产剧情一区二区 | 久久精品毛片 | 做视频免费观看网站 | 美女一区二区三区四区 | 91国产精品 | a级毛片黄 | www久久精品 | 在线99热 | av自拍 | 黄色免费成人 | 久久国产精品影视 | 性色av一二三杏吧传媒 | 日韩久久网 | 玖玖视频在线 | 三级精品 | 国产高清精品一区二区三区 | 日本中文字幕在线播放 | 成人超碰 | 日韩小视频网站hq | 欧美一区二区在线看 | 在线观看日韩精品 | 99影视| 欧美激情高清 | 久久久精品免费观看 | 男人的天堂免费 | 99精品国产高清一区二区麻豆 | 久久在线| 亚洲一区精品视频 | 日韩三级电影免费观看 | 久久亚洲综合 | 成年人性视频 | 一级毛片免费播放 | www.久久久| 国产精品久久久久aaaa | 久久成人一区二区 | 午夜寂寞少妇aaa片毛片 | 国产黄色大片 | 国产香蕉视频在线播放 | 欧美日韩成人在线 | 精品国产天堂 | 国产成人免费视频网站视频社区 | 日本一区二区三区中文字幕 | 草久久久 | 四影虎影ww4hu55.com | 国产精品自拍一区 | 国产高清视频一区二区 | 在线免费观看黄色 | 亚洲成人综合在线 | 一区二区三区在线视频播放 | 久久久久久久久中文字幕 | 精品视频一区在线观看 | 男女视频在线观看 | 日韩视频免费 | 亚洲成人伦理 | 激情欧美日韩一区二区 | 亚洲人久久 | 免费av电影网站 | 日本私人网站在线观看 | 国产精品久久久久久久久久久久久久 | 成人欧美一区二区三区在线观看 | 亚洲精品久久久久久久久久久久久 | 午夜激情影院 | 特黄一级 | 久久精品国产视频 | 精品亚洲自拍 | 国产精品成人国产乱一区 | 美女一级 | 在线观看免费毛片视频 | 欧美在线网站 | 国产综合精品 | 中文字幕av第一页 | 日韩中文在线 | 香蕉久久久久久 | h视频免费在线 | 亚洲午夜在线 | 日日爱视频| a级黄色在线观看 | 国产a级毛片 | 日韩精品一区二区三区四区 | 中文字幕一区二区在线观看 | 91社区在线高清 | 久久久精品久久久久 | 91高清视频在线观看 | 成人国产精品视频 | 午夜欧美 | 看真人视频a级毛片 | 久久久久久久久综合 | 亚洲国产精品久久久男人的天堂 | www久久99| 日韩欧美国产一区二区 | 91最新网站 | 欧美成人二区 | 亚洲风情在线观看 | 国产午夜精品久久久久久久 | 亚洲xx视频 | 精品欧美一区二区精品久久久 | 婷婷网址 | 欧美日韩伊人 | 精品久久亚洲 | 国产在线观看一区 | 亚洲视频在线看 | 欧美精品一二三区 | 成人免费在线视频 | 亚洲日韩欧美一区二区在线 | 黄色手机在线观看 | av激情在线 | 久久久久久久久久久成人 | 99re在线视频 | 久久激情综合 | 精品一区二区三区免费毛片爱 | 欧美一级毛片免费观看 | 视频一区免费观看 | 夜夜视频 | 国产精品永久在线观看 | www国产xxx | 精品无人乱码一区二区三区的优势 | 欧美激情在线播放 | 日本三级精品视频 | 先锋资源在线观看 | 成年人视频免费在线看 | 中文字幕亚洲一区 | 日韩一区二区三区在线观看 | 国产一区二区三区视频在线观看 | 一区二区三区在线播放 | 久久久影视 | 久久久久久国产精品美女 | 精品国产九九 | 亚洲人成人一区二区在线观看 | 日韩在线不卡 | 国产精品视频播放 | 日本网站在线免费观看 | 国产精品国产三级国产aⅴ9色 | 国产精品欧美一区二区三区 | 午夜视频在线播放 | 男人天堂网av | 欧美成人中文字幕 | 久久精品免费电影 | 亚洲v日韩v综合v精品v | 99久久婷婷国产综合精品电影 | 毛片网站大全 | 亚洲人成在线观看 | 国产精品1区 |