2011-09-22 32 views
5

Tôi có một số mã kiểm tra (như là một phần của một webapp) có sử dụng urllib2 để thực hiện một hoạt động tôi thường sẽ thực hiện thông qua một trình duyệt:Vấn đề Urllib2 không giải thích được giữa virtualenv.

  • Đăng nhập vào một trang web từ xa
  • Di chuyển đến một trang khác
  • Thực hiện một POST bằng cách điền vào một hình thức

tôi đã tạo ra 4, virtualenvs sạch riêng biệt (với --no-site-packages) trên 3 máy khác nhau, tất cả với các phiên bản khác nhau của python nhưng cùng chính xác các gói (thông qua tệp yêu cầu pip) và mã o nly hoạt động trên hai virtualenv trên máy phát triển cục bộ của tôi (2.6.1 và 2.7.2) - nó sẽ không hoạt động trên một trong hai VPS sản xuất của tôi

Trong trường hợp không thành công, tôi có thể đăng nhập thành công, di chuyển đến đúng trang nhưng khi tôi gửi biểu mẫu, máy chủ từ xa trả lời cho tôi biết rằng đã xảy ra lỗi - đó là trang lỗi máy chủ ứng dụng ('chúng tôi không thể hoàn tất yêu cầu của bạn') và không phải là lỗi máy chủ web.

  • vì tôi có thể đăng nhập thành công và cơ động đến trang thứ hai, điều này dường như không phải là một phiên làm việc hoặc một vấn đề Cookie - đó là đặc biệt đến POST thức
  • vì tôi có thể thực hiện các hoạt động trên máy cụ thể có cùng tiêu đề và dữ liệu giống nhau, điều này dường như không phải là vấn đề với những gì tôi yêu cầu/đăng
  • vì tôi đang thử mã trên hai VPS riêng biệt được thuê từ các công ty khác nhau là một vấn đề với môi trường vật lý VPS
  • vì mã hoạt động trên 2 phiên bản python khác nhau, tôi không thể tưởng tượng nó là một phiên bản không tương thích vấn đề bilty

Tôi hoàn toàn bị mất ở giai đoạn này là tại sao điều này sẽ không hoạt động. Tôi thậm chí còn 'bật-tắt-và-rẽ-nó-trên-một lần nữa' bởi vì tôi không thể thấy vấn đề có thể là gì.

Tôi nghĩ rằng nó phải là một cái gì đó để làm với POST cuối cùng đến từ một VPS mà máy chủ từ xa không thích, nhưng tôi không thể tìm ra những gì có thể được. Tôi cảm thấy như có một cái gì đó đang xảy ra dưới mui xe của URLlib đó gây ra các máy chủ từ xa không thích trả lời.

EDIT Tôi đã cài đặt cùng một phiên bản Python chính xác (2.6.1) trên VPS như là bản sao cục bộ làm việc của tôi và nó không hoạt động từ xa, vì vậy nó phải có cái gì để làm với nguồn gốc từ một VPS. Làm thế nào điều này có thể ảnh hưởng đến yêu cầu Http? Có điều gì đó thấp hơn không?

+0

Có tường lửa nào chạy trên VPS hoặc trên trang web mục tiêu không? Bạn có đang sử dụng cookie hay không và liệu chúng có được viết đúng cách trong quá trình sản xuất không? –

+0

Không, tôi đang chạy nó trên hai VPS riêng biệt và nó không hoạt động cho một trong hai, nhưng tôi không nghĩ rằng họ đang đứng sau bức tường lửa. Tôi đang sử dụng cookie với cookielib, nhưng tôi không nghĩ rằng đó là vấn đề bởi vì các cookie làm việc cho hai hoạt động đầu tiên (trang đăng nhập và thay đổi) –

Trả lời

0

Vâng, có vẻ như tôi biết lý do tại sao sự cố đã xảy ra, nhưng tôi không phải là 100% lý do.

Tôi chỉ đơn giản là bị buộc phải chờ đợi máy chủ (time.sleep()) sau khi gửi yêu cầu thứ 2 (Di chuyển đến một trang khác) trước khi thực hiện yêu cầu thứ 3 (Thực hiện một POST bằng cách điền vào một hình thức) .

Tôi không biết là do điều kiện với máy chủ của bên thứ ba hay là một số vấn đề kỳ lạ với URLlib? Lý do nó dường như làm việc trên máy phát triển của tôi có lẽ vì nó chậm hơn khi máy chủ chạy mã?

1

Bạn có thể thử thiết lập debuglevel = 1 cho urllib2 và xem những gì nó đi kèm với:

import urllib2 
h=urllib2.HTTPHandler(debuglevel=1) 
opener = urllib2.build_opener(h) 
... 
+0

Tôi đã thông qua chúng với một chiếc lược răng tốt! Tôi cũng so sánh những người làm việc với những người không làm việc và họ khá giống nhau. Tôi sẽ chỉnh sửa và đưa ra một số ví dụ –

1

Đây là một tổng shot trong bóng tối, nhưng bạn VPSS 64-bit và máy tính ở nhà của bạn 32 -bit, hoặc ngược lại? Có thể có sự khác biệt về kích thước hoặc độ chính xác mặc định của một điều gì đó có thể khiến máy chủ khó chịu.

Chặn điều đó, bạn có thể thử tìm hiểu bất kỳ thông tin nào về ngăn xếp phần mềm mà máy chủ web đang sử dụng không?

+0

Đề xuất tốt, nhưng tiếc là chúng giống nhau! –

1

Tôi có các vấn đề tương tự với urllib2 (làm việc với REST api của Zimbra), cuối cùng chuyển sang pycurl thành công.

PS cho các hoạt động đăng nhập/điều hướng/đăng bài, tôi thường tìm thấy Mechanize hữu ích và dễ sử dụng hơn. Có lẽ bạn có thể cho nó một chương trình.

+0

Tôi nghĩ rằng đây có thể là lựa chọn duy nhất ở giai đoạn này. Tôi đã thử mọi thứ có thể hiểu được để làm cho nó hoạt động và tôi chỉ có thể tưởng tượng đó là vấn đề tương thích tối nghĩa. Tôi đã thực sự sử dụng cơ chế đó là tuyệt vời, nhưng tiếc là tôi tin rằng nó nằm trên đầu trang của Urllib2 có nghĩa là cùng một vấn đề xảy ra. –

Các vấn đề liên quan