2011-06-29 17 views
9

तो, यहां एक अजीब स्थिति में तरह। मुझे अपनी एपीआई को शक्ति देने के लिए TastyPie का उपयोग करके एक Django प्रोजेक्ट मिला है और कुछ दृश्य/टेम्पलेट्स जिनका उपयोग विभिन्न साइटों के लिए प्लगइन पावर करने के लिए किया जाएगा। मानक Django टेम्पलेट्स के रूप में इस प्लगइन को बनाने के बजाय, मुझे प्लगइन के अनुरोधों को संसाधित करने के लिए हमारे एपीआई का उपयोग करने के लिए कहा गया है, जिसका अर्थ है कि मैं अपने सर्वर पर किसी अन्य दृश्य से एक दृश्य बुला रहा हूं, और किसी कारण से जो काम नहीं कर रहा है मेरे किसी भी विचार के साथ।किसी अन्य दृश्य से मेरे सर्वर पर एक एपीआई कॉल करें

#views.py 
from django.http import HttpResponse 
from django.shortcuts import render_to_response 
from django.template.context import Context, RequestContext 
import json, urllib, urllib2 

SITE_NAME = "http://localhost:8000/" 
API_PATH = "api/v1/" 

def aggregate(request): 
    template = 'lemonwise/plugins/aggregate.html' 
    sku = request.GET.get('sku') 
    url = ''.join([SITE_NAME, API_PATH, 'product/?sku=', sku]) 
    product = json.loads(urllib.urlopen(url).read())['objects'][0] 
    return render_to_response(template, product) 

def reviews(request): 
    template = 'lemonwise/plugins/reviews.html' 
    sku = request.GET.get('sku') 
    url = ''.join([SITE_NAME, API_PATH, 'product/?format=json&sku=', sku]) 
    #Comment the next line out and the url is passed correctly 
    response = urllib2.build_opener().open(url).read() 
    return HttpResponse(url) 
    #page = opener.open(url).read() 
    #return HttpResponse(url) 
    #product = json.loads(urllib2.build_opener().open(url).read())['objects'][0] 
    #return HttpResponse(url) 
    #reviews = [json.loads(urllib.urlopen(SITE_NAME + uri)) for uri in product['reviews']] 
    #return render_to_response(template, {'reviews': reviews}) 

def survey(request): 
    template = 'lemonwise/plugins/survey.html' 
    sku = request.GET.get('sku') 
    url = ''.join([SITE_NAME, API_PATH, 'product/?sku=', sku]) 
    product = json.loads(urllib2.build_opener().open(url).read())['objects'][0] 
    return render_to_response(template, product) 

def mosthelpfulpositive(request): 
    template = 'lemonwise/plugins/mosthelpfulpositive.html' 
    sku = request.GET.get('sku') 
    url = ''.join([SITE_NAME, API_PATH, 'product/?sku=', sku]) 
    product = json.loads(urllib2.build_opener().open(url).read())['objects'][0] 
    uri = product['most_helpful_positive'] 
    most_helpful_positive = json.loads(urllib.urlopen(SITE_NAME + uri)) 
    return render_to_response(template, most_helpful_positive) 

def mosthelpfulnegative(request): 
    template = 'lemonwise/plugins/mosthelpfulnegative.html' 
    sku = request.GET.get('sku') 
    url = ''.join([SITE_NAME, API_PATH, 'product/?sku=', sku]) 
    product = json.loads(urllib2.build_opener().open(url).read())['objects'][0] 
    uri = product['most_helpful_negative'] 
    most_helpful_negative = json.loads(urllib.urlopen(SITE_NAME + uri)) 
    return render_to_response(template, most_helpful_negative) 

और इसी urls.py (किसी भिन्न ऐप में): संदर्भ के लिए

#urls.py  
from django.conf import settings 
from django.conf.urls.defaults import patterns, include, url 
from django.contrib import admin 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 

from tastypie.api import Api 
from lemonwise.reviews.api import * 

admin.autodiscover() 

v1_api = Api(api_name='v1') 
v1_api.register(UserResource()) 
v1_api.register(MerchantResource()) 
v1_api.register(ProductFamilyResource()) 
v1_api.register(ProductResource()) 
v1_api.register(BooleanAttributeResource()) 
v1_api.register(SlideAttributeResource()) 
v1_api.register(ProductAttributeResource()) 
v1_api.register(SubmissionResource()) 
v1_api.register(ReviewResource()) 
v1_api.register(ReviewProductAttributeResource()) 
v1_api.register(CommentResource()) 
v1_api.register(BestUseResource()) 
v1_api.register(HelpfulVoteResource()) 

#Acess the api via http://127.0.0.1:8000/api/v1/user/?format=json 

