2017-10-09 12 views
0

このアプリケーションでは、フラスコを包むconnexionを使用して、Webサーバーの世話をします。 APIはswaggerで指定します。 httpレスポンスがWebサーバーから公式化されたコードのどこかに簡単に入り込む方法はありますか?すべてのhttp応答をエラーコード> = 400で記録します。

可能であれば、私は200個のエラーハンドラ、または最も人気のある10個の指を挟むのを避けたいと思います。

api.py

import connexion 
app = connexion.App(__name__, 
       specification_dir='../swagger/', 
       swagger_ui=False, 
       validator_map={ 
        'body': connexion.decorators.validation.RequestBodyValidator 
       }) 
app.add_api('swagger.yml', strict_validation=True) 

# If I had to use app.error_handler decorators to implement the special 
# treatment of http responses with error codes, I would put it here 

swagger.yml

swagger: '2.0' 
info: 
    title: My Minimal Working Example 
consumes: 

    - application/json 
produces: 
    - application/json 

basePath: /api/v1 
paths: 
    '/do_something': 
    post: 
     tags: 
     - MyTag 
     operationId: entrypoint.do_something 
     summary: Do something on request 
     parameters: 
     - name: data 
      in: body 
      schema: 
      $ref: '#/definitions/data' 
     responses: 
     '200': 
      description: Success! 
      schema: 
      $ref: '#/definitions/Response' 
     '400': 
      description: Error! 
      schema: 
      $ref: '#/definitions/Response' 
     '403': 
      description: Not Authorized 
      schema: 
      $ref: '#/definitions/Response'  
# a lot more stuff and "definitions" 
+1

コードを直接記述するのではなく、swaggerを使用するだけであれば、swaggerでできることに限られます。それ以外の場合は、Flaskをサブクラス化してそのエラー処理をオーバーライドする方法があります。スワッガーやコネクションを知らないので、これがあなたのケースで可能かどうかはわかりません。あなたはFlaskクラスまたはappインスタンスを制御できますか? – davidism

+0

私は直接コードを書いており、アプリケーションインスタンスを制御しています – Arne

+0

それを示す[mcve]を含めるように[編集]してください。 – davidism

答えて

1

davidismが示唆したようにIは、フラスコのオブジェクトをサブクラス化することで問題を解決しました。誰かが電流応答をトリガし、要求にアクセスする方法を知っている場合は、お気軽に

app.py

import logging.config 
import yaml 

logging.config.dictConfig(yaml.load(open('logging.conf', 'r'))) 
logger = logging.getLogger("mainLogger") 


class LoggingFlask(Flask): 
    def make_response(self, rv): 
     rv = super(LoggingFlask, self).make_response(rv) 
     if int(rv.status_code) >= 300: 
      logger.warn("Request failed with error code %s." % rv.status_code) 
     return rv 


app = LoggingFlask(__name__) 

SESSION.LOG

./app.py 
[2017-10-10 11:38:19,564 - werkzeug - INFO]: * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 
[2017-10-10 11:38:19,566 - werkzeug - INFO]: * Restarting with stat 
[2017-10-10 11:38:19,690 - werkzeug - WARNING]: * Debugger is active! 
[2017-10-10 11:38:19,691 - werkzeug - INFO]: * Debugger PIN: 211-310-838 

# issues a good request 
[2017-10-10 11:38:25,179 - werkzeug - INFO]: 127.0.0.1 - - [10/Oct/2017 11:38:25] "GET /todo/api/v1.0/tasks HTTP/1.1" 200 - 

# issued a bad request 
[2017-10-10 11:38:28,646 - mainLogger - WARNING]: Request failed with error code 404. 
[2017-10-10 11:38:28,646 - mainLogger - WARNING]: Request failed with error code 404. 
[2017-10-10 11:38:28,647 - werkzeug - INFO]: 127.0.0.1 - - [10/Oct/2017 11:38:28] "GET /todo/api/v1.0/task HTTP/1.1" 404 - 

:短いバージョンはこれです私はこの答えにも含めることができるようにコメントを削除します。

関連する問題