1

我需要使用石墨烯和 Django 更新 GraphQL 突变中的 cookie。

我的第一个想法是将 cookie 添加到上下文(即请求)中,然后将其设置在中间件中。

我有一个非常简单的突变,看起来像这样:

class SetWantedCookieMutation(graphene.Mutation):

    class Arguments:
        wanted_cookie = graphene.String(required=True)

    ok = graphene.Boolean(required=True)

    def mutate(self, info, wanted_cookie):
        # set cookie here 
        info.context.wanted_cookie = wanted_cookie

        return SetWantedCookieMutation(ok=True)

Django 中间件是这样的:

class CookieMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if (hasattr(request, 'wanted_cookie')):
            response.set_cookie('wanted_cookie', request.wanted_cookie)
        return response

但我无法进入wanted_cookie我的CookieMiddleware.

任何想法如何在突变/moddlewere 中设置 cookie?或者通过石墨烯突变设置cookie的其他方法是什么?

4

1 回答 1

0

一种方法是检查请求的 json 中的操作名称:


class CookieMiddleware(MiddlewareMixin):

    def generate_cookie(self, user):
        # Generate a cookie (probably with the user)

    def request_has_cookie_mutation(self, request):
        # Returns true if the request's operation is SetWantedCookieMutation
        if len(request.body) != 0 and 'operationName' in json.loads(request.body):
            return json.loads(request.body)['operationName'] == 'SetWantedCookieMutation'
        return False

    def process_response(self, request, response):
        if (self.request_has_cookie_mutation(request)):
            new_cookie = self.generate_cookie(request.user)
            response.set_cookie('wanted_cookie', new_cookie)
        return response

请注意,您使用的是 Django pre-1.10 版本,应该考虑升级.

于 2019-11-27T23:46:28.403 回答