首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Graphene Python中设置cookies突变?

如何在Graphene Python中设置cookies突变?
EN

Stack Overflow用户
提问于 2017-08-17 17:08:50
回答 2查看 1.7K关注 0票数 6

Graphene Python中,当无法访问用于设置cookie的HttpResponse对象时,应该如何在schema.py中设置cookie?

我当前的实现是通过捕获data.operationName重写GraphQLView的分派方法来设置cookie。这涉及到对我需要设置cookie的操作名称/突变进行硬编码。

在views.py中:

代码语言:javascript
复制
class PrivateGraphQLView(GraphQLView):
    data = self.parse_body(request)
    operation_name = data.get('operationName')
    # hard-coding === not pretty.
    if operation_name in ['loginUser', 'createUser']:
        ...
        response.set_cookie(...)
    return response

有没有一种更干净的方法来为特定的Graphene Python突变设置cookie?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-22 20:22:48

最终通过中间件设置cookie。

代码语言:javascript
复制
class CookieMiddleware(object):

    def resolve(self, next, root, args, context, info):
        """
        Set cookies based on the name/type of the GraphQL operation
        """

        # set cookie here and pass to dispatch method later to set in response
        ...

在自定义graphql视图views.py中,重写调度方法以读取cookie并设置它。

代码语言:javascript
复制
class MyCustomGraphQLView(GraphQLView):  

    def dispatch(self, request, *args, **kwargs):
        response = super(MyCustomGraphQLView, self).dispatch(request, *args, **kwargs)
        # Set response cookies defined in middleware
        if response.status_code == 200:
            try:
                response_cookies = getattr(request, CookieMiddleware.MIDDLEWARE_COOKIES)
            except:
                pass
            else:
                for cookie in response_cookies:
                    response.set_cookie(cookie.get('key'), cookie.get('value'), **cookie.get('kwargs'))
        return response
票数 4
EN

Stack Overflow用户

发布于 2020-02-11 09:51:42

我也遇到过类似的问题。我需要能够在变化中设置语言cookie,并最终结合使用请求实例和自定义中间件。

下面是简化的代码:

代码语言:javascript
复制
class SetLanguage(Mutation):
    class Arguments:
        code = String(required=True)

    ok = Field(Boolean)
    language = Field(LanguageType)

    def mutate(root, info, code):
        info.context.set_language_cookie = code
        return SetLanguage(ok=True, language=code)

突变不能访问响应,因此它临时存储请求实例上的值。一旦创建了响应,自定义中间件就会检索它并设置cookie:

代码语言:javascript
复制
class LanguageConfigMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        if code := getattr(request, "set_language_cookie", None):
            response.set_cookie(settings.LANGUAGE_COOKIE_NAME, code)

        return response
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45730927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档