2014-07-03 21 views
5

Django'da bir web uygulaması yazdım. Bir python komut dosyasından bir forma bazı veriler göndermem gerekiyor. Oturum açma devre dışı bırakıldığında posta (r2) düzgün çalışır. Giriş için doğru şekilde çalışıyorum (r1), ama bana form yazısı (r2) için 404 hatası veriyor. Giriş ikinci istek üzerine taşınmış gibi görünmüyor. Csrftoken ve sessionid, onları tanımak için test edilmek üzere kodlanmıştır. (URL baz kaldırıldı) İlgili kod:İstek ve Django kullanarak komut dosyasından web sayfasına giriş

url_login='../pecasRunLog/accounts/login/' 
url_add_run='../pecasRunLog/model/'+region+'/add_run/' 

client = requests.session() 
client.get(url_login) 
csrftoken = client.cookies['csrftoken'] 
login_data = {'username':user,'password':password, 'csrfmiddlewaretoken':csrftoken, 'next': '/pecasRunLog/'} 
r1=client.post(url_login,data=login_data) 

payload={'model_region':region_id,'scendir':scendir, 'mapit_scenario': schema, 'run_name':schema+timestamp, 'run_computer_name':os.environ['COMPUTERNAME'], 'run_computer_ip':get_lan_ip(), 'declared_user':declared_user, 'logged_in_user':getpass.getuser(), 'sd_schema':schema, 'sd_database':database, 'sd_host':get_lan_ip(), 'sd_port':pgport,'mapit_schema':schema, 'mapit_database':database, 'mapit_host':get_lan_ip(), 'mapit_port':pgport,'start_date':start_date, 'start_time':start_time, 'end_date':end_date, 'end_time':end_time,'logged_manually':3, 'csrfmiddlewaretoken':csrftoken, 'sessionid':'jtvv50cs3iyo9bjthbr2diujfmrrlsnf'} 
r2=requests.post(url_add_run,payload) 
+0

r2 yerine 'requests' ait' client' itibaren yapılmalıdır ? –

+0

'client.post' olarak değiştirdiğimde 'csrftoken' tanımıyor. Her iki komut da ayrı çalışır, ama birlikte değil. –

+0

Oturumunuzu kullanmazsanız, ikinci isteğinizle birlikte gönderilen çerezlerden ilk isteğinizin gönderilmesini bekleyemezsiniz. –

cevap

6

oturumundan göndermeye devam etmelisiniz, ancak r2, r1 tarafından döndürülen çerezlere sahip olması gerektiği için çalışmıyor. Bu düzeltmeyebilir, ancak bu değişiklik en az yapmadan çalışmak olası değildir. Bunu yapmak için, betik boyunca aynı oturumu kullanabilir veya ilk istekten sonra her istek için çerezleri iletebilirsiniz. Bu yöntemler işe yaramazsa, dikkatle bakarak deneyin

url_login='../pecasRunLog/accounts/login/' 
url_add_run='../pecasRunLog/model/'+region+'/add_run/' 

r0 = requests.get(url_login) 
csrftoken = r0.cookies['csrftoken'] 
login_data = {'username':user,'password':password, 'csrfmiddlewaretoken':csrftoken, 'next': '/pecasRunLog/'} 
r1=requests.post(url_login,data=login_data,cookies=r0.cookies) 

payload={'model_region':region_id,'scendir':scendir, 'mapit_scenario': schema, 'run_name':schema+timestamp, 'run_computer_name':os.environ['COMPUTERNAME'], 'run_computer_ip':get_lan_ip(), 'declared_user':declared_user, 'logged_in_user':getpass.getuser(), 'sd_schema':schema, 'sd_database':database, 'sd_host':get_lan_ip(), 'sd_port':pgport,'mapit_schema':schema, 'mapit_database':database, 'mapit_host':get_lan_ip(), 'mapit_port':pgport,'start_date':start_date, 'start_time':start_time, 'end_date':end_date, 'end_time':end_time,'logged_manually':3, 'csrfmiddlewaretoken':csrftoken, 'sessionid':'jtvv50cs3iyo9bjthbr2diujfmrrlsnf'} 
r2=requests.post(url_add_run,payload,cookies=r1.cookies) 

:

İşte
url_login='../pecasRunLog/accounts/login/' 
url_add_run='../pecasRunLog/model/'+region+'/add_run/' 

