0

我刚刚开始学习 python/django。我知道 PHP,但我想了解这个框架。我正在尝试使用 yelp 的 API。我试图弄清楚当有人将新文件引入项目时该怎么做。

他们business.py有这个:

import json
import oauth2
import optparse
import urllib
import urllib2

parser = optparse.OptionParser()
parser.add_option('-c', '--consumer_key', dest='consumer_key', help='OAuth consumer key (REQUIRED)')
parser.add_option('-s', '--consumer_secret', dest='consumer_secret', help='OAuth consumer secret (REQUIRED)')
parser.add_option('-t', '--token', dest='token', help='OAuth token (REQUIRED)')
parser.add_option('-e', '--token_secret', dest='token_secret', help='OAuth token secret (REQUIRED)')
parser.add_option('-a', '--host', dest='host', help='Host', default='api.yelp.com')
parser.add_option('-i', '--id', dest='id', help='Business')
parser.add_option('-u', '--cc', dest='cc', help='Country code')
parser.add_option('-n', '--lang', dest='lang', help='Language code')


options, args = parser.parse_args()

# Required options
if not options.consumer_key:
  parser.error('--consumer_key required')
if not options.consumer_secret:
  parser.error('--consumer_secret required')
if not options.token:
  parser.error('--token required')
if not options.token_secret:
  parser.error('--token_secret required')

if not options.id:
  parser.error('--id required')

url_params = {}
if options.cc:
  url_params['cc'] = options.cc
if options.lang:
  url_params['lang'] = options.lang


path = '/v2/business/%s' % (options.id,)


def request(host, path, url_params, consumer_key, consumer_secret, token, token_secret):
  """Returns response for API request."""
  # Unsigned URL
  encoded_params = ''
  if url_params:
    encoded_params = urllib.urlencode(url_params)
  url = 'http://%s%s?%s' % (host, path, encoded_params)
  print 'URL: %s' % (url,)

  # Sign the URL
  consumer = oauth2.Consumer(consumer_key, consumer_secret)
  oauth_request = oauth2.Request('GET', url, {})
  oauth_request.update({'oauth_nonce': oauth2.generate_nonce(),
                        'oauth_timestamp': oauth2.generate_timestamp(),
                        'oauth_token': token,
                        'oauth_consumer_key': consumer_key})

  token = oauth2.Token(token, token_secret)
  oauth_request.sign_request(oauth2.SignatureMethod_HMAC_SHA1(), consumer, token)
  signed_url = oauth_request.to_url()
  print 'Signed URL: %s\n' % (signed_url,)

  # Connect
  try:
    conn = urllib2.urlopen(signed_url, None)
    try:
      response = json.loads(conn.read())
    finally:
      conn.close()
  except urllib2.HTTPError, error:
    response = json.loads(error.read())

  return response

response = request(options.host, path, url_params, options.consumer_key, options.consumer_secret, options.token, options.token_secret)
print json.dumps(response, sort_keys=True, indent=2)

它非常冗长,我为此道歉。但我担心的是我该怎么办?他们在这里设置了一个def request(),我假设我必须将它导入到我的视图中?

我一直在关注创建新应用程序的 django 文档。在文档中,他们在文件中设置了def一堆views.py。我只是对我应该如何在我的项目中进行这项工作感到困惑?如果我想在 URL 中搜索业务,它将如何发送数据?

谢谢你的帮助。

4

1 回答 1

1

这是一个向 yelp api 发出 http 请求的命令行脚本。您可能不想在主请求处理程序的上下文中发出这样的外部请求。好吧,你可以调用一个请求处理程序来调用 yelp。让我们来看看 ...

您可以导入请求函数,而不是使用命令行选项调用它,而是自己调用它。

from yelp.business import request as yelp_req

def my_request_handler(request):
    json_from_yelp = yelp_req(...
    # do stuff and return a response

不过,在请求处理程序中进行这种外部调用是相当不错的(也就是说,在请求处理程序中向外部服务发出 http 请求)。如果调用是 ajax,则 ux 可能没问题。

这个 business.py 只是一个示例,向您展示如何使用 oauth2 创建签名请求。您也许可以只导入请求功能并使用它。OTOH,您可能更喜欢自己编写(也许使用requests库)。您可能希望使用 celery 或其他一些异步方式在请求处理程序之外进行调用和/或缓存响应以避免每次请求都使用昂贵的外部 http io。

于 2012-09-20T05:28:23.977 回答