diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e4846830c23a475e18366aa7c93c67566ed768dd --- /dev/null +++ b/.gitignore @@ -0,0 +1,105 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# Custom +.idea/ +/logs \ No newline at end of file diff --git a/README.en.md b/README.en.md deleted file mode 100644 index daac003debb16b0631eae02e3fabab874b3f818f..0000000000000000000000000000000000000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# face-recognition-server - -#### Description -Face recognition server end - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/config.py b/config.py new file mode 100644 index 0000000000000000000000000000000000000000..d65bbfad1fa441ff94ccb8c777e13e27ec159fa0 --- /dev/null +++ b/config.py @@ -0,0 +1,10 @@ +import os + +basedir = os.path.abspath(os.path.dirname(__file__)) + + +class Config(object): + SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@godeeper.f3322.net:3306/face' + SQLALCHEMY_TRACK_MODIFICATIONS = False + LOG_TO_STDOUT = os.environ.get('LOG_TO_STDOUT') + POSTS_PER_PAGE = 25 diff --git a/entry.py b/entry.py new file mode 100644 index 0000000000000000000000000000000000000000..7b90e9146ee6ef0136967493ad8707f10f2aa846 --- /dev/null +++ b/entry.py @@ -0,0 +1,6 @@ +from project import create_app + +app = create_app() + +if __name__ == '__main__': + app.run() diff --git a/logs/face-recognition.log b/logs/face-recognition.log new file mode 100644 index 0000000000000000000000000000000000000000..74428ef6900e876f52072163220eb1569302a15d --- /dev/null +++ b/logs/face-recognition.log @@ -0,0 +1,114 @@ +2020-01-13 11:00:59,655 ERROR: Exception on /api/users [GET] [in D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py:1891] +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context + cursor, statement, parameters, context + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute + cursor.execute(statement, parameters) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 170, in execute + result = self._query(query) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 328, in _query + conn.query(q) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 517, in query + self._affected_rows = self._read_query_result(unbuffered=unbuffered) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result + result.read() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 1075, in read + first_packet = self.connection._read_packet() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 684, in _read_packet + packet.check_error() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\protocol.py", line 220, in check_error + err.raise_mysql_exception(self._data) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception + raise errorclass(errno, errval) +pymysql.err.InternalError: (1054, "Unknown column 't_user.username' in 'field list'") + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 2446, in wsgi_app + response = self.full_dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request + rv = self.handle_user_exception(e) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1820, in handle_user_exception + reraise(exc_type, exc_value, tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\_compat.py", line 39, in reraise + raise value + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request + rv = self.dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1935, in dispatch_request + return self.view_functions[rule.endpoint](**req.view_args) + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\api\users.py", line 12, in get_users + data = User.to_collection_dict(User.query, page, per_page, 'api.get_users') + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\models.py", line 8, in to_collection_dict + resources = query.paginate(page, per_page, False) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask_sqlalchemy\__init__.py", line 496, in paginate + items = self.limit(per_page).offset((page - 1) * per_page).all() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3211, in all + return list(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3367, in __iter__ + return self._execute_and_instances(context) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3392, in _execute_and_instances + result = conn.execute(querycontext.statement, self._params) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 982, in execute + return meth(self, multiparams, params) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\sql\elements.py", line 287, in _execute_on_connection + return connection._execute_clauseelement(self, multiparams, params) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1101, in _execute_clauseelement + distilled_params, + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1250, in _execute_context + e, statement, parameters, cursor, context + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1476, in _handle_dbapi_exception + util.raise_from_cause(sqlalchemy_exception, exc_info) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause + reraise(type(exception), exception, tb=exc_tb, cause=cause) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise + raise value.with_traceback(tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context + cursor, statement, parameters, context + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute + cursor.execute(statement, parameters) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 170, in execute + result = self._query(query) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 328, in _query + conn.query(q) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 517, in query + self._affected_rows = self._read_query_result(unbuffered=unbuffered) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result + result.read() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 1075, in read + first_packet = self.connection._read_packet() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 684, in _read_packet + packet.check_error() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\protocol.py", line 220, in check_error + err.raise_mysql_exception(self._data) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception + raise errorclass(errno, errval) +sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1054, "Unknown column 't_user.username' in 'field list'") +[SQL: SELECT t_user.id AS t_user_id, t_user.username AS t_user_username, t_user.cell_phone_number AS t_user_cell_phone_number +FROM t_user + LIMIT %(param_1)s, %(param_2)s] +[parameters: {'param_1': 0, 'param_2': 10}] +(Background on this error at: http://sqlalche.me/e/2j85) +2020-01-13 11:01:56,133 INFO: Face Recognition App startup [in D:\workspace-pycharm\face-recognition\face-recognition-server\project\__init__.py:43] +2020-01-13 11:01:59,856 ERROR: Exception on /api/users [GET] [in D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py:1891] +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 2446, in wsgi_app + response = self.full_dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request + rv = self.handle_user_exception(e) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1820, in handle_user_exception + reraise(exc_type, exc_value, tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\_compat.py", line 39, in reraise + raise value + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request + rv = self.dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1935, in dispatch_request + return self.view_functions[rule.endpoint](**req.view_args) + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\api\users.py", line 12, in get_users + data = User.to_collection_dict(User.query, page, per_page, 'api.get_users') + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\models.py", line 10, in to_collection_dict + 'items': [item.to_dict() for item in resources.items], + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\models.py", line 10, in + 'items': [item.to_dict() for item in resources.items], +AttributeError: 'User' object has no attribute 'to_dict' +2020-01-13 11:05:56,949 INFO: Face Recognition App startup [in D:\workspace-pycharm\face-recognition\face-recognition-server\project\__init__.py:43] diff --git a/logs/face-recognition.log.1 b/logs/face-recognition.log.1 new file mode 100644 index 0000000000000000000000000000000000000000..61bb9f1d8bdf0f7e0ce2d6f337e54434a6ab6db2 --- /dev/null +++ b/logs/face-recognition.log.1 @@ -0,0 +1,92 @@ +2020-01-13 10:59:31,577 ERROR: Exception on /api/users [GET] [in D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py:1891] +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context + cursor, statement, parameters, context + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute + cursor.execute(statement, parameters) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 170, in execute + result = self._query(query) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 328, in _query + conn.query(q) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 517, in query + self._affected_rows = self._read_query_result(unbuffered=unbuffered) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result + result.read() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 1075, in read + first_packet = self.connection._read_packet() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 684, in _read_packet + packet.check_error() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\protocol.py", line 220, in check_error + err.raise_mysql_exception(self._data) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception + raise errorclass(errno, errval) +pymysql.err.ProgrammingError: (1146, "Table 'face.user' doesn't exist") + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 2446, in wsgi_app + response = self.full_dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request + rv = self.handle_user_exception(e) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1820, in handle_user_exception + reraise(exc_type, exc_value, tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\_compat.py", line 39, in reraise + raise value + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request + rv = self.dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1935, in dispatch_request + return self.view_functions[rule.endpoint](**req.view_args) + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\api\users.py", line 12, in get_users + data = User.to_collection_dict(User.query, page, per_page, 'api.get_users') + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\models.py", line 8, in to_collection_dict + resources = query.paginate(page, per_page, False) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask_sqlalchemy\__init__.py", line 496, in paginate + items = self.limit(per_page).offset((page - 1) * per_page).all() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3211, in all + return list(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3367, in __iter__ + return self._execute_and_instances(context) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3392, in _execute_and_instances + result = conn.execute(querycontext.statement, self._params) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 982, in execute + return meth(self, multiparams, params) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\sql\elements.py", line 287, in _execute_on_connection + return connection._execute_clauseelement(self, multiparams, params) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1101, in _execute_clauseelement + distilled_params, + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1250, in _execute_context + e, statement, parameters, cursor, context + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1476, in _handle_dbapi_exception + util.raise_from_cause(sqlalchemy_exception, exc_info) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause + reraise(type(exception), exception, tb=exc_tb, cause=cause) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise + raise value.with_traceback(tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context + cursor, statement, parameters, context + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute + cursor.execute(statement, parameters) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 170, in execute + result = self._query(query) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\cursors.py", line 328, in _query + conn.query(q) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 517, in query + self._affected_rows = self._read_query_result(unbuffered=unbuffered) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result + result.read() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 1075, in read + first_packet = self.connection._read_packet() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 684, in _read_packet + packet.check_error() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\protocol.py", line 220, in check_error + err.raise_mysql_exception(self._data) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception + raise errorclass(errno, errval) +sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'face.user' doesn't exist") +[SQL: SELECT user.id AS user_id, user.username AS user_username, user.cell_phone_number AS user_cell_phone_number +FROM user + LIMIT %(param_1)s, %(param_2)s] +[parameters: {'param_1': 0, 'param_2': 10}] +(Background on this error at: http://sqlalche.me/e/f405) +2020-01-13 11:00:55,973 INFO: Face Recognition App startup [in D:\workspace-pycharm\face-recognition\face-recognition-server\project\__init__.py:43] diff --git a/logs/face-recognition.log.2 b/logs/face-recognition.log.2 new file mode 100644 index 0000000000000000000000000000000000000000..e3a9f3574cdfd2266b8cad1209b6730cbf130c51 --- /dev/null +++ b/logs/face-recognition.log.2 @@ -0,0 +1,129 @@ +2020-01-13 10:54:25,421 INFO: Face Recognition App startup [in D:\workspace-pycharm\face-recognition\face-recognition-server\project\__init__.py:43] +2020-01-13 10:55:09,655 ERROR: Exception on /api/users [GET] [in D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py:1891] +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 583, in connect + **kwargs) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\socket.py", line 728, in create_connection + raise err + File "D:\Programs\Anaconda3\envs\face_recognition\lib\socket.py", line 716, in create_connection + sock.connect(sa) +socket.timeout: timed out + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 2276, in _wrap_pool_connect + return fn() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 363, in connect + return _ConnectionFairy._checkout(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 760, in _checkout + fairy = _ConnectionRecord.checkout(pool) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 492, in checkout + rec = pool._do_get() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\impl.py", line 139, in _do_get + self._dec_overflow() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__ + compat.reraise(exc_type, exc_value, exc_tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 153, in reraise + raise value + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\impl.py", line 136, in _do_get + return self._create_connection() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 308, in _create_connection + return _ConnectionRecord(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 437, in __init__ + self.__connect(first_connect_check=True) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 639, in __connect + connection = pool._invoke_creator(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\strategies.py", line 114, in connect + return dialect.connect(*cargs, **cparams) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\default.py", line 482, in connect + return self.dbapi.connect(*cargs, **cparams) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\__init__.py", line 94, in Connect + return Connection(*args, **kwargs) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 325, in __init__ + self.connect() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 630, in connect + raise exc +pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'godeeper.f3322.net' (timed out)") + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 2446, in wsgi_app + response = self.full_dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request + rv = self.handle_user_exception(e) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1820, in handle_user_exception + reraise(exc_type, exc_value, tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\_compat.py", line 39, in reraise + raise value + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request + rv = self.dispatch_request() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask\app.py", line 1935, in dispatch_request + return self.view_functions[rule.endpoint](**req.view_args) + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\api\users.py", line 12, in get_users + data = User.to_collection_dict(User.query, page, per_page, 'api.get_users') + File "D:\workspace-pycharm\face-recognition\face-recognition-server\project\models.py", line 8, in to_collection_dict + resources = query.paginate(page, per_page, False) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\flask_sqlalchemy\__init__.py", line 496, in paginate + items = self.limit(per_page).offset((page - 1) * per_page).all() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3211, in all + return list(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3367, in __iter__ + return self._execute_and_instances(context) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3389, in _execute_and_instances + querycontext, self._connection_from_session, close_with_result=True + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3404, in _get_bind_args + mapper=self._bind_mapper(), clause=querycontext.statement, **kw + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\query.py", line 3382, in _connection_from_session + conn = self.session.connection(**kw) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\session.py", line 1133, in connection + execution_options=execution_options, + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\session.py", line 1139, in _connection_for_bind + engine, execution_options + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\orm\session.py", line 432, in _connection_for_bind + conn = bind._contextual_connect() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 2242, in _contextual_connect + self._wrap_pool_connect(self.pool.connect, None), + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 2280, in _wrap_pool_connect + e, dialect, self + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 1547, in _handle_dbapi_exception_noconnection + util.raise_from_cause(sqlalchemy_exception, exc_info) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause + reraise(type(exception), exception, tb=exc_tb, cause=cause) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise + raise value.with_traceback(tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\base.py", line 2276, in _wrap_pool_connect + return fn() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 363, in connect + return _ConnectionFairy._checkout(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 760, in _checkout + fairy = _ConnectionRecord.checkout(pool) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 492, in checkout + rec = pool._do_get() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\impl.py", line 139, in _do_get + self._dec_overflow() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__ + compat.reraise(exc_type, exc_value, exc_tb) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\util\compat.py", line 153, in reraise + raise value + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\impl.py", line 136, in _do_get + return self._create_connection() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 308, in _create_connection + return _ConnectionRecord(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 437, in __init__ + self.__connect(first_connect_check=True) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\pool\base.py", line 639, in __connect + connection = pool._invoke_creator(self) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\strategies.py", line 114, in connect + return dialect.connect(*cargs, **cparams) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\sqlalchemy\engine\default.py", line 482, in connect + return self.dbapi.connect(*cargs, **cparams) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\__init__.py", line 94, in Connect + return Connection(*args, **kwargs) + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 325, in __init__ + self.connect() + File "D:\Programs\Anaconda3\envs\face_recognition\lib\site-packages\pymysql\connections.py", line 630, in connect + raise exc +sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'godeeper.f3322.net' (timed out)") +(Background on this error at: http://sqlalche.me/e/e3q8) diff --git a/project/__init__.py b/project/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e3c46c0463756f7075e856bce023e72c45795e7c --- /dev/null +++ b/project/__init__.py @@ -0,0 +1,48 @@ +import logging +import os +from logging.handlers import RotatingFileHandler + +from config import Config +from flask import Flask +from flask_moment import Moment +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() +moment = Moment() + + +def create_app(config_class=Config): + app = Flask(__name__) + app.config.from_object(config_class) + + db.init_app(app) + moment.init_app(app) + + from project.errors import bp as errors_bp + app.register_blueprint(errors_bp) + + from project.api import bp as api_bp + app.register_blueprint(api_bp, url_prefix='/api') + + if not app.debug and not app.testing: + if app.config['LOG_TO_STDOUT']: + stream_handler = logging.StreamHandler() + stream_handler.setLevel(logging.INFO) + app.logger.addHandler(stream_handler) + else: + if not os.path.exists('logs'): + os.mkdir('logs') + file_handler = RotatingFileHandler('logs/face-recognition.log', + maxBytes=10240, backupCount=10) + file_handler.setFormatter(logging.Formatter( + '%(asctime)s %(levelname)s: %(message)s ' + '[in %(pathname)s:%(lineno)d]')) + file_handler.setLevel(logging.INFO) + app.logger.addHandler(file_handler) + app.logger.setLevel(logging.INFO) + app.logger.info('Face Recognition App startup') + + return app + + +from project import models diff --git a/project/api/__init__.py b/project/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e902f7c0d50ba74744b9c428c7d7041f1d2f2098 --- /dev/null +++ b/project/api/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('api', __name__) + +from project.api import users, errors diff --git a/project/api/errors.py b/project/api/errors.py new file mode 100644 index 0000000000000000000000000000000000000000..4167eb4ab492758e2c2aff5e663cd8faead592ad --- /dev/null +++ b/project/api/errors.py @@ -0,0 +1,15 @@ +from flask import jsonify +from werkzeug.http import HTTP_STATUS_CODES + + +def error_response(status_code, message=None): + payload = {'error': HTTP_STATUS_CODES.get(status_code, 'Unknown error')} + if message: + payload['message'] = message + response = jsonify(payload) + response.status_code = status_code + return response + + +def bad_request(message): + return error_response(400, message) diff --git a/project/api/users.py b/project/api/users.py new file mode 100644 index 0000000000000000000000000000000000000000..ea4b94bd1e434c8d8f6b425865e3173c568e6d8c --- /dev/null +++ b/project/api/users.py @@ -0,0 +1,32 @@ +from flask import jsonify, request, url_for, g, abort +from project import db +from project.models import User +from project.api import bp +from project.api.errors import bad_request + + +@bp.route('/users', methods=['GET']) +def get_users(): + page = request.args.get('page', 1, type=int) + per_page = min(request.args.get('per_page', 10, type=int), 100) + data = User.to_collection_dict(User.query, page, per_page, 'api.get_users') + return jsonify(data) + + +@bp.route('/user', methods=['POST']) +def create_user(): + data = request.get_json() or {} + if 'username' not in data or 'email' not in data or 'password' not in data: + return bad_request('must include username, email and password fields') + if User.query.filter_by(username=data['username']).first(): + return bad_request('please use a different username') + if User.query.filter_by(email=data['email']).first(): + return bad_request('please use a different email address') + user = User() + user.from_dict(data, new_user=True) + db.session.add(user) + db.session.commit() + response = jsonify(user.to_dict()) + response.status_code = 201 + response.headers['Location'] = url_for('api.get_user', id=user.id) + return response diff --git a/project/errors/__init__.py b/project/errors/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c6b22b64371d2ddbea5dca7488d88b2b0a4e19dd --- /dev/null +++ b/project/errors/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + +bp = Blueprint('errors', __name__) + +from project.errors import handlers diff --git a/project/errors/handlers.py b/project/errors/handlers.py new file mode 100644 index 0000000000000000000000000000000000000000..cf024070acc1e7c368d4d6ee456bfd0c0193f654 --- /dev/null +++ b/project/errors/handlers.py @@ -0,0 +1,20 @@ +from flask import request + +from project import db +from project.api.errors import error_response as api_error_response +from project.errors import bp + + +def wants_json_response(): + return request.accept_mimetypes['application/json'] >= request.accept_mimetypes['text/html'] + + +@bp.app_errorhandler(404) +def not_found_error(error): + return api_error_response(404) + + +@bp.app_errorhandler(500) +def internal_error(error): + db.session.rollback() + return api_error_response(500) diff --git a/project/models.py b/project/models.py new file mode 100644 index 0000000000000000000000000000000000000000..48ddd58fc8a984a272b35551da17ce5ce7eb8ce3 --- /dev/null +++ b/project/models.py @@ -0,0 +1,45 @@ +from flask import current_app, url_for +from project import db + + +class PaginatedAPIMixin(object): + @staticmethod + def to_collection_dict(query, page, per_page, endpoint, **kwargs): + resources = query.paginate(page, per_page, False) + data = { + 'items': [item.to_dict() for item in resources.items], + '_meta': { + 'page': page, + 'per_page': per_page, + 'total_pages': resources.pages, + 'total_items': resources.total + }, + '_links': { + 'self': url_for(endpoint, page=page, per_page=per_page, + **kwargs), + 'next': url_for(endpoint, page=page + 1, per_page=per_page, + **kwargs) if resources.has_next else None, + 'prev': url_for(endpoint, page=page - 1, per_page=per_page, + **kwargs) if resources.has_prev else None + } + } + return data + + +class User(PaginatedAPIMixin, db.Model): + __tablename__ = 't_user' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(20)) + cell_phone_number = db.Column(db.String(20)) + + def __repr__(self): + return ''.format(self.name) + + def to_dict(self): + data = { + 'id': self.id, + 'name': self.name, + 'cell_phone_number': self.cell_phone_number, + 'photos': [] + } + return data diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..09057829cc117ca1f852034b8db9ce282f510128 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +Werkzeug==0.16.0 +Flask==1.1.1 +config==0.4.2 +flask_moment==0.9.0 +flask_sqlalchemy==2.4.1 diff --git a/scheme.sql b/scheme.sql new file mode 100644 index 0000000000000000000000000000000000000000..3d2700b484ef839cce3d1e249e21a4ae6a1d8bc1 --- /dev/null +++ b/scheme.sql @@ -0,0 +1,47 @@ +-- 用户表 +create table t_user +( + id int primary key auto_increment, + name varchar(20) not null, + cell_phone_number varchar(20) not null +); + +-- 图片表 +create table t_picture +( + id int primary key auto_increment, + user_id int, + embedding varchar(512) not null, + picture_path varchar(200) not null, + constraint userid foreign key (user_id) references t_user (id) +); + +-- 用户图片表 +create table t_user_picture +( + user_id int not null, + picture_id int not null, + constraint userid2 foreign key (user_id) references t_user (id), + constraint pictureid2 foreign key (picture_id) references t_picture (id) +); + +-- 签到表 t_sign_in +create table t_sign_in +( + id int not null primary key auto_increment, + name int not null, + start_time datetime not null, + end_time datetime not null +); + +-- 用户签到表 t_user_sign +create table t_user_sign +( + user_id int not null, + sign_id int not null, + constraint userid3 foreign key (user_id) references t_user (id), + constraint signid3 foreign key (sign_id) references t_sign_in (id) +); + + +