Django - 测试从 url 参数检索的视图名称,即。参考=家
Django - Testing a view name retrieved from a url parameter ie. ref=home
简单地说,我正在尝试在我的一个视图函数中测试从 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
是否是有效视图并且 return 它,如果没有则重定向到另一个视图。
我一直在搞乱 Django 的 resolve 和 reverse 但我没有得到我想要的结果。
我还尝试以各种方式将 try/finally 与 resolve 和 reverse 结合使用。是啊,傻...我知道。
try:
if ref:
return redirect(resolve(ref))
finally:
return redirect('user')
我搜索了将近两个小时,试图资助一种简洁的方式来做到这一点。
如有任何帮助,我们将不胜感激!
问题是您将视图名称传递给 resolve()
,这需要 URL 路径。为了防止 404,您需要先 reverse()
视图名称来获取路径。然后您可以将该路径与 resolve()
一起使用来检查该路径是否存在。
可行的解决方案
在@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')
简单地说,我正在尝试在我的一个视图函数中测试从 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
是否是有效视图并且 return 它,如果没有则重定向到另一个视图。
我一直在搞乱 Django 的 resolve 和 reverse 但我没有得到我想要的结果。
我还尝试以各种方式将 try/finally 与 resolve 和 reverse 结合使用。是啊,傻...我知道。
try:
if ref:
return redirect(resolve(ref))
finally:
return redirect('user')
我搜索了将近两个小时,试图资助一种简洁的方式来做到这一点。
如有任何帮助,我们将不胜感激!
问题是您将视图名称传递给 resolve()
,这需要 URL 路径。为了防止 404,您需要先 reverse()
视图名称来获取路径。然后您可以将该路径与 resolve()
一起使用来检查该路径是否存在。
可行的解决方案 在@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')