| 
									
										
										
										
											2013-10-14 23:09:13 +02:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     from sys import path | 
					
						
							|  |  |  |     from os.path import realpath, dirname | 
					
						
							|  |  |  |     path.append(realpath(dirname(realpath(__file__))+'/../')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from flask import Flask, request, flash, render_template | 
					
						
							|  |  |  | import ConfigParser | 
					
						
							|  |  |  | from os import getenv | 
					
						
							|  |  |  | from searx.engines import engines | 
					
						
							|  |  |  | import grequests | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | cfg = ConfigParser.SafeConfigParser() | 
					
						
							|  |  |  | cfg.read('/etc/searx.conf') | 
					
						
							|  |  |  | cfg.read(getenv('HOME')+'/.searxrc') | 
					
						
							|  |  |  | cfg.read(getenv('HOME')+'/.config/searx/searx.conf') | 
					
						
							|  |  |  | cfg.read('searx.conf') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | app = Flask(__name__) | 
					
						
							|  |  |  | app.secret_key = cfg.get('app', 'secret_key') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def default_request_params(): | 
					
						
							|  |  |  |     return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def make_callback(results, callback): | 
					
						
							|  |  |  |     def process_callback(response, **kwargs): | 
					
						
							|  |  |  |         results.extend(callback(response)) | 
					
						
							|  |  |  |     return process_callback | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @app.route('/', methods=['GET', 'POST']) | 
					
						
							|  |  |  | def index(): | 
					
						
							|  |  |  |     if request.method=='POST': | 
					
						
							|  |  |  |         if not request.form.get('q'): | 
					
						
							|  |  |  |             flash('Wrong post data') | 
					
						
							|  |  |  |             return render_template('index.html') | 
					
						
							|  |  |  |         query = request.form['q'] | 
					
						
							|  |  |  |         requests = [] | 
					
						
							|  |  |  |         results = [] | 
					
						
							| 
									
										
										
										
											2013-10-14 23:52:58 +02:00
										 |  |  |         user_agent = request.headers.get('User-Agent', '') | 
					
						
							| 
									
										
										
										
											2013-10-14 23:09:13 +02:00
										 |  |  |         for engine in engines: | 
					
						
							| 
									
										
										
										
											2013-10-14 23:52:58 +02:00
										 |  |  |             headers = default_request_params() | 
					
						
							|  |  |  |             headers['User-Agent'] = user_agent | 
					
						
							|  |  |  |             request_params = engine.request(query, headers) | 
					
						
							| 
									
										
										
										
											2013-10-14 23:09:13 +02:00
										 |  |  |             callback = make_callback(results, engine.response) | 
					
						
							|  |  |  |             if request_params['method'] == 'GET': | 
					
						
							|  |  |  |                 req = grequests.get(request_params['url'] | 
					
						
							| 
									
										
										
										
											2013-10-14 23:52:58 +02:00
										 |  |  |                                    ,headers=headers | 
					
						
							| 
									
										
										
										
											2013-10-14 23:09:13 +02:00
										 |  |  |                                    ,hooks=dict(response=callback) | 
					
						
							|  |  |  |                                    ) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 req = grequests.post(request_params['url'] | 
					
						
							|  |  |  |                                     ,data=request_params['data'] | 
					
						
							| 
									
										
										
										
											2013-10-14 23:52:58 +02:00
										 |  |  |                                     ,headers=headers | 
					
						
							| 
									
										
										
										
											2013-10-14 23:09:13 +02:00
										 |  |  |                                     ,hooks=dict(response=callback) | 
					
						
							|  |  |  |                                     ) | 
					
						
							|  |  |  |             requests.append(req) | 
					
						
							|  |  |  |         grequests.map(requests) | 
					
						
							| 
									
										
										
										
											2013-10-15 00:02:55 +02:00
										 |  |  |         return render_template('results.html', results=results, q=query) | 
					
						
							| 
									
										
										
										
											2013-10-14 23:09:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return render_template('index.html') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     from gevent import monkey | 
					
						
							|  |  |  |     monkey.patch_all() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     app.run(debug        = cfg.get('server', 'debug') | 
					
						
							|  |  |  |            ,use_debugger = cfg.get('server', 'debug') | 
					
						
							|  |  |  |            ,port         = int(cfg.get('server', 'port')) | 
					
						
							|  |  |  |            ) |