基于How To Tango With Django 1.9的重新实践(14)——Bing Search
2017-03-19 20:08
441 查看
在这个阶段,我们的Rango看起来已经非常好啦 - 大部分的功能都已经实现了,在这章,我们将为我们的Rango提供Bing的搜索的功能而不是仅仅使用目录.首先让我们先设置一个Bing账户来使用它的API,然后把Bing搜索集成进Rango.
尽管Bing的API可以处理不同内容的请求,我们只需要关注本教程使用的部分 - 就是处理响应的JSON.为了使用Bing搜索的API,你需要注册一个API key.这个key可以给用户每个月5000次请求的权限,对于我们个人用户来说足够用了.
当你创建完帐号,访问 Windows Azure Marketplace Bing Search API page.在页面的顶部你需要点击Sign In按钮 - 如果你已经你已经进入到Microsoft账户(上面写着Sing Out),就不需要再登录了.
页面右边的列表是每月的事务量.在最顶部是5000/月.点击右边的注册按钮 - 你将会订阅一个免费的服务.阅读完有关条例以后,如果同意条款点击注册按钮继续.接下来将会显示成功注册的页面.
注册成功以后,点击页面顶部的数据链接.在这里你将会看到Windows Azure Marketplace的可用资源列表.在这个列表顶部应当是Bing Search API - 同时右边显示的是你已订阅该资源.点击位于右边的使用.你将会看到如下图所示的页面.
开始,在rango应用目录里添加一个新的Python模块bing_search.py.代码如下.注意查看注释的内容:
我们需要创建一个继承自base.html模板的search.html模板.这个模板将会包含一个
然后我们创建一个视图来处理search.html模板传递给我们的参数,然后调用我们上面定义的run_query()函数.
14.3.2 添加视图
添加完搜索模板后,我们可以添加视图了.在views.py模块里添加下面search()视图.
14.1 Bing搜索API
Bing搜索API提供了在你的应用中嵌入搜索结果的功能.通过简单的交互,你可以从Bing的服务器返回一个XML或者JSON.这个数据可以通过XML或者JSON解析器进行解析,最后结果传递给你的模板进行调用.尽管Bing的API可以处理不同内容的请求,我们只需要关注本教程使用的部分 - 就是处理响应的JSON.为了使用Bing搜索的API,你需要注册一个API key.这个key可以给用户每个月5000次请求的权限,对于我们个人用户来说足够用了.
14.1.1 注册一个API key
为了注册一个Bing API key,你必须首先注册一个免费的Microsoft账户.这个账户提供了许多的Microsoft服务.如果你已经有一个Hotmail账户,那么就不用再注册了.你可以在这里 https://account.windowsazure.com 注册和登录帐号.当你创建完帐号,访问 Windows Azure Marketplace Bing Search API page.在页面的顶部你需要点击Sign In按钮 - 如果你已经你已经进入到Microsoft账户(上面写着Sing Out),就不需要再登录了.
页面右边的列表是每月的事务量.在最顶部是5000/月.点击右边的注册按钮 - 你将会订阅一个免费的服务.阅读完有关条例以后,如果同意条款点击注册按钮继续.接下来将会显示成功注册的页面.
注册成功以后,点击页面顶部的数据链接.在这里你将会看到Windows Azure Marketplace的可用资源列表.在这个列表顶部应当是Bing Search API - 同时右边显示的是你已订阅该资源.点击位于右边的使用.你将会看到如下图所示的页面.
14.2 增加搜索功能
为了增加Rango的搜索功能,我们必须增加一个Bing API查询语句.这个代码将会从一个特定的用户获取请求,并返回一个列表作为结果.所有在API查询阶段的错误都能被很好的处理.拆分这个搜索函数作为添加函数可以有效的分离Django代码和搜索函数代码.开始,在rango应用目录里添加一个新的Python模块bing_search.py.代码如下.注意查看注释的内容:
import json import http.client, urllib.request, urllib.parse, urllib.error, base64 #将Microsoft账户的Key添加到一个名为bing.key的文件 def read_bing_key(): ''' 读取BING API的key从一个名为bing_key.txt的文件 返回一个string或者None(没有找到key) 记得把bing.key文件放到你的.gitignore文件中,以避免提交到公共仓库 ''' bing_api_key = None try: with open('bing_key','r') as f: bing_api_key = f.readline() except: raise IOError('bing_key.txt file not found') return bing_api_key def run_query(search_terms): ''' 给定一个包含搜索词(查询)的string, 返回Bing搜索引擎中的结果list ''' #bing_api_key = str(read_bing_key()) bing_api_key = '????' if not bing_api_key: raise KeyError('Bing Key Not Found') headers={ 'Ocp-Apim-Subscription-Key': bing_api_key, } ''' #指定基本的url和服务 root_url = 'https://api.cognitive.microsoft.com/bing/v5.0/search/' service = 'Web' #指定我们希望每页返回多少结果 #offset指定从结果list开始的位置 #With results_per_page = 10 and offset = 11,这将从第二页开始 results_per_page = 10 offset = 0 ''' #根据Bing API的要求,需要在查询字词的周围加上引号 #我们将使用query这个变量储存我们的查询 query = "'{0}'".format(search_terms) ''' #使用urllib将query转换为HTML编码字符串。 query = urllib.parse.quote(query) ''' ''' #构造请求网址的后半部分 #将相应的合适设置为JSON并设置其他属性 search_url = "{0}{1}?$format=json&$top={2}&$skip={3}&Query={4}".format( root_url, service, results_per_page, offset, query ) ''' params = urllib.parse.urlencode({ # Request parameters 'q': query, 'count': '10', 'offset': '0', 'mkt': 'en-us', 'safesearch': 'Moderate', }) ''' #使用Bing服务器设置身份验证 #用户名必须是空字符串,并放入您的API密钥 username='' #设置密码管理器以帮助验证我们的请求 password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None,search_url,username,bing_api_key) ''' #创建我们将填充的结果list results = [] try: #准备连接Bing的服务 conn = http.client.HTTPSConnection('api.cognitive.microsoft.com') # 连接到服务器并读取生成的响应 conn.request("GET", "/bing/v5.0/search?%s" % params, "{body}", headers) response = conn.getresponse().read() response = response.decode('utf-8') conn.close() #将字符串响应转换为Python字典对象 json_response = json.loads(response) #循环每个返回页面,填充结果list for result in json_response['webPages']['value']: results.append({'title': result['name'], 'link': result['url'], 'summary': result['snippet']}) except: print("Error when querying the Bing API") return results def main(): print("Enter a query:") query = input() results = run_query(query) for result in results: print(result['title']) print('-'*len(result['title'])) print(result['summary']) print(result['link']) print() if __name__ == '__main__': main()
14.3 把搜索放入Rango
为了加入外部搜索我们需要进行以下几步.我们需要创建一个继承自base.html模板的search.html模板.这个模板将会包含一个
HTML<form>来获取用户输入的请求,然后会程序返回的结果.
然后我们创建一个视图来处理search.html模板传递给我们的参数,然后调用我们上面定义的run_query()函数.
14.3.1 加入搜索模板
让我们现建立一个search.html模板.代码如下.{% extends 'rango/base.html' %} {% load staticfiles %} {% block title %} Search {% endblock %} {% comment %} 1.在所有情况下,它都会展现一个搜索框<input>和一个搜索按钮<button>,使用一个HTML<form>来供用户输入并发送查询语句. 2.当results_list传递给模板上下文时,模板将会展示它包含的所有结果. {% endcomment %} {% block body_block %} <div> <h1>Search with Rango</h1> <br> <form action="{% url 'search' %}" class="form-inline" id="user_form" method="post"> {% csrf_token %} <div class="form-group"> <input type="text" class="form-control" size="50" name="query" value="" id="query"> </div> <button class="btn btn-primary" type="submit" name="submit" value="Search">Search</button> </form> <div> {% if result_list %} <h3>Results</h3> <!-- 展示搜索的结果在一个有序的list中 --> <div class="list-group"> {% for result in result_list %} <div class="list-group-item"> <h4 class="list-group-item-heading"> <a href="{{ result.link }}">{{ result.title }}</a> </h4> <p class="list-group-item-text">{{ result.summary }}</p> </div> {% endfor %} </div> {% endif %} </div> </div> {% endblock %}
14.3.2 添加视图
添加完搜索模板后,我们可以添加视图了.在views.py模块里添加下面search()视图.
def search(request): result_list = [] if request.method == 'POST': query = request.POST['query'].strip() if query: #使用我们的Bing功能来得到结果list result_list = run_query(query) return render(request,'rango/search.html',{'result_list':result_list})
相关文章推荐
- 基于How To Tango With Django 1.9的重新实践(12)——Bootstrapping Rango
- 基于How To Tango With Django 1.9的重新实践(17)——Hints
- 基于How To Tango With Django 1.9的重新实践(13)——Template Tags
- 基于How To Tango With Django 1.9的重新实践(15)——Webhose Search
- 基于How To Tango With Django 1.9的重新实践(16)——Rango Exercises
- 基于How To Tango With Django 1.9的重新实践(18)——JQuery
- IntegrationWithDjango - modwsgi - How to use Django with mod_wsgi. - Python WSGI adapter module for Apache. - Google Project Hosting
- How To Install and Configure Django with Postgres, Nginx, and Gunicorn
- How to use Django with uWSGI
- How To Start Building Spatially Aware Apps With Google’s Project Tango
- How to POST a django form with AJAX & jQuery
- How to use Django with Apache and mod_wsgi
- How to replace a Django model field with a property
- 【day 14】python编程:从入门到实践学习笔记-基于Django框架的Web开发-用户账户(一)
- How to use Django with FastCGI, SCGI, or AJP¶
- How to use django with mod_wsgi ¶
- 基于How To Tango With Django 1.9的重新实践(19)——Ajax
- How to use Django with Apache and mod_python
- How To Create GenericPrincipal Objects with Forms Authentication
- How to solve the problem "A project with an Output Type of Class Library cannot be started directly "