关于python:Django:有没有办法知道url在应用程序中是否有效?

Django: is there a way to know if a url is valid in the application?

这就是我的目标:

  • 用户想要登录
  • 我在每一页上做了一个按钮,参数为urlback,例如,如果我们在http://olivier.life/today页上,登录按钮的URL将类似于http://olivier.life/login?back=today页。
  • 用户登录
  • 用户登录后,我会检查"EDOCX1"(3)请求中是否有"EDOCX1"(2)。如果是这样,那么我将重定向到GET中的URL。

我的问题是一个安全问题:我只想知道GET中的URL是否是我的应用程序的一部分(对urls.py文件中的一个URL有效)。

如何做到这一点?


使用resolve。在文档中有一个非常接近这个用例的例子。我认为,对于你的案件,你需要的是:

1
2
3
4
5
6
7
8
9
10
11
12
def some_view(request):
    redirect_target = request.GET.get('back')
    if redirect_target:
        try:
            resolve_match = django.core.urlresolvers.resolve(redirect_target)
        except django.core.urlresolvers.Resolver404:
            # do something on bad input
        else:
            return django.shortcuts.redirect(redirect_target)
    else:
        # empty string redirect target, or not provided at all
        # do something else


您可以使用urlresolver的resolve方法,如果该方法无法解析URL,则会引发异常,您可以在此处阅读有关urlresolver的更多信息:

1
2
3
4
5
6
7
8
9
from django.core.urlresolvers import resolve, Resolver404

def yourView(request):
  try:
    if hasattr(request.GET, 'back'):
      resolve(request.GET['back'])
      return HttpResponseRedirect(request.GET['back'])
  except Resolver404:
      return Response('some other thing')