所以,这里有一种奇怪的情况。我有一个Django项目,使用TastyPie为其API和一些视图/模板提供动力,这些视图/模板将用于为各种站点提供插件。我没有将这个插件构建为标准的Django模板,而是被要求使用我们的API处理对插件的请求,这意味着我从另一个视图调用我的服务器上的视图,并且由于某些原因无法正常工作我的任何观点。供参考:
#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()
有关如何解决此问题的任何想法?我找不到关于这个主题的任何着作。
编辑:更具体地说,正在发生的事情是,当我加载任何这些视图时,他们都会尝试阅读api页面。此外,我的服务器没有显示任何处理请求的迹象。 (虽然我可以直接加载api页面。)
答案 0 :(得分:6)
现在你的评论澄清了情况,我可以猜测问题是什么。您使用的是内置开发服务器,它是单线程的。因此,当它处理原始请求时,它无法处理另一个URL的内部请求 - 因此它会无限期挂起。
正如毛泽东所指出的那样,解决方案是想出一个更好的架构。如果你不能这样做,你可能会运用gunicorn而不是内置服务器。
答案 1 :(得分:2)
特别是对于Tastypie,您可以在视图中使用您的资源,如果需要,可以直接访问对象并调用get方法并构建bundle。
您可以了解如何:http://django-tastypie.readthedocs.org/en/latest/cookbook.html
转到标题为“在常规视图中使用资源”的部分
答案 2 :(得分:2)
同意,您的开发服务器可能只有一个实例。在另一个端口上启动另一个。 IE / SITE_NAME =“http:// localhost:8001 /”
答案 3 :(得分:0)
好的,所以我已经说过让对其他视图发出HTTPRequest的观点有点傻了,但我确实看到了你目前的问题。您正在调用json.loads(urllib.urlopen(SITE_NAME + uri))
,但urllib.urlopen
会返回类似文件的对象,而不是字符串,因此实际应该是json.load(urllib.urlopen(SITE_NAME + uri))
。