【问题标题】:Django - Testing a view name retrieved from a url parameter ie. ref=homeDjango - 测试从 url 参数检索的视图名称,即。参考=家
【发布时间】:2022-01-24 22:03:09
【问题描述】:

简单地说,我正在尝试在我的一个视图函数中测试从 URL 参数捕获的视图名称,以查看它是否有效。如果没有,则重定向到另一个页面。

比如取这个url...

www.site.com/users/?ref=view_name

那么在我看来

    ref = request.GET.get('ref', None)
    return redirect(ref) if ref else redirect('users')

当然,问题是,如果用户更改了 ref 参数,它将返回 404。我希望能够测试 ref=home 是否是有效视图并返回它,如果不是则重定向到另一个视图。

我一直在搞乱 Django 的解析和反转,但我没有得到我想要的结果。

我还尝试以各种方式将 try/finally 与 resolve 和 reverse 混合使用。是的,笨...我知道。

try:
     if ref:
          return redirect(resolve(ref))
finally:        
     return redirect('user')

我已经搜索了将近两个小时,试图资助一个简洁的方法来做到这一点。

任何帮助将不胜感激!

【问题讨论】:

  • 不接受“视图名称”,为什么不接受实际的 URL?当然,它需要进行 URL 编码,但这很常见,例如在登录流程中确定成功身份验证后重定向的位置。
  • 如果你坚持在这里使用视图名称,那么reverse()是正确使用的函数,而不是resolve()
  • @Code-Apprentice 我的想法是使用视图名称,因为任何 url 更改都不会影响现有代码。
  • 请在下面的部分中发布您的解决方案以获得答案,而不是作为您问题的一部分。

标签: python django django-views django-urls django-url-reverse


【解决方案1】:

问题是您将视图名称传递给 resolve(),这需要 URL 路径。为了防止 404,您需要首先 reverse() 视图名称以获取路径。然后,您可以将该路径与resolve() 一起使用来检查该路径是否存在。

【讨论】:

  • 嗯,好的。让我解决这个问题。给我一些。
  • 如何避免 NoReverseMatch 错误?当我尝试反转视图名称时,我只是将错误呈现到屏幕上,这正是我试图避免的。
  • @VIDesignz 错误是 500,对吧?那么,您是要阻止显示 500 错误的堆栈跟踪,还是要尝试处理 404 错误?这是两个不同的东西。
  • 你带领我走上正确的道路!我用解决方案更新了我的问题。
  • @VIDesignz 不要那样做。相反,将您的解决方案发布为答案
【解决方案2】:

工作解决方案 在@Code-Apprentice 的指导下,这实际上非常简单

先导入一对

from django.urls.resolvers import NoReverseMatch
from django.urls import reverse

然后为了获取 ref 参数并验证是作为合法视图名称,我做了以下操作

# get ref parameter
ref = request.GET.get('ref', None)

if ref:
    try:
        # redirect to ref view name if valid
        return redirect(reverse(ref))
    except NoReverseMatch as e:
        print('No reverse match found')

# redirect to specific view if ref is invalid
return redirect('users')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 2021-05-25
    • 2019-08-22
    • 2017-10-08
    • 2017-04-11
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多