amitt001 / pygmy Goto Github PK
View Code? Open in Web Editor NEWAn open-source, feature rich & extensible url-shortener + analytics written in Python :cookie:
Home Page: https://demo.pygy.co/pygmy
License: MIT License
An open-source, feature rich & extensible url-shortener + analytics written in Python :cookie:
Home Page: https://demo.pygy.co/pygmy
License: MIT License
Here is the simple test result, about function next_short_code
mysql> select id, long_url, short_code, created_at from link where id between 15581 and 15585 order by id desc;
+-------+----------------------------+------------+---------------------+
| id | long_url | short_code | created_at |
+-------+----------------------------+------------+---------------------+
| 15585 | http://test.com/a/b/c/5582 | l95 | 2018-05-16 02:11:59 |
| 15584 | http://test.com/a/b/c/5581 | l94 | 2018-05-16 02:11:59 |
| 15583 | http://test.com/a/b/c/5580 | l93 | 2018-05-16 02:11:59 |
| 15582 | http://test.com/a/b/c/5579 | l92 | 2018-05-16 02:11:58 |
| 15581 | http://test.com/a/b/c/5578 | l91 | 2018-05-16 02:11:58 |
+-------+----------------------------+------------+---------------------+
mysql> select id, long_url, short_code, created_at from link where id between 15581 and 15585 order by created_at desc;
+-------+----------------------------+------------+---------------------+
| id | long_url | short_code | created_at |
+-------+----------------------------+------------+---------------------+
| 15583 | http://test.com/a/b/c/5580 | l93 | 2018-05-16 02:11:59 |
| 15584 | http://test.com/a/b/c/5581 | l94 | 2018-05-16 02:11:59 |
| 15585 | http://test.com/a/b/c/5582 | l95 | 2018-05-16 02:11:59 |
| 15581 | http://test.com/a/b/c/5578 | l91 | 2018-05-16 02:11:58 |
| 15582 | http://test.com/a/b/c/5579 | l92 | 2018-05-16 02:11:58 |
+-------+----------------------------+------------+---------------------+
As you can see, order by link.created_at desc
is not always corect.
And If using link.created_at desc
will get the incorrect answer of base_str
, which will trapped into the while cycle.
here is the log of simple call next_short_code
, which iter from h2k
to h2x
.
2018-05-16 02:05:12,407 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.is_custom IS false AND link.short_code IS NOT NULL AND link.short_code != %(short_code_1)s ORDER BY link.created_at DESC
LIMIT %(param_1)s
2018-05-16 02:05:12,407 INFO sqlalchemy.engine.base.Engine {'short_code_1': '', 'param_1': 1}
2018-05-16 02:05:12,417 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,418 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2k'}
2018-05-16 02:05:12,419 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,419 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2k'}
2018-05-16 02:05:12,423 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,423 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2l'}
2018-05-16 02:05:12,424 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,424 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2l'}
2018-05-16 02:05:12,429 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,429 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2m'}
2018-05-16 02:05:12,430 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,430 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2m'}
2018-05-16 02:05:12,434 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,434 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2n'}
2018-05-16 02:05:12,435 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,435 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2n'}
2018-05-16 02:05:12,439 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,439 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2o'}
2018-05-16 02:05:12,440 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,440 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2o'}
2018-05-16 02:05:12,444 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,445 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2p'}
2018-05-16 02:05:12,446 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,446 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2p'}
2018-05-16 02:05:12,450 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,450 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2q'}
2018-05-16 02:05:12,451 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,451 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2q'}
2018-05-16 02:05:12,455 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,455 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2r'}
2018-05-16 02:05:12,457 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,457 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2r'}
2018-05-16 02:05:12,461 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,461 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2s'}
2018-05-16 02:05:12,462 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,462 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2s'}
2018-05-16 02:05:12,466 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,466 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2t'}
2018-05-16 02:05:12,467 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,467 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2t'}
2018-05-16 02:05:12,471 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,471 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2u'}
2018-05-16 02:05:12,473 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,473 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2u'}
2018-05-16 02:05:12,477 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,477 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2v'}
2018-05-16 02:05:12,478 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,478 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2v'}
2018-05-16 02:05:12,482 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,482 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2w'}
2018-05-16 02:05:12,483 INFO sqlalchemy.engine.base.Engine SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s
2018-05-16 02:05:12,483 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2w'}
2018-05-16 02:05:12,488 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1
FROM (SELECT link.id AS link_id, link.long_url AS link_long_url, link.protocol AS link_protocol, link.domain AS link_domain, link.long_url_hash AS link_long_url_hash, link.short_code AS link_short_code, link.description AS link_description, link.owner AS link_owner, link.secret_key AS link_secret_key, link.expire_after AS link_expire_after, link.is_default AS link_is_default, link.is_protected AS link_is_protected, link.is_disabled AS link_is_disabled, link.is_custom AS link_is_custom, link.created_at AS link_created_at, link.updated_at AS link_updated_at
FROM link
WHERE link.short_code = %(short_code_1)s) AS anon_1
2018-05-16 02:05:12,488 INFO sqlalchemy.engine.base.Engine {'short_code_1': 'h2x'}
h2x
If you want to re-appear this situation, write two script
import requests
import json
def short(i):
r = requests.post(
"http://localhost:9119/api/shorten",
headers={'Content-Type': 'Application/json'},
data=json.dumps(
{"long_url": "https://test.com/a/b/c/{i}".format(i=i)}
)
)
for i in range(10000):
short(i)
next_short_code
#!/usr/bin/env python3
"""Script when you just want to run Pygmy API."""
from pygmy.core.initialize import initialize
initialize()
from pygmy.helpers.link_helper import next_short_code
import time
while True:
print(next_short_code())
I'm writing this because that we use this and it cause the server near down(can't login using ssh). Is this related?
I've used this for quite some time, fully understanding it could go away at any moment, and now that it has I miss it dearly; any chance this is going to get back up and running?
Error message on site:
400
URL shortening temporarily disabled due to malicious attacks. Contact in case of any questions/issues
Will be fixed by masking original/long url from the link stats page
Hi there
I'm testing pygmy in a homemade Helm chart. A bit in trouble with Django behing unhappy with CSRF. Would you mind providing/documenting config files examples, both pygmy's and pygmyui's ?
Best regards,
Currently, the stats page just shows country code like IN, US, ZA etc. It's not always intuitive to know the country from its code. Example: https://pygy.co/pygmy+
The stats page should show Country (code). Example: India(IN)
One way to do it would be to keep country iso code and country name mapping in the code somewhere.
See https://noun.ly/ as an example.
is it support changing shorturl direction link ?
Hi, thanks for providing this!
I made one link and it worked. Then I tried making a second link and it didn't. It sent back a 500.
Here's my link: https://deckbox.org/sets/1977804
I tried with the name deckbox
and mtgdeck
, no dice.
I setup from source, when running python3 run.py, infinite loop occurred, stop Terminal with output:
from django.core.wsgi import get_wsgi_application\nModuleNotFoundError: No module named 'django'\n[2022-07-17 18:32:48 +0700] [20252] [INFO] Worker exiting (pid: 20252)\n[2022-07-17 18:32:48 +0700] [20251] [INFO] Shutting down: Master\n[2022-07-17 18:32:48 +0700] [20251] [INFO] Reason: Worker failed to boot.\n')
Traceback (most recent call last):
File "run.py", line 46, in
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
ProcessLookupError: [Errno 3] No such process
Hope you could fix that.
Currently, 500 error is raised if a custom link already exists
This is very impressive!
This is the exact tool I've been looking for with the two features I wanted most: link click stats & link expiration.
Is there anyway someone would be willing to convert this repo into a simplified flask-implementation? My entire setup for a project I'm working on is built on the flask framework and I was looking to have a custom link shortener with
Hi,
It seems that pygmy doesn't migrate db automatically. Please tell me how to migrate DB.
The pygmy application offers an option to create links that expire after some specific time. This works by attaching an expiry time(in minutes), which is a positive integer, to the link record in DB.
The expiry time of an URL is calculated by url creation time + expiry time
and if it is less than the current time, the short link is considered expired and can't be used anymore. If a user is logged in, the dashboard will show this URL as either expired = True or False, depending on weather url was opened after it's expiry time or not. This is where the bug lies.
The reason why the dashboard doesn't have real-time knowledge about the state of URL is, the expiry value in DB is set if a call comes for URL after it has expired. There is no background job for marking the URL as expired.
How this issue can be fixed?
This can be fixed by checking the expiry of URL on the application level when building the response data for the dashboard. URL's can be marked as expired at this point and any subsequent call to dashboard doesn't need to make any more updates.
This is a feature request.
Any chance of creating a Firefox (for myself that would be best) or Chrome (I am sure other people use it) extension/add-on to use this?
Thank you.
Hi,
I don't want people from outside of my network using the url shortener to create own short urls.
Is it possible to secure the mainpage AND make the urls for everyone available?
I have a question. Can I disable vanity in Pygmy (I want a random hash = www.expamle.com/**abc123**). If it is possible, how can I disable it?
Currently, this is very basic logging for raw server and no logging for docker server
Hi there,
Love your project, just one feature request if possible - can you optionally make config line where we will be able to configure random id with the conversion it to base62 (so basically random and not starting from id=1, but already from id=100,000,000)
The main reason is to make same-looking final url with 4-5 symbols and random order as:
/yuwUi
/ijjeJ
/JhjdI
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.