2010-02-07 14 views
8

एक django वेब ऐप को बाहरी यूआरएल पर AJAX कॉल करने की आवश्यकता है। विकास में मैं सीधे django से सेवा करता हूं इसलिए मेरे पास एक क्रॉस डोमेन समस्या है। AJAX कॉल के लिए प्रॉक्सी लिखने का django तरीका क्या है?django AJAX प्रॉक्सी दृश्य

उत्तर

1

क्या मैं सही हूं कि आप Django में दृश्य लिखने के बारे में पूछ रहे हैं जो आने वाले AJAX अनुरोध को स्वीकार कर सकता है, रिमोट सर्वर को अनुरोध जारी कर सकता है और फिर ब्राउज़र पर प्राप्त प्रतिक्रिया वापस कर सकता है?

यदि ऐसा है, तो यह वास्तव में Django विशिष्ट सवाल है - दूरस्थ कॉल डाल करने के लिए पायथन के urllib2 या httplib, और फिर आप बस के साथ किया जा सकता है:

return HttpResponse(received_response) 

- अपने Django प्रॉक्सी-ध्यान में रखते हुए । मुझे यहां कोई प्रतिक्रिया प्रसंस्करण नहीं लगता है, क्योंकि अगर यह सिर्फ AJAX कॉल के लिए प्रॉक्सी है तो जावास्क्रिप्ट अनप्रचारित डेटा की अपेक्षा करता है।

+2

मैंने इसका परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि यह कोड केवल प्रतिक्रिया निकाय की प्रतिलिपि करेगा, प्रतिक्रिया के HTTP शीर्षलेख नहीं, जिसमें सर्वर से बहुत उपयोगी जानकारी हो सकती है। –

+1

@ डॉन: आप पूरी तरह से सही हैं! –

2

मैं इसे अपने आप जवाब देने के लिए प्रयास करते हुए इस सवाल भर में भाग गया, और इस Django एप्लिकेशन पाया: ...

http://httpproxy.yvandermeer.net/

जो मैं क्या जरूरत के लिए एक छोटे से हैवीवेट (रिकॉर्डिंग और प्लेबैक है, आवश्यकता है एक मॉडल सामान में जोड़ने के लिए syncdb)। लेकिन आप अपने सामान्य प्रॉक्सी देखने के लिए, जो पर आधारित है में कोड का उपयोग करता है देख सकते हैं:

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

5

यहाँ 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) 

यह प्रॉक्सी PROXY_PATH + पथ से TARGET_URL + पथ से अनुरोध करती है। प्रॉक्सी सक्षम है और इस तरह एक URL पैटर्न जोड़कर कॉन्फ़िगर किया गया है urls.py रहे हैं:

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

उदाहरण के लिए:

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

http के लिए एक अनुरोध कर देगा: // स्थानीय होस्ट: 8000/छवियों/logo.png फ़ाइल को पर लाएं और वापस लौटें http://imageserver.com/logo.png

क्वेरी स्ट्रिंग्स अग्रेषित किए जाते हैं, जबकि कुकीज़ और POST डेटा जैसे HTTP शीर्षलेख नहीं हैं (यदि आपको इसकी आवश्यकता है तो इसे जोड़ने में काफी आसान है)।

नोट: यह मुख्य रूप से विकास के उपयोग के लिए है। उत्पादन में प्रॉक्सीइंग को संभालने का सही तरीका HTTP सर्वर (उदा। अपाचे या एनजिनक्स) के साथ है।

+0

संपूर्ण बिंदु कुकीज और पोस्ट डेटा पास करना है, इसलिए हमें कुकीज़ और पोस्ट डेटा जोड़ने में आसान कहने के बजाय, आप बस कोड लिख सकते थे? –

+0

हां, शायद आप कुकीज़ और पोस्ट डेटा पास करने के लिए भागों में जोड़ सकते हैं? –

संबंधित मुद्दे