简短:我正在尝试对名为url的第三方应用做一个简单的重定向视图,其中包含可选参数
第三方视图网址(来自provider.oauth2包)已按此注册
url('^authorize/?$',login_required(Capture.as_view()), name='capture'),
我在namespace ='oauth2'中导入了这个urlconf 在我看来,这很好用:
class RedirectToCapture(RedirectView):
pattern_name = 'oauth2:capture'
def get_redirect_url(self, *args, **kwargs):
return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs)
这将无法反转()url,因为上面的urlpattern中没有定义可选参数
class RedirectToCapture(RedirectView):
pattern_name = 'oauth2:capture'
def get_redirect_url(self, *args, **kwargs):
kwargs['response_type'] = 'code'
return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs)
这个黑客工作
class RedirectToCapture(RedirectView):
pattern_name = 'oauth2:capture'
query_string = True
def get_redirect_url(self, *args, **kwargs):
self.request.META['QUERY_STRING'] = urlencode({'response_type' :'code')
return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs)
这太丑了。另一种方法,自己做reverse()并省略pattern_name
class RedirectToCapture(RedirectView):
def get_redirect_url(self, *args, **kwargs):
self.url = reverse('oauth2:capture') + '?' + urlencode({'response_type' :'code' })
return super(RedirectToCapture,self).get_redirect_url(*args,**kwargs)
这是最干净的方式吗? 以任何方式触摸args或kwargs会导致reverse()停止匹配
PS:是的,我想使用从RedirectView派生的基于类的视图,出于多种不相关的原因。我知道我可以简单地做http.HttpResponseRedirect(url)
答案 0 :(得分:2)
你几乎就在那里。在您的最终版本中,您只需返回网址而不是调用超级。
class RedirectToCapture(RedirectView):
def get_redirect_url(self, *args, **kwargs):
get_args = urlencode({'response_type' :'code' })
return reverse('oauth2:capture') + '?' + get_args