2012-03-27 139 views
0

我想創建一個外部python客戶端來訪問一個Django應用程序。客戶端應該對用戶進行身份驗證,生成cookie並能夠像訪問任何瀏覽器一樣訪問頁面。Python身份驗證Cookie和Django會話

login_data_encoded = urllib.urlencode({'user':'sample', 'pass':'secret'}) 
cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
urllib2.install_opener(opener) 
opener.open('http://localhost:8000/login', login_data_encoded) #problem here 
response = opener.open('http://localhost:8000/secret_page') 
secret_page = response.read() 

在Python解釋:

import client 

client.secret_page 
--> [] 

但頁面是空的。我可以在瀏覽器中查看頁面(一旦以示例用戶身份登錄,登錄工作)。由於我沒有爲用戶啓動django會話,Django將我標識爲匿名用戶(因爲權限,它不允許我查看示例用戶的數據)。如何通過客戶端啓動django會話? (不帶瀏覽器)

我希望我已經說清楚了。

編輯1:

它記錄了我在爲匿名用戶,有或沒有斜槓沒有差別。代碼或模板中沒有csrf。 Django的日誌顯示200響應,並且200獲得secret_page。 cj包含cookie信息:

<cookielib.CookieJar[Cookie(version=0, name='app_r12', value='dd070f7acfe37c0474c223287c5adcbe', port=None, port_specified=False, domain='localhost.local', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]> 

opener.open(POST 1)的響應是200和url是相同的。

回答

0

我正在發送POST請求到錯誤的URL。這意味着被髮送到:

opener.open('http://localhost:8000/auth', login_data_encoded) 

對不起我的錯誤。我想如果我發送請求到登錄頁面,它會工作,但登錄頁面不會正確的看法。將其更改爲具有正確視圖的網址後,其作品。

謝謝你的答案,他們真的很有幫助。

1

您需要發佈到登錄頁面,保存cookie,然後發送cookie以及其他後續請求。事情是這樣的:

import requests 

credentials = {'login': 'foo', 'password': 'secret'} 
web = requests.post('http://localhost:8000/login',data=credentials) 
secure_cookie = web.cookies 
web = requests.get('http://localhost:8000/secret_page',cookies=secure_cookie) 
the_page = web.text 
+0

對不起web.text不起作用:'響應'對象沒有屬性'文本'。我如何查看頁面? – Neeran 2012-03-27 11:44:55

+0

找出它的網頁。內容,但它只是把我帶到登錄頁面,而不是祕密頁面 – Neeran 2012-03-27 12:01:21

+0

你確定你傳遞了正確的憑據嗎? – 2012-03-27 12:20:35

1

在你的代碼的一些可能出現的問題

  • 中沒有結束斜線的「http://本地主機:8000 /登錄」爲啓用APPEND_SLASH時不能重定向一個POST 。
  • login_data_encoded中沒有csrf_token信息。登錄視圖是否有csrf_exempt裝飾?
  • 有沒有必要的字段可以通過?

您可能還

  • 的Django
  • 的檢查日誌
  • 檢查CJ
  • 的內容
  • 檢查opener.open的響應(的 'http://本地主機:8000 /登錄',包括代碼和當前的URL
+0

它以匿名用戶身份登錄,無或沒有斜槓。代碼或模板中沒有csrf。 Django的日誌顯示200響應,並且200獲得secret_page。 cj包含cookie信息。 opener.open的響應也是200,url是一樣的。 – Neeran 2012-03-27 14:15:31

+0

@Jimmy是會話密鑰app_r12嗎?如果是的話,你可以檢查它的值。 – okm 2012-03-28 01:05:43