浏览代码

[mod] search refactor

asciimoo 11 年前
父节点
当前提交
d5ec0f43e4
共有 2 个文件被更改,包括 40 次插入34 次删除
  1. 38
    1
      searx/engines/__init__.py
  2. 2
    33
      searx/webapp.py

+ 38
- 1
searx/engines/__init__.py 查看文件

2
 from os.path import realpath, dirname, splitext, join
2
 from os.path import realpath, dirname, splitext, join
3
 from os import listdir
3
 from os import listdir
4
 from imp import load_source
4
 from imp import load_source
5
+import grequests
5
 
6
 
6
 engine_dir = dirname(realpath(__file__))
7
 engine_dir = dirname(realpath(__file__))
7
 
8
 
12
     if filename.startswith('_') or not filename.endswith('.py'):
13
     if filename.startswith('_') or not filename.endswith('.py'):
13
         continue
14
         continue
14
     filepath = join(engine_dir, filename)
15
     filepath = join(engine_dir, filename)
15
-    engines.append(load_source(modname, filepath))
16
+    engine = load_source(modname, filepath)
17
+    if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
18
+        continue
19
+    engines.append(engine)
20
+
21
+def default_request_params():
22
+    return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
23
+
24
+def make_callback(results, callback):
25
+    def process_callback(response, **kwargs):
26
+        results.extend(callback(response))
27
+    return process_callback
28
+
29
+def search(query, request):
30
+    global engines
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 results

+ 2
- 33
searx/webapp.py 查看文件

25
 from flask import Flask, request, flash, render_template
25
 from flask import Flask, request, flash, render_template
26
 import ConfigParser
26
 import ConfigParser
27
 from os import getenv
27
 from os import getenv
28
-from searx.engines import engines
29
-import grequests
28
+from searx.engines import search
30
 
29
 
31
 cfg = ConfigParser.SafeConfigParser()
30
 cfg = ConfigParser.SafeConfigParser()
32
 cfg.read('/etc/searx.conf')
31
 cfg.read('/etc/searx.conf')
38
 app = Flask(__name__)
37
 app = Flask(__name__)
39
 app.secret_key = cfg.get('app', 'secret_key')
38
 app.secret_key = cfg.get('app', 'secret_key')
40
 
39
 
41
-def default_request_params():
42
-    return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
43
-
44
-def make_callback(results, callback):
45
-    def process_callback(response, **kwargs):
46
-        results.extend(callback(response))
47
-    return process_callback
48
-
49
 @app.route('/', methods=['GET', 'POST'])
40
 @app.route('/', methods=['GET', 'POST'])
50
 def index():
41
 def index():
51
     if request.method=='POST':
42
     if request.method=='POST':
53
             flash('Wrong post data')
44
             flash('Wrong post data')
54
             return render_template('index.html')
45
             return render_template('index.html')
55
         query = request.form['q']
46
         query = request.form['q']
56
-        requests = []
57
-        results = []
58
-        user_agent = request.headers.get('User-Agent', '')
59
-        for engine in engines:
60
-            headers = default_request_params()
61
-            headers['User-Agent'] = user_agent
62
-            request_params = engine.request(query, headers)
63
-            callback = make_callback(results, engine.response)
64
-            if request_params['method'] == 'GET':
65
-                req = grequests.get(request_params['url']
66
-                                   ,headers=headers
67
-                                   ,hooks=dict(response=callback)
68
-                                   )
69
-            else:
70
-                req = grequests.post(request_params['url']
71
-                                    ,data=request_params['data']
72
-                                    ,headers=headers
73
-                                    ,hooks=dict(response=callback)
74
-                                    )
75
-            requests.append(req)
76
-        grequests.map(requests)
47
+        results = search(query, request)
77
         return render_template('results.html', results=results, q=query)
48
         return render_template('results.html', results=results, q=query)
78
-
79
-
80
     return render_template('index.html')
49
     return render_template('index.html')
81
 
50
 
82
 if __name__ == "__main__":
51
 if __name__ == "__main__":