我对Django中的类和函数感到很困惑,所以我不确定,如果我尝试这样做的话。
1)我有一个函数,我在那里进行API查询。我想从2)获得API令牌(见下文)。
def API_search(request):
query = request.GET.get('query')
final_url = urllib2.Request('http://api.website.com', None, headers={'Content-Type':'application/json'})
base64string = base64.encodestring('%s:%s' % ('myusername', 'mypassword')).replace('\n', '')
final_url.add_header("Authorization", "Basic %s" % base64string)
json_obj = urllib2.urlopen(final_url)
readable_json = json.load(json_obj)
resultsOpen = []
for i in readable_json:
resultsOpen.append({
'subject': i['subject'],
})
return render(request, 'index/apiTest.html', {'objects_open': resultsOpen)
2)我有一个基于类的函数,我在其中查询数据库并返回当前用户的API标记。这仅显示现场的API令牌。我希望它在API查询中。
class UserDetail(DetailView):
model = User
def get_context_data(self, **kwargs):
context = super(UserDetail, self).get_context_data(**kwargs)
context['token_list'] = UserTokens.objects.values_list('apiToken', flat=True).get(pk=1)
return context
这些都适用于不同的模板,但我不想要它。我想在API查询中使用API令牌变量 context 。我怎么能这样做?
编辑:添加了urls.py
from django.conf.urls import url
from index.views import UserDetail
from index import views
urlpatterns = [
url(r'^dbquery/$', UserDetail.as_view()),
url(r'^apitest/$', views.API_search),
]
答案 0 :(得分:1)
在urls.py
中创建一个调用API_search
函数的网址定义。在UserDetailView
商店中,这个生成的网址在href
内,当用户点击它时,请调用您的API搜索功能。
OR
如果您想在UserDetailView
之后直接调用API_Search,请在生成正确的网址后调用HttpRedirectResponse到该网址。
编辑: 根据提供的额外信息,您可以使用:
def API_search(request):
user = request.user
token = UserTokens.objects.values_list('apiToken', flat=True).get(pk=user.id)
query = request.GET.get('query')
final_url = urllib2.Request('http://api.website.com', None, headers={'Content-Type':'application/json'})
#use the token as you like
base64string = base64.encodestring('%s:%s' % ('myusername', 'mypassword')).replace('\n', '')
final_url.add_header("Authorization", "Basic %s" % base64string)
json_obj = urllib2.urlopen(final_url)
readable_json = json.load(json_obj)
resultsOpen = []
for i in readable_json:
resultsOpen.append({
'subject': i['subject'],
})
return render(request, 'index/apiTest.html', {'objects_open': resultsOpen)