Ban đầu, tôi đã cố gắng đăng một yêu cầu ajax từ phía máy khách của mình đến một URL của bên thứ ba, nhưng có vẻ như trình duyệt có vấn đề về bảo mật với điều đó. Tôi nghĩ về việc gửi một ajax đến phía máy chủ, từ đó để gửi một yêu cầu GET cho bên thứ ba, nhận được phản hồi và gửi nó trở lại phía máy khách. Làm thế nào tôi có thể làm điều đó với bình?Làm cách nào để gửi yêu cầu GET từ ứng dụng bình của tôi đến một trang web khác?
Trả lời
Cài đặt requests
mô-đun (đẹp hơn nhiều so với sử dụng urllib2
) và sau đó xác định một lộ trình mà làm theo yêu cầu cần thiết - một cái gì đó như:
import requests
from flask import Flask
app = Flask(__name__)
@app.route('/some-url')
def get_data():
return requests.get('http://example.com').content
Tùy thuộc vào thiết lập của bạn, mặc dù nó sẽ được tốt hơn để cấu hình máy chủ web của bạn để đảo ngược proxy đến trang web mục tiêu theo một URL nhất định.
Bình một mình không có khả năng này, nhưng chỉ đơn giản là viết trình xử lý yêu cầu thực hiện yêu cầu tới máy chủ khác bằng thư viện ứng dụng khách HTTP và sau đó trả về phản hồi đó.
# third-party HTTP client library
import requests
# assume that "app" below is your flask app, and that
# "Response" is imported from flask.
@app.route("/proxy-example")
def proxy_example():
r = requests.get("http://example.com/other-endpoint")
return Response(
r.text
status=r.status_code,
content_type=r.headers['content-type'],
)
Tuy nhiên, điều này sẽ không đạt được kết quả tương tự như bạn mong đợi từ yêu cầu phía máy khách. Vì máy chủ của bạn không thể "xem" bất kỳ cookie nào mà trình duyệt khách đã lưu trữ cho trang đích, yêu cầu proxy của bạn sẽ ẩn danh một cách hiệu quả và do đó, tùy thuộc vào trang đích, có thể bị lỗi hoặc phản hồi khác với yêu cầu của bạn tài nguyên đó trong trình duyệt.
Nếu bạn có mối quan hệ với URL của bên thứ ba (nghĩa là, nếu bạn kiểm soát hoặc có thể làm việc với những người làm) họ có thể cấp quyền truy cập cho yêu cầu tên miền chéo trong trình duyệt bằng cách sử dụng CORS (chỉ được hỗ trợ trong các trình duyệt hiện đại) hoặc JSON-P (một giải pháp cũ hơn có trước CORS).
Nhà cung cấp bên thứ ba cũng có thể cung cấp cho bạn quyền truy cập vào dữ liệu bạn muốn tại điểm cuối được thiết kế để chấp nhận yêu cầu từ các máy chủ khác và cung cấp cơ chế để bạn xác thực ứng dụng của mình. Giao thức phổ biến nhất cho điều này là OAuth.
Bạn đã thử chạy ví dụ này bên trong một ứng dụng Flask đang chạy chưa? Cũng như những người khác đang cố gắng tìm nạp, tôi nhận được lỗi như "requests.exceptions.InvalidSchema: Không tìm thấy bộ điều hợp kết nối nào cho ..." (... == url mục tiêu của tôi). Tôi đã thử một số loại url, từ http://myurl.com đến những thứ như http: // localhost: 5000/myurl ... nhưng không yêu cầu. Và tôi thậm chí đã cố gắng gọi đệ quy tới route để xem liệu 'requests.get()' có hoạt động (và kích hoạt lại route), nhưng ngay cả các url như 'requests.get (" localhost: 5000/myroute ")' do không gây ra các cuộc gọi đệ quy. Có vẻ như yêu cầu không hoạt động ... – JMM
Khi các câu trả lời khác đã tuyên bố bằng cách sử dụng mô đun yêu cầu cho python sẽ là cách tốt nhất để giải quyết vấn đề này từ góc độ mã hóa. Tuy nhiên như những bình luận đã đề cập (và lý do tôi đưa ra câu hỏi này) điều này có thể đưa ra một lỗi rằng yêu cầu đó đã bị từ chối. Lỗi này có thể do SELinux gây ra.
Để kiểm tra xem đây là vấn đề đầu tiên chắc chắn SELinux được kích hoạt bằng lệnh này:
sestatus
Nếu 'current mode' là 'thực thi' sau đó SELinux được kích hoạt.
Tiếp nhận các giá trị bool hiện tại được áp dụng trực tiếp cho apache với lệnh này:
getsebool -a | grep httpd
Hãy tìm cài đặt 'httpd_can_network_connect' này xác định nếu apache được phép đưa ra yêu cầu TCP ra vào mạng. Nếu nó được bật thì tất cả các yêu cầu TCP apache sẽ được cho phép. Để bật tính năng này chạy sau khi root:
setsebool -P httpd_can_network_connect 1
Nếu bạn chỉ cần truy cập cơ sở dữ liệu (Tôi có vấn đề này trước đó là lý do tôi nghi ngờ SELinux đây) sau đó nó có lẽ sẽ tốt hơn nếu chỉ bật 'httpd_cna_network_connect' .
Mục đích của chính sách này là nếu tin tặc xâm nhập máy chủ apache của bạn, họ sẽ không thể thoát ra khỏi máy chủ với phần còn lại của mạng nội bộ của bạn.
này có lẽ sẽ đã tốt hơn như một bình luận nhưng tôi không có đủ diện ..
Nguồn: https://tag1consulting.com/blog/stop-disabling-selinux https://wiki.centos.org/TipsAndTricks/SelinuxBooleans
- 1. Làm cách nào để đảm bảo yêu cầu đến từ trang web của tôi?
- 2. Gửi yêu cầu GET theo cách thủ công đến một trang web. 302 lỗi chuyển hướng
- 3. Bảo vệ yêu cầu GET trong ứng dụng web Django
- 4. Làm cách nào để yêu cầu các trang từ trang web sử dụng OpenID?
- 5. Cách xem yêu cầu trong trang web của tôi và từ trang web của tôi iis 5
- 6. Khi tôi sử dụng các yêu cầu python để kiểm tra một trang web, nếu trang web chuyển hướng tôi đến một trang khác, tôi có biết không?
- 7. Cách gửi yêu cầu GET trong AS3?
- 8. Tôi làm cách nào để yêu cầu ứng dụng Cocoa của tôi thoát khỏi ứng dụng?
- 9. Làm thế nào để gửi yêu cầu kéo từ ngã ba của tôi đến ngã ba khác?
- 10. Làm cách nào để biết Yêu cầu đến từ Proxy?
- 11. Làm cách nào để tôi biết trang php nếu ai đó đến bằng POST hoặc GET?
- 12. Kiểm tra xem yêu cầu http đến từ ứng dụng Android của tôi
- 13. Làm cách nào để nginx trả về phản hồi tĩnh và gửi tiêu đề yêu cầu đến ứng dụng?
- 14. Làm thế nào để vô hiệu hóa các yêu cầu GET tới trang JSP?
- 15. Gửi yêu cầu ứng dụng từ phía máy chủ
- 16. Làm cách nào để triển khai Liên kết Liên kết đến ứng dụng web của tôi?
- 17. Gửi dữ liệu POST từ bộ điều khiển đến một trang web khác trong Rails
- 18. Cách gửi yêu cầu đến "j_spring_security_check" từ bộ điều khiển
- 19. Làm thế nào để hủy bỏ HttpClient GET yêu cầu web
- 20. Tại sao các yêu cầu được gửi tới/eyeblaster trên trang web của tôi?
- 21. Thu gọn các gói HTTP cho các yêu cầu GET và POST từ một ứng dụng
- 22. Làm thế nào để gửi một yêu cầu đến một API bên ngoài
- 23. Làm thế nào để gửi một HTTPS GET yêu cầu trong C#
- 24. Làm cách nào để gửi bất kỳ thứ gì bên cạnh GET và POST từ trình duyệt đến ứng dụng RESTful của bạn?
- 25. Sử dụng RestTemplate, làm thế nào để gửi yêu cầu đến một proxy đầu tiên để tôi có thể sử dụng junits của tôi với JMeter?
- 26. IIS 7 thêm SSL vào một trang web, tất cả các trang web khác đáp ứng yêu cầu https
- 27. PowerShell + WebAdministration - Làm cách nào để truy cập trang web từ ứng dụng web?
- 28. RestTemplate Yêu cầu GET với các tham số yêu cầu
- 29. Có thể một trang web độc hại đánh cắp cookie của tôi từ một trang web khác không?
- 30. Tôi làm cách nào để gửi tệp trong yêu cầu POST?
Sử dụng yêu cầu urllib2 của gây ra một lỗi trong máy chủ của tôi, tôi đoán là mà yêu cầu cài đặt sẽ làm tương tự (đã không kiểm tra traceback tuy nhiên) ... Không có một chức năng bình được xây dựng trong đó? @Jon Clements – user1639431
@ user1639431 nope - không có chức năng dựng sẵn - là Flask đang chạy dưới apache2/nginx? –
Không có ý tưởng, đó là một dịch vụ đám mây, nhưng tiền của tôi là nginx. Dù sao, tôi nhìn vào traceback, và cả hai urllib2 và yêu cầu cung cấp cho "kết nối từ chối". Tôi không có vấn đề để mở/curl url này từ cli của tôi, không thể hiểu được nguồn gốc của vấn đề này. @Jon Clements – user1639431