2010-02-07 35 views
8

Ứng dụng web django cần thực hiện cuộc gọi ajax đến một url bên ngoài. Trong phát triển tôi phục vụ trực tiếp từ django vì vậy tôi có một vấn đề miền chéo. Cách django để viết một proxy cho cuộc gọi ajax là gì?chế độ xem proxy django ajax

Trả lời

1

Tôi có đúng là bạn đang hỏi về cách viết chế độ xem ở Django có thể chấp nhận yêu cầu AJAX đến, đưa ra yêu cầu tới máy chủ từ xa và sau đó trả lại phản hồi nhận được cho trình duyệt không?

Nếu vậy, thì nó không phải là thực sự Django cụ thể câu hỏi - cuộc gọi từ xa có thể được thực hiện với Python của urllib2 hoặc httplib, và sau đó bạn chỉ cần đặt:

return HttpResponse(received_response) 

- trong Django proxy-view của bạn . Tôi giả sử không có xử lý phản hồi ở đây, bởi vì nếu nó chỉ là một proxy cho cuộc gọi AJAX thì JavaScript mong đợi dữ liệu chưa được xử lý.

+2

Tôi chưa thử nghiệm điều này, nhưng tôi tin rằng mã này sẽ chỉ sao chép nội dung phản hồi chứ không phải tiêu đề HTTP của phản hồi, có thể chứa rất nhiều thông tin hữu ích từ máy chủ. –

+1

@Don: Bạn hoàn toàn đúng! –

2

Tôi chạy qua câu hỏi này trong khi cố gắng để trả lời nó bản thân mình, và tìm thấy ứng dụng này Django:

http://httpproxy.yvandermeer.net/

... đó là một chút nặng cho những gì tôi cần thiết (ghi âm và phát lại, đòi hỏi một syncdb để thêm vào công cụ mô hình). Nhưng bạn có thể xem mã nó sử dụng theo quan điểm proxy chung của nó, mà là dựa trên :

http://bitbucket.org/yvandermeer/django-http-proxy/src/1776d5732113/httpproxy/views.py

5

Dưới đây là một đơn giản chết thực hiện proxy cho Django.

from django.http import HttpResponse 
import mimetypes 
import urllib2 

def proxy_to(request, path, target_url): 
    url = '%s%s' % (target_url, path) 
    if request.META.has_key('QUERY_STRING'): 
     url += '?' + request.META['QUERY_STRING'] 
    try: 
     proxied_request = urllib2.urlopen(url) 
     status_code = proxied_request.code 
     mimetype = proxied_request.headers.typeheader or mimetypes.guess_type(url) 
     content = proxied_request.read() 
    except urllib2.HTTPError as e: 
     return HttpResponse(e.msg, status=e.code, mimetype='text/plain') 
    else: 
     return HttpResponse(content, status=status_code, mimetype=mimetype) 

Yêu cầu proxy này từ đường dẫn PROXY_PATH + tới TARGET_URL +. proxy được kích hoạt và cấu hình bằng cách thêm một mẫu URL như thế này để urls.py:

url(r'^PROXY_PATH/(?P<path>.*)$', proxy_to, {'target_url': 'TARGET_URL'}), 

Ví dụ:

url(r'^images/(?P<path>.*)$', proxy_to, {'target_url': 'http://imageserver.com/'}), 

sẽ thực hiện một yêu cầu đến http: // localhost: 8000/images/logo.png tìm nạp và trả lại tệp tại http://imageserver.com/logo.png.

Chuỗi truy vấn được chuyển tiếp, trong khi các tiêu đề HTTP như cookie và dữ liệu POST không phải là (thật dễ dàng để thêm nếu bạn cần).

Lưu ý: Mục đích này chủ yếu dành cho mục đích phát triển. Cách thích hợp để xử lý proxy trong sản xuất là với máy chủ HTTP (ví dụ: Apache hoặc Nginx).

+0

Toàn bộ vấn đề là để chuyển cookie và dữ liệu POST, vì vậy thay vì nói cho chúng tôi dễ dàng thêm cookie và dữ liệu POST, bạn có thể chỉ cần viết mã? –

+0

Có, có lẽ bạn có thể thêm vào các phần để chuyển cookie và dữ liệu POST? –

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