From bcb48d1e168f2f191b3a38ea3917389b5f8772ae Mon Sep 17 00:00:00 2001 From: Guy Lepage Date: Fri, 24 Feb 2017 16:34:53 -0500 Subject: [PATCH] added index.html and set routes --- api/search/search/server.py | 265 ++++++++++++------------- api/search/search/templates/index.html | 1 + 2 files changed, 133 insertions(+), 133 deletions(-) diff --git a/api/search/search/server.py b/api/search/search/server.py index 03c8338b3..ff89b09a2 100644 --- a/api/search/search/server.py +++ b/api/search/search/server.py @@ -1,26 +1,26 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- """ - Search - ~~~~~ + Search + ~~~~~ - copyright: (c) 2014-2016 by Halfmoon Labs, Inc. - copyright: (c) 2016 by Blockstack.org + copyright: (c) 2014-2016 by Halfmoon Labs, Inc. + copyright: (c) 2016 by Blockstack.org This file is part of Search. - Search is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + Search is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - Search is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Search is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with Search. If not, see . + You should have received a copy of the GNU General Public License + along with Search. If not, see . """ import sys @@ -29,7 +29,7 @@ import threading import pylibmc from time import time -from flask import request, jsonify, Flask, make_response +from flask import request, jsonify, Flask, make_response, render_template from .config import DEFAULT_HOST, DEFAULT_PORT, DEBUG, MEMCACHED_TIMEOUT from .config import DEFAULT_LIMIT @@ -45,208 +45,207 @@ from .attributes_index import search_proofs, validProofQuery app = Flask(__name__) mc = pylibmc.Client(["127.0.0.1:11211"], binary=True, - behaviors={'tcp_nodelay': True, - 'connect_timeout': 100, - 'no_block': True}) + behaviors={'tcp_nodelay': True, + 'connect_timeout': 100, + 'no_block': True}) class QueryThread(threading.Thread): - """ for performing multi-threaded search on three search sub-systems - """ - def __init__(self, query, query_type, limit_results): - threading.Thread.__init__(self) - self.query = query - self.query_type = query_type - self.results = [] - self.limit_results = limit_results - self.found_exact_match = False + """ for performing multi-threaded search on three search sub-systems + """ + def __init__(self, query, query_type, limit_results): + threading.Thread.__init__(self) + self.query = query + self.query_type = query_type + self.results = [] + self.limit_results = limit_results + self.found_exact_match = False - def run(self): - if(self.query_type == 'people_search'): - self.results = query_people_database(self.query, self.limit_results) - elif(self.query_type == 'twitter_search'): - self.results = query_twitter_database(self.query, self.limit_results) - elif(self.query_type == 'username_search'): - self.results = query_username_database(self.query, self.limit_results) - #self.found_exact_match, self.results = query_company_database(self.query) - if(self.query_type == 'lucene_search'): - self.results = query_lucene_index(self.query, self.limit_results) + def run(self): + if(self.query_type == 'people_search'): + self.results = query_people_database(self.query, self.limit_results) + elif(self.query_type == 'twitter_search'): + self.results = query_twitter_database(self.query, self.limit_results) + elif(self.query_type == 'username_search'): + self.results = query_username_database(self.query, self.limit_results) + #self.found_exact_match, self.results = query_company_database(self.query) + if(self.query_type == 'lucene_search'): + self.results = query_lucene_index(self.query, self.limit_results) def error_reply(msg, code=-1): - reply = {} - reply['status'] = code - reply['message'] = "ERROR: " + msg - return jsonify(reply) + reply = {} + reply['status'] = code + reply['message'] = "ERROR: " + msg + return jsonify(reply) def query_people_database(query, limit_results=DEFAULT_LIMIT): - name_search_results = search_people_by_name(query, limit_results) - return fetch_profiles(name_search_results, search_type="name") + name_search_results = search_people_by_name(query, limit_results) + return fetch_profiles(name_search_results, search_type="name") def query_twitter_database(query, limit_results=DEFAULT_LIMIT): - twitter_search_results = search_people_by_twitter(query, limit_results) - return fetch_profiles(twitter_search_results, search_type="twitter") + twitter_search_results = search_people_by_twitter(query, limit_results) + return fetch_profiles(twitter_search_results, search_type="twitter") def query_username_database(query, limit_results=DEFAULT_LIMIT): - username_search_results = search_people_by_username(query, limit_results) - return fetch_profiles(username_search_results, search_type="username") + username_search_results = search_people_by_username(query, limit_results) + return fetch_profiles(username_search_results, search_type="username") def query_lucene_index(query, index, limit_results=DEFAULT_LIMIT): - username_search_results = search_people_by_bio(query, limit_results) - return fetch_profiles(username_search_results, search_type="username") + username_search_results = search_people_by_bio(query, limit_results) + return fetch_profiles(username_search_results, search_type="username") def test_alphanumeric(query): - """ check if query has only alphanumeric characters or not - """ + """ check if query has only alphanumeric characters or not + """ - import re - valid = re.match('^(\w+(\s)*\w*)+$', query) is not None + import re + valid = re.match('^(\w+(\s)*\w*)+$', query) is not None - return True + return True @app.route('/search') def search_by_name(): - query = request.args.get('query') + query = request.args.get('query') - results_people = [] + results_people = [] - if query is None: - return error_reply("No query given") - elif query == '' or query == ' ': - return json.dumps({}) + if query is None: + return error_reply("No query given") + elif query == '' or query == ' ': + return json.dumps({}) - if MEMCACHED_ENABLED: + if MEMCACHED_ENABLED: - cache_key = str('search_cache_' + query.lower()) - cache_reply = mc.get(cache_key) + cache_key = str('search_cache_' + query.lower()) + cache_reply = mc.get(cache_key) - # if a cache hit, respond straight away - if(cache_reply is not None): - return jsonify(cache_reply) + # if a cache hit, respond straight away + if(cache_reply is not None): + return jsonify(cache_reply) - new_limit = DEFAULT_LIMIT + new_limit = DEFAULT_LIMIT - try: - new_limit = int(request.values['limit_results']) - except: - pass + try: + new_limit = int(request.values['limit_results']) + except: + pass - if validProofQuery(query): - return search_proofs_index(query) + if validProofQuery(query): + return search_proofs_index(query) - elif test_alphanumeric(query) is False: - pass + elif test_alphanumeric(query) is False: + pass - else: + else: - threads = [] + threads = [] - t1 = QueryThread(query, 'username_search', new_limit) - t2 = QueryThread(query, 'twitter_search', new_limit) - t3 = QueryThread(query, 'people_search', new_limit) + t1 = QueryThread(query, 'username_search', new_limit) + t2 = QueryThread(query, 'twitter_search', new_limit) + t3 = QueryThread(query, 'people_search', new_limit) - if LUCENE_ENABLED: - t4 = QueryThread(query, 'lucene_search', new_limit) + if LUCENE_ENABLED: + t4 = QueryThread(query, 'lucene_search', new_limit) - threads.append(t1) - threads.append(t2) - threads.append(t3) + threads.append(t1) + threads.append(t2) + threads.append(t3) - if LUCENE_ENABLED: - threads.append(t4) + if LUCENE_ENABLED: + threads.append(t4) - # start all threads - [x.start() for x in threads] + # start all threads + [x.start() for x in threads] - # wait for all of them to finish - [x.join() for x in threads] + # wait for all of them to finish + [x.join() for x in threads] - # at this point all threads have finished and all queries have been performed + # at this point all threads have finished and all queries have been performed - results_username = t1.results - results_twitter = t2.results - results_people = t3.results + results_username = t1.results + results_twitter = t2.results + results_people = t3.results - if LUCENE_ENABLED: - results_bio = t4.results + if LUCENE_ENABLED: + results_bio = t4.results - results_people += results_username + results_twitter - if LUCENE_ENABLED: - results_people += results_bio + results_people += results_username + results_twitter + if LUCENE_ENABLED: + results_people += results_bio - # dedup all results before sending out - from substring_search import dedup_search_results - results_people = dedup_search_results(results_people) + # dedup all results before sending out + from substring_search import dedup_search_results + results_people = dedup_search_results(results_people) - results = {} - results['results'] = results_people[:new_limit] + results = {} + results['results'] = results_people[:new_limit] - if MEMCACHED_ENABLED: - mc.set(cache_key, results, int(time() + MEMCACHED_TIMEOUT)) + if MEMCACHED_ENABLED: + mc.set(cache_key, results, int(time() + MEMCACHED_TIMEOUT)) - return jsonify(results) + return jsonify(results) def search_proofs_index(query): - results = {} + results = {} - query = request.args.get('query') + query = request.args.get('query') - if query is None: - return error_reply("No query given") - elif query == '' or query == ' ': - return json.dumps({}) + if query is None: + return error_reply("No query given") + elif query == '' or query == ' ': + return json.dumps({}) - if MEMCACHED_ENABLED: + if MEMCACHED_ENABLED: - cache_key = str('search_cache_' + query.lower()) - cache_reply = mc.get(cache_key) + cache_key = str('search_cache_' + query.lower()) + cache_reply = mc.get(cache_key) - # if a cache hit, respond straight away - if(cache_reply is not None): - return jsonify(cache_reply) + # if a cache hit, respond straight away + if(cache_reply is not None): + return jsonify(cache_reply) - results['results'] = search_proofs(query) + results['results'] = search_proofs(query) - if MEMCACHED_ENABLED: - mc.set(cache_key, results, int(time() + MEMCACHED_TIMEOUT)) + if MEMCACHED_ENABLED: + mc.set(cache_key, results, int(time() + MEMCACHED_TIMEOUT)) - return jsonify(results) + return jsonify(results) @app.route('/') def index(): - return 'Welcome to this blockstack-search node. \ - See this repo for details.' - + return render_template('index.html') + @app.errorhandler(500) def internal_error(error): - reply = [] - return json.dumps(reply) + reply = [] + return json.dumps(reply) @app.errorhandler(404) def not_found(error): - resp = {} - resp['error'] = "Not found" + resp = {} + resp['error'] = "Not found" - return make_response(jsonify(resp), 404) + return make_response(jsonify(resp), 404) if __name__ == '__main__': - app.run(host=DEFAULT_HOST, port=DEFAULT_PORT, debug=DEBUG) + app.run(host=DEFAULT_HOST, port=DEFAULT_PORT, debug=DEBUG) diff --git a/api/search/search/templates/index.html b/api/search/search/templates/index.html index e69de29bb..30d74d258 100644 --- a/api/search/search/templates/index.html +++ b/api/search/search/templates/index.html @@ -0,0 +1 @@ +test \ No newline at end of file