我正在一个简单的消息传递系统上,其中两个不同的用户可以互相发送消息。现在,每个用户都使用graphQL轮询请求最新消息的服务器。
问题是,当一个用户(用户A)发送大量消息(graphQL突变查询)而另一用户(用户B)进行轮询时,消息有时似乎是由用户B发送的。
我更深入地研究,发现在错误分配消息的情况下,突变查询是用不正确的请求(在上下文中填充)命中的,而current_user
中的flask_login
是也错了。 current_user
似乎取决于请求。该请求是用户B的轮询请求之一(不是突变)。
我追溯了一下,找到了填充上下文的地方(https://github.com/graphql-python/flask-graphql/blob/master/flask_graphql/graphqlview.py#L42),但是很难弄清楚为什么它从Flask那里收到了不正确的请求。
我最好的猜测是Flask的请求上下文堆栈正在发生某些事情,但是很难追踪。
我应该提及的是,身份验证是使用Authorization标头完成的,并且我试图找出一种情况,即用户被错误身份验证但无法被身份验证。
这似乎仅在我直接使用FLASK_ENV=production flask run
运行flask时发生,而当我使用gunicorn
运行烧瓶时似乎消失了。即便如此,令人担忧的是身份验证可能如此脆弱。
以前有没有人看过这个问题?在Flask文档中是否有什么可以解释此问题,为什么会发生,更重要的是,当我使用gunicorn
时为什么不会发生?
相关代码版本:
示例代码:
import graphene as gr
from graphql import GraphQLError
from flask_login import current_user
from ...models import Message
from .shared import MessageNode
class CreateMessage(gr.Mutation):
""" Send a message to a channel account """
message = gr.Field(MessageNode)
class Arguments:
body = gr.JSONString(required=True)
@login_required
def mutate(self, info, body):
# Make sure that the body is populated with something
if not (body.get("text") and not body.get("image")) and not (
not body.get("text") and body.get("image")
):
raise GraphQLError("Body must contain either text or an image")
new_message = Message(
body=body,
sender_account=current_user, # CURRENT USER IS INCORRECT HERE
)
db.session.add(new_message)
db.session.commit()
return CreateMessage(message=new_message)