client = requests.session() 
client.get(url_login) 
csrftoken = client.cookies['csrftoken'] 
login_data = {'username':user,'password':password, 'csrfmiddlewaretoken':csrftoken, 'next': '/pecasRunLog/'} 
r1=client.post(url_login,data=login_data) 

payload={'model_region':region_id,'scendir':scendir, 'mapit_scenario': schema, 'run_name':schema+timestamp, 'run_computer_name':os.environ['COMPUTERNAME'], 'run_computer_ip':get_lan_ip(), 'declared_user':declared_user, 'logged_in_user':getpass.getuser(), 'sd_schema':schema, 'sd_database':database, 'sd_host':get_lan_ip(), 'sd_port':pgport,'mapit_schema':schema, 'mapit_database':database, 'mapit_host':get_lan_ip(), 'mapit_port':pgport,'start_date':start_date, 'start_time':start_time, 'end_date':end_date, 'end_time':end_time,'logged_manually':3, 'csrfmiddlewaretoken':csrftoken, 'sessionid':'jtvv50cs3iyo9bjthbr2diujfmrrlsnf'} 
r2=client.post(url_add_run,payload) 

senaryo boyunca çerezleri geçen gibi görünebilir şudur: Burada

Ne gibi görünebilir boyunca oturumu kullanıyor Çerezlerde ve belki problemi göreceksiniz.

+0

Teşekkürler. İlk çözümün işe yaradı! Sanırım, testlerimi etkileyen diğer tamamlanmamış fonksiyonların bir bileşimi de vardı. –

0

bu deneyin:

url_login='../pecasRunLog/accounts/login/' 
url_add_run='../pecasRunLog/model/'+region+'/add_run/' 

with requests.session() as client: 
    client.get(url_login) 
    csrftoken = client.cookies['csrftoken'] 
    login_data = {'username':user,'password':password, 'csrfmiddlewaretoken':csrftoken, 'next': '/pecasRunLog/'} 
    r1=client.post(url_login,data=login_data) 

    payload={'model_region':region_id,'scendir':scendir, 'mapit_scenario': schema, 'run_name':schema+timestamp, 'run_computer_name':os.environ['COMPUTERNAME'], 'run_computer_ip':get_lan_ip(), 'declared_user':declared_user, 'logged_in_user':getpass.getuser(), 'sd_schema':schema, 'sd_database':database, 'sd_host':get_lan_ip(), 'sd_port':pgport,'mapit_schema':schema, 'mapit_database':database, 'mapit_host':get_lan_ip(), 'mapit_port':pgport,'start_date':start_date, 'start_time':start_time, 'end_date':end_date, 'end_time':end_time,'logged_manually':3, 'csrfmiddlewaretoken':csrftoken, 'sessionid':'jtvv50cs3iyo9bjthbr2diujfmrrlsnf'} 
    r2=client.post(url_add_run,payload) 

Bu çalışırsa, ben sorun düzenli ilk yeni oluşturulan oturumdan yazı ve ardından yapılacak olduğunu düşünüyorum ,

+0

Bunu daha önce denedim ve şimdi tekrar test ettim. 'Csrftoken' tanımlı değil diyor. Seansta da aynı sorun vardı. –

+0

Bir süre önce benzer bir betik yazdım, buna rağmen cookies kullanmıyor, çünkü request.session() komut dosyasında oturumunuzu koruyor. Belki de bu kodun hem kod hem de sunucu tarafı kodundan kaldırmaya çalışın ve sonra bu bileşen işe yaradıktan sonra bunları tekrar ekleyin. Ayrıca şunu da görün: http://stackoverflow.com/questions/13567507/passing-csrftoken-with-python-requests?rq=1 – mleyfman

+0

“sessionid” dosyasını kaydettiğinizi görüyorum. Yayının her çalıştırılmasında 'sessionid 'değişikliği olabilir mi? Onu 'yükten 'kaldırmayı deneyin. –

3

Sadece aynı sorunla karşılaşıyorum.

Oturum açma sayfası için giriş ana sayfasından django farklı giriş URL'sine benziyor.

benim için bu kod çalışması

import requests 
URL1='http://localhost:8000/admin/' 
URL='http://localhost:8000/admin/login/?next=/admin/' 
UN='bino' 
PWD='sendhimin' 
client = requests.session() 

# Retrieve the CSRF token first 
client.get(URL1) # sets the cookie 
csrftoken = client.cookies['csrftoken'] 

login_data = dict(username=UN, password=PWD, csrfmiddlewaretoken=csrftoken) 
r = client.post(URL2, data=login_data, headers={"Referer": "foo"}) 
İlgili konular