def generate_token(user_id, email): login_expire_time = current_config('login_expire_time') token_data = { 'user_id': user_id, 'email': email, 'expire': time.time() + login_expire_time } secret_key = current_config('secret_key') algorithm = current_config('algorithm') token = _jwt_encode(token_data, secret=secret_key, algorithm=algorithm) return token.decode()
def register_prov_user(): '''ユーザの仮登録を行う Args: email: 学番メール Returns: 200: 正常に登録が行われた 400: 不正なメールアドレス 500: サーバエラー ''' try: params = request.json email = params.get('email') # 仮登録を行う # トークンを返却 # TODO 仮登録を連続で登録できないようにinterva_timeを設定する login_token = ProvisionalUser.post(email) mail = current_config('mail') # 確認メール送信 send_confirm_mail(from_addr=mail.get('address'), from_addr_pass=mail.get('pass'), to_addr=email, login_token=login_token) return make_response('', 200) except Exception as e: if str(e) == 'over email length': result = {'error_message': 'メールが長すぎます'} return make_response(jsonify(result), 400) return make_response('', 500)
def decode_token(token): secret_key = current_config('secret_key') token_data = _jwt_decode(token, secret=secret_key) if token_data is None: raise Exception('invalid token') else: return token_data
def create_database(): '''データベース作成 ''' # データベース名取得 db = current_config('db') dburl = create_dburl() dburl = dburl[:dburl.rfind('/')] engine = create_engine(dburl) conn = engine.connect() conn.execute('CREATE DATABASE %s CHARACTER SET %s;' % (db.get('db'), db.get('charset'))) conn.close()
def after_request(response): server_config = current_config().get('server') origin = server_config.get('access_control_allow_origin') response.headers['Access-Control-Allow-Origin'] = origin methods = server_config.get('access_control_allow_methods') response.headers['Access-Control-Allow-Methods'] = methods headers = server_config.get('access_control_allow_headers') response.headers['Access-Control-Allow-Headers'] = headers print(response.headers) return response
def run(port=None) -> None: '''サーバーの実行 Args: port: サーバーのLISTENポート 未指定の場合、コンフィグ(server.port)記載の値が使用される ''' flask_server = init_server() config = current_config() dotenv_path = join(dirname(__file__), '.env') load_dotenv(dotenv_path) host = config.get('server').get('host') port = os.environ.get('PORT', 3333) print("host:", host) print("port:", port) flask_server.run( host=host, port=int(port), threaded=config.get('server').get('threaded'), debug=config.get('server_debug'), )
def get_engine(cls, _type: str): config = current_config() dburl = config.get('dburl') failover = [] # 接続情報を取得する # 以下の優先順で取得 # 1. set_connection_infoでセットされた値 # 2. configに記載の値 connection_info = cls._connection_infos.get( _type, config.get('connection_info', {}).get(_type, [])) for c in connection_info: failover.append({ 'user': c.get('user'), 'password': c.get('password'), 'host': c.get('host'), 'database': c.get('database'), }) return create_engine( dburl, connect_args={'failover': failover}, echo=config.get('sql_debug'), )
def register(): '''ユーザの本登録を行う Args: * login_token: 仮登録のトークン * password: パスワード * nick_name: ニックネーム profile: プロファイル twitter_name: ツイッターネーム Returns: 201: 正常登録 400: 仮登録ユーザが存在しない,トークンの有効期限切れ,トークンの不一致 error_message: エラーメッセージ(必要なエラーのみ) 500: サーバエラー * 必須 ''' try: params = request.json nick_name = params.get('nick_name') login_token = params.get('login_token') # login_tokenからemailを取得する prov_user = ProvisionalUser.get_by_login_token(login_token=login_token) # 仮登録ユーザが存在しない場合,400を返却 if not prov_user: result = {'error_message': '仮登録を行なってください'} return make_response(jsonify(result), 400) email = prov_user.get('email') # emailが既に本登録されているか if User.is_exist_by_email(email): # ユーザが登録されている場合,400を返す result = {'error_message': 'このメールアドレスは既に使われています'} return make_response(jsonify(result), 400) # nick_nameが既に本登録されているか if User.is_exist_by_nick_name(nick_name): # ユーザが登録されている場合,400を返す result = {'error_message': 'このニックネームは既に使われています'} return make_response(jsonify(result), 400) # 仮登録作成時間と現在時間の差分を取得 delta = datetime.now(JST) - prov_user['create_at'] prov_expire_time = current_config('prov_expire_time') # 有効時間切れの場合,400を返却 if delta.total_seconds() > prov_expire_time: result = {'error_message': 'リンクの有効期限切れです'} return make_response(jsonify(result), 400) # トークンが不一致の場合,400を返却 if login_token != prov_user['login_token']: result = {'error_message': 'リンクの有効期限切れです'} return make_response(jsonify(result), 400) # paramsからlogin_token除去 del params['login_token'] # paramsにemail追加 params.update({'email': email}) # ユーザ本登録 User.post(params) return make_response('', 201) except Exception as e: return make_response('', 500)
from datetime import datetime, timedelta, timezone import unittest from freezegun import freeze_time from app.config import current_config from app.models.thread import Thread from tests.base import AbstractTest ID_ASC = current_config().get('ID_ASC') ID_DESC = current_config().get('ID_DESC') SPEED_ASC = current_config().get('SPEED_ASC') SPEED_DESC = current_config().get('SPEED_DESC') NUM_COMMENT_ASC = current_config().get('NUM_COMMENT_ASC') NUM_COMMENT_DESC = current_config().get('NUM_COMMENT_DESC') JST = timezone(timedelta(hours=+9), 'JST') class ThreadTest(AbstractTest): tables = ['user', 'category', 'thread', 'comment'] test_tables = ['thread', 'comment'] def test_get_all(self): '''すべてのthread取得 ''' self.load_fixtures() thread = Thread() actual = thread.get_all()
def get_all_by_c_id(cls, category_id, sort_id, paging): '''category_idに紐づくthreadリスト取得 ''' with session_scope() as session: query = session.query( cls ).join( Category, Thread.category_id == Category.category_id ).filter( Category.category_id == category_id ) # sort if sort_id == current_config().get('ID_ASC'): # ID昇順 pass elif sort_id == current_config().get('ID_DESC'): # ID降順 query = query.order_by(cls.thread_id.desc()) elif sort_id == current_config().get('SPEED_DESC'): # 人気高い順 query = query.order_by(cls.speed.desc()) elif sort_id == current_config().get('SPEED_ASC'): # 人気低い順 query = query.order_by(cls.speed.asc()) elif sort_id == current_config().get('NUM_COMMENT_DESC'): # コメント数多い順 query = query.order_by(cls.thread_id.desc()) elif sort_id == current_config().get('NUM_COMMENT_ASC'): # コメント数少ない順 query = query.order_by(cls.thread_id.asc()) # paging # ex) # 1. offset=0, limit=10 # 2. offset=10, limit=20 # pagingバリデーション if paging <= 0: paging = 1 offset = (paging - 1) * 10 limit = 10 query_range = query.offset(offset).limit(limit) rows = query_range.all() # threadが取得できなかった場合 # 1. threadが1つ以上取得できる場合,最後のpagingのthreadリストを返却 # 2. threadが0の場合,[]を返却 if not rows: # category_idに紐づくすべてのthread取得 rows = query.all() # それでもthreadが取得できない場合 if not rows: return [] result = [] count = len(rows) # threadリストを逆順にしてpaging区切りのthreadをまとめて返却 for row in list(reversed(rows)): if count == 0 or count % 10 == 0: break result.append(row_to_dict(row)) count = count - 1 return result result = [row_to_dict(row) for row in rows] return result
parser.add_argument( '-e', '--env', help='実行環境', type=str, choices=[ 'develop', 'staging', 'production', ], default='develop', ) parser.add_argument('-p', '--port', help='ポート', type=int, default=None) args = parser.parse_known_args()[0] # コンフィグの初期化、取得 init_config(env=args.env) config = current_config() # loggerのセットアップ logging_type = 'server' setup_logger(config=config.get('logging').get(logging_type), log_dir=config.get('log_dir'), debug=config.get('debug')) if __name__ == '__main__': # サーバーの実行 from app import server # NOQA server.run(port=args.port)