Skip to content

Commit fd35779

Browse files
committed
returning random proxies
1 parent d2a4e6b commit fd35779

File tree

3 files changed

+70
-17
lines changed

3 files changed

+70
-17
lines changed

models.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@
22
import peewee
33
import peewee_async
44

5-
db = peewee_async.PooledPostgresqlDatabase(
5+
raw_db = peewee_async.PooledPostgresqlDatabase(
66
*settings.DATABASE_CONNECTION_ARGS,
77
**settings.DATABASE_CONNECTION_KWARGS,
88
)
99

10+
# TODO: make it work
11+
# raw_db.execute_sql('CREATE EXTENSION IF NOT EXISTS tsm_system_rows;')
12+
raw_db.execute_sql('''CREATE MATERIALIZED VIEW IF NOT EXISTS working_proxies
13+
AS SELECT * FROM proxies WHERE number_of_bad_checks = 0;''')
1014

1115
class Proxy(peewee.Model):
1216
class Meta:
13-
database = db
14-
db_table = 'proxies'
17+
database = raw_db
18+
raw_db_table = 'proxies'
1519
indexes = (
1620
(('raw_protocol', 'auth_data', 'domain', 'port'), True),
1721
(('auth_data', 'domain', 'port'), False), # important!
@@ -109,8 +113,8 @@ def __str__(self):
109113

110114
class ProxyCountItem(peewee.Model):
111115
class Meta:
112-
database = db
113-
db_table = 'proxy_count_items'
116+
database = raw_db
117+
raw_db_table = 'proxy_count_items'
114118

115119
timestamp = peewee.IntegerField(primary_key=True)
116120
good_proxies_count = peewee.IntegerField(null=False)
@@ -120,8 +124,8 @@ class Meta:
120124

121125
class CollectorState(peewee.Model):
122126
class Meta:
123-
database = db
124-
db_table = 'collector_states'
127+
database = raw_db
128+
raw_db_table = 'collector_states'
125129
indexes = (
126130
(('processing_period',), False),
127131
(('last_processing_time',), False),
@@ -139,14 +143,14 @@ class Meta:
139143

140144
class StatBaseModel(peewee.Model):
141145
class Meta:
142-
database = db
146+
database = raw_db
143147

144148
timestamp = peewee.BigIntegerField(primary_key=True)
145149

146150

147151
class NumberOfProxiesToProcess(StatBaseModel):
148152
class Meta:
149-
db_table = 'number_of_proxies_to_process'
153+
raw_db_table = 'number_of_proxies_to_process'
150154

151155
good_proxies = peewee.IntegerField(null=False)
152156
bad_proxies = peewee.IntegerField(null=False)
@@ -155,14 +159,14 @@ class Meta:
155159

156160
class NumberOfCollectorsToProcess(StatBaseModel):
157161
class Meta:
158-
db_table = 'number_of_collectors_to_process'
162+
raw_db_table = 'number_of_collectors_to_process'
159163

160164
value = peewee.IntegerField(null=False)
161165

162166

163167
class ProcessorProxiesQueueSize(StatBaseModel):
164168
class Meta:
165-
db_table = 'processor_proxies_queue_size'
169+
raw_db_table = 'processor_proxies_queue_size'
166170

167171
value = peewee.IntegerField(null=False)
168172

@@ -175,4 +179,4 @@ class Meta:
175179
NumberOfCollectorsToProcess.create_table(_silent)
176180
ProcessorProxiesQueueSize.create_table(_silent)
177181

178-
db = peewee_async.Manager(db)
182+
db = peewee_async.Manager(raw_db)

proxy_py/_settings.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
PROXY_PROVIDER_SERVER_MAXIMUM_REQUEST_LENGTH = 1024
8282
PROXY_PROVIDER_SERVER_MAXIMUM_STRING_FIELD_SIZE = 128
8383

84-
_PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG = {
84+
PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG = {
8585
'fields': [
8686
'address', 'protocol', 'auth_data', 'domain', 'port', 'last_check_time', 'number_of_bad_checks',
8787
'bad_proxy', 'uptime', 'response_time', 'white_ipv4', 'white_ipv6', 'city', 'country_code', 'region'
@@ -97,8 +97,8 @@
9797
'proxy': {
9898
'model_class': ['models', 'Proxy'],
9999
'methods': {
100-
'get': _PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG,
101-
'count': _PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG,
100+
'get': PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG,
101+
'count': PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG,
102102
}
103103
}
104104
}

server/api_v2/api_request_handler.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import re
22

3+
from peewee import RawQuery
4+
5+
from models import Proxy, db
36
from proxy_py import settings
47
from server.api_v1.requests_to_models.request_parser import ParseError
58
from server.base_app import BaseApp
@@ -12,6 +15,8 @@ def __init__(self, app: BaseApp):
1215
self.app = app
1316
self.methods = {
1417
'get_model': self.get_model,
18+
'get_proxies_for_id': self.get_proxies_for_id,
19+
'get_proxy_for_id': self.get_proxy_for_id,
1520
}
1621

1722
async def handle(self, request: aiohttp.ClientRequest, method_name: str, post_data: dict):
@@ -79,8 +84,8 @@ async def handle(self, request: aiohttp.ClientRequest, method_name: str, post_da
7984
return response
8085

8186
async def get_model(self, data: dict) -> dict:
82-
if 'name' not in data:
83-
raise ParseError('please, specify the "name" key')
87+
# TODO: implement
88+
validate_dict_must_have_key(data, 'name')
8489

8590
model_name = data['name']
8691
validate_letters_digits_undescores(model_name)
@@ -92,6 +97,43 @@ async def get_model(self, data: dict) -> dict:
9297
"result": "model " + model_name,
9398
}
9499

100+
async def get_proxy_for_id(self, data: dict) -> dict:
101+
data['number'] = 1
102+
res = await self.get_proxies_for_id(data)
103+
res["result"] = res["results"][0]
104+
del res["results"]
105+
del res["number_of_results"]
106+
return res
107+
108+
async def get_proxies_for_id(self, data: dict) -> dict:
109+
validate_dict_must_have_key(data, 'id')
110+
validate_dict_must_have_key(data, 'number')
111+
number = int(data['number'])
112+
validate_uint(number)
113+
114+
# TODO: validate id
115+
results = []
116+
117+
for item in await db.execute(Proxy.raw(
118+
f'SELECT * FROM working_proxies TABLESAMPLE SYSTEM_ROWS({number});'
119+
)):
120+
obj = {}
121+
122+
for field_name in settings.PROXY_PROVIDER_SERVER_API_CONFIG_FETCH_CONFIG['fields']:
123+
obj[field_name] = getattr(item, field_name)
124+
125+
results.append(obj)
126+
127+
return {
128+
"number_of_results": len(results),
129+
"results": results,
130+
}
131+
132+
133+
def validate_dict_must_have_key(data: dict, key: str):
134+
if key not in data:
135+
raise ParseError(f'please, specify the "{key}" key')
136+
95137

96138
def validate_letters_digits_undescores(value):
97139
if len(value) > settings.PROXY_PROVIDER_SERVER_MAXIMUM_STRING_FIELD_SIZE:
@@ -106,3 +148,10 @@ def validate_regex(value: str, regex: str):
106148

107149
if not re.match(regex, value):
108150
raise ParseError(f"value \"{value}\" doesn't match to regex \"{regex}\"")
151+
152+
153+
def validate_uint(value):
154+
if type(value) is not int:
155+
raise ParseError("value should be integer")
156+
if value < 0:
157+
raise ParseError("value should be positive")

0 commit comments

Comments
 (0)