graphql-python / graphql-python/flask-graphql

[MIDDLEWARE] middleware executed many times

未關閉
#53 17 則留言 3 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
Python
星號
1.3k
分支
139
PR 合併指標
30 天內沒有已合併 PR

描述

Hi there, I'm using flask-graphql in a project and got into a question/issue I don't have many clues. I'm using middlewares; this is the minimum example:

```
from flask import Flask, request
from flask_graphql import GraphQLView
from graphene import Field, ObjectType, Schema, String, relay

class Hello(ObjectType):
message = String()

class Query(ObjectType):
hello = Field(Hello)

def resolve_hello(self, info):
return Hello(message="Hi there")

class DummyMiddleware(object):
def resolve(self, next, root, info, **kwargs):
print("DummyMiddleware")
return next(root, info, **kwargs)

dummy_middleware = DummyMiddleware()
schema = Schema(query=Query)

app = Flask(__name__)
app.add_url_rule('/graphql', view_func=GraphQLView.as_view('graphql',
schema=schema,
graphiql=True,
middleware=[dummy_middleware]))

if __name__ == "__main__":
app.run(host='0.0.0.0', threaded=True)
```
(The problem happens no matter the version; the problem also happens when launching the wsgi app with gunicorn).

If I query "hello()", the "DummyMiddleware" will appear twice. If I query a list of elements, the middleware is executed lots of time, twice per element it seems.
For a query this is _just_ a problem of performance, but in a Logout() mutation what happens is:

- 1st time - the authenticated request is valid, so "logout()" deletes the token
- 2nd time - the authenticated request is not valid (because the token has been deleted), so it returns an error

Is there anything wrong in my approach to middlewares? I'm not sure which part is responsible (flask, graphql, my configuration...). Any hint would be appreciated.

貢獻指南

這個儲存庫沒有索引到貢獻指南

研究方向

從 issue 中所示的 GraphQLView.as_view 設定和 DummyMiddleware.resolve 開始,接著使用 hello 查詢、列表查詢和 logout mutation 重現該行為。比較中介軟體的呼叫次數,並在確認由哪個元件負責之前,確定預期的單次執行行為。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
flask, graphql, python
領域
api, backend
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
需要釐清
新手友好度
25/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。