webapp.py 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/env python
  2. if __name__ == "__main__":
  3. from sys import path
  4. from os.path import realpath, dirname
  5. path.append(realpath(dirname(realpath(__file__))+'/../'))
  6. from flask import Flask, request, flash, render_template
  7. import ConfigParser
  8. from os import getenv
  9. from searx.engines import engines
  10. import grequests
  11. cfg = ConfigParser.SafeConfigParser()
  12. cfg.read('/etc/searx.conf')
  13. cfg.read(getenv('HOME')+'/.searxrc')
  14. cfg.read(getenv('HOME')+'/.config/searx/searx.conf')
  15. cfg.read('searx.conf')
  16. app = Flask(__name__)
  17. app.secret_key = cfg.get('app', 'secret_key')
  18. def default_request_params():
  19. return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
  20. def make_callback(results, callback):
  21. def process_callback(response, **kwargs):
  22. results.extend(callback(response))
  23. return process_callback
  24. @app.route('/', methods=['GET', 'POST'])
  25. def index():
  26. if request.method=='POST':
  27. if not request.form.get('q'):
  28. flash('Wrong post data')
  29. return render_template('index.html')
  30. query = request.form['q']
  31. requests = []
  32. results = []
  33. user_agent = request.headers.get('User-Agent', '')
  34. for engine in engines:
  35. headers = default_request_params()
  36. headers['User-Agent'] = user_agent
  37. request_params = engine.request(query, headers)
  38. callback = make_callback(results, engine.response)
  39. if request_params['method'] == 'GET':
  40. req = grequests.get(request_params['url']
  41. ,headers=headers
  42. ,hooks=dict(response=callback)
  43. )
  44. else:
  45. req = grequests.post(request_params['url']
  46. ,data=request_params['data']
  47. ,headers=headers
  48. ,hooks=dict(response=callback)
  49. )
  50. requests.append(req)
  51. grequests.map(requests)
  52. return render_template('results.html', results=results)
  53. return render_template('index.html')
  54. if __name__ == "__main__":
  55. from gevent import monkey
  56. monkey.patch_all()
  57. app.run(debug = cfg.get('server', 'debug')
  58. ,use_debugger = cfg.get('server', 'debug')
  59. ,port = int(cfg.get('server', 'port'))
  60. )