【问题标题】:Python/Django - How to get the page URL before navigating to a new viewPython/Django - 如何在导航到新视图之前获取页面 URL
【发布时间】:2017-05-24 07:10:04
【问题描述】:

我有一个链接到一个网址的链接,如下所示:

<a href="{% url 'sign_in' %}" title="Click here to sign in">Sign in</a>

这链接到 Django 中的一个新视图,我的 URL 模式如下所示:

url(r'^sign-in/', sign_in, name="sign_in")

在我的sign_in 视图中,我想访问用户最初单击链接的 URL。具体来说,我想将此 URL 的一个名为 returnUrl 的参数添加到新 URL。然后我的sign_in 视图可以重定向到这个新的 URL,相应的视图将可以访问 returnUrl 参数。

例如:

  1. 用户点击“登录”
  2. 网站导航到 example.com/sign-in/
  3. sign_in 视图重定向到 sign_in_page,将步骤 1 中的 URL 添加为参数。
  4. sign_in_page 有权访问 URL 参数。

如何在 Django 中实现这一点?我的观点是这样的……

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.core.urlresolvers import resolve


def sign_in(request):
    # I need the original URL the user came from here 
    # to add it as `returnUrl` below:
    return HttpResponseRedirect(reverse('sign_in_page') + '?returnUrl=example.com/whatever')


def sign_in_page(request):
    return render(request, 'sign-in.html')

如果我使用重定向走上了一条错误而黑暗的道路,请告诉我。对我来说,这似乎是添加 URL 参数的唯一方法——这对我的实现很重要。如果您知道没有重定向的方法 - 请告诉我!

【问题讨论】:

  • 能说说参数吗?意思是你是怎么保存的?整个页面的参数是否不同?
  • returnUrl 参数需要是用户点击“登录”链接时的当前 URL。登录过程完成后,我可以在我的 sign_in_page 视图中使用它来将用户重定向回他们点击链接的原始页面。

标签: python django url


【解决方案1】:

如果您想在视图之间传递数据,您可以使用 POST 数据或 GET。在您的情况下,获取数据就是您想要的。 所以你应该使用以下网址。

"{% url 'sign_in' %}?returnUrl={{request.path}}"

然后在你看来:

  1. 检查是否发送了 GET 变量“returnUrl”
  2. 重定向到下一个网址
  3. 否则重定向到默认页面

在以下示例中,我使用从 FormView 继承的基于类的视图

def get_success_url(self):
    if self.request.GET.get('next', ''):
        return (self.request.GET.get('next', ''))
    return  reverse_lazy('experiment_list')

注意:确保在设置中包含以下内容,以确保在每个模板中获得 request.path 变量:

## example: settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
    # other items...
    'django.core.context_processors.request',
    # other items...
)

【讨论】:

【解决方案2】:
referer = self.request.META.get('HTTP_REFERER')

在您需要获取上一个网址的视图中尝试此操作,希望这是您要查找的内容

【讨论】:

    【解决方案3】:

    如果你想重定向到referer,那么你可以这样尝试

        from django.http import HttpResponseRedirect
    
        def sign_in(request):
           # Do your logic here
           return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    

    【讨论】:

    • request.META.get('HTTP_REFERER') 什么都不返回,你知道这是为什么吗?
    • 你使用的是哪个版本的 django?
    • 您确定,您的链接在同一个 django 项目中还是来自外部?
    • 在同一个项目中
    • 如果出现以下情况,浏览器不会发送 Referer(注意不寻常的拼写)标头:a) 引用资源是本地“文件”或“数据”URI。或者 b) 使用了不安全的 HTTP 请求,并且使用安全协议 (HTTPS) 接收了引用页面。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多