urlpatterns = patterns('', 
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
    url(r'^admin/', include(admin.site.urls)), 

    # Lemonwise apps 
    url(r'^reviews/', include('lemonwise.reviews.urls')), 

     #API 
     url(r'^api/', include(v1_api.urls)), 
) 

if settings.DEBUG: 
    urlpatterns += staticfiles_urlpatterns() 

पर कोई विचार कैसे इसे ठीक करने के लिए? मुझे इस विषय पर कोई लेख नहीं मिल रहा है।

संपादित करें: अधिक विशेष रूप से, क्या हो रहा है कि जब मैं इनमें से कोई भी विचार लोड करता हूं तो वे एपीआई पृष्ठ को पढ़ने की कोशिश कर रहे हैं। इसके अलावा, मेरा सर्वर संसाधित किए जा रहे किसी भी अनुरोध का कोई संकेत नहीं दिखाता है। (हालांकि मैं सीधे एपीआई पेज लोड कर सकता हूं।)

+0

जब तक आप AJAX का उपयोग नहीं कर रहे हैं, मुझे इस तरह से वेबसाइट बनाने में कोई लाभ नहीं दिखता है। मुझे लगता है कि आपकी वास्तविक समस्या आपके मालिक से बात कर रही है और उसे बता रही है कि उसकी योजना ज्यादा समझ में नहीं आती है (पाठ्यक्रम के उन सटीक शब्दों में नहीं)। –

+0

ईमानदारी से, मैं उस समाधान की तरफ झुका रहा हूं, हालांकि मुझे लगता है कि यह किसी भी तरह से संभव होना चाहिए। –

+0

हालांकि क्या काम नहीं कर रहा है? –

उत्तर

6

अब आपकी टिप्पणी ने स्थिति को स्पष्ट किया है, मैं अनुमान लगा सकता हूं कि समस्या क्या है। यह है कि आप अंतर्निहित विकास सर्वर का उपयोग कर रहे हैं, जो सिंगल-थ्रेडेड है। इसलिए जब यह मूल अनुरोध संसाधित कर रहा है, यह किसी अन्य यूआरएल के आंतरिक अनुरोध को संसाधित करने में सक्षम नहीं है - इसलिए यह अनिश्चित काल तक लटका है।

समाधान, जैसा कि माओ बताता है, एक बेहतर वास्तुकला के बारे में सोचना है। यदि आप ऐसा नहीं कर सकते हैं, तो अंतर्निहित सर्वर के बजाय gunicorn जैसे कुछ का उपयोग करने के साथ आपको कुछ भाग्य हो सकता है।

0

ठीक है, इसलिए मैंने पहले ही कहा है कि अन्य विचारों के खिलाफ HTTPRequests बनाने के विचारों को मूर्खतापूर्ण है, लेकिन मुझे लगता है कि वर्तमान में आपकी समस्या क्या है। आप json.loads(urllib.urlopen(SITE_NAME + uri)) पर कॉल कर रहे हैं, लेकिन urllib.urlopen एक फ़ाइल जैसी वस्तु देता है, स्ट्रिंग नहीं, इसलिए यह वास्तव में json.load(urllib.urlopen(SITE_NAME + uri)) होना चाहिए।

+0

स्पष्ट रूप से नहीं, हालांकि बाद में यह समस्या हो सकती है- मैंने इसे "urllib.urlopen (url)" में अलग करने में कामयाब रहा है। साथ ही, मैं अपने टर्मिनल में देख रहा हूं कि किसी कारण से सर्वर पर कोई अनुरोध नहीं ढूंढ रहा है (जो अन्य पृष्ठों के मामले में नहीं है)। –

+0

क्या कोई कारण है कि आप 'urllib2.build_opener() का उपयोग कर रहे हैं। कुछ जगहों पर केवल' urllib.urlopen (url) 'के बजाय खुला (url) '? –

+0

बस कुछ काम करने की कोशिश कर रहा है। कोई वास्तविक कारण नहीं है। –

2

टैस्टपी के लिए विशेष रूप से आप अपने संसाधनों का उपयोग विचारों में कर सकते हैं, अगर आपको सीधे वस्तुओं तक पहुंचने और प्राप्त करने के तरीकों को कॉल करने और बंडल का निर्माण करने की आवश्यकता है।

आप पता लगा सकते हैं कि कैसे: http://django-tastypie.readthedocs.org/en/latest/cookbook.html

जाओ शीर्षक वाले भाग पर - अपने संसाधन का उपयोग करते हुए नियमित रूप से विचार

2

सहमत में, अपने विकास सर्वर की संभावना केवल एक उदाहरण है। एक अलग बंदरगाह पर एक और लॉन्च करें। यानी/ SITE_NAME = "http: // localhost: 8001 /"

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