在Graphene Python中,当无法访问用于设置cookie的HttpResponse对象时,应该如何在schema.py中设置cookie?
我当前的实现是通过捕获data.operationName重写GraphQLView的分派方法来设置cookie。这涉及到对我需要设置cookie的操作名称/突变进行硬编码。
在views.py中:
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?
发布于 2017-09-22 20:22:48
最终通过中间件设置cookie。
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并设置它。
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发布于 2020-02-11 09:51:42
我也遇到过类似的问题。我需要能够在变化中设置语言cookie,并最终结合使用请求实例和自定义中间件。
下面是简化的代码:
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:
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 responsehttps://stackoverflow.com/questions/45730927
复制相似问题