gpt4 book ai didi

Django 更改中间件中的 request.path(通过 url 中的 token 进行身份验证)

转载 作者:行者123 更新时间:2023-12-01 15:29:05 24 4
gpt4 key购买 nike

亲爱的 Stackoverflow 上的全知众生,

在 Django 1.3 中,我正在制作一个 process_request 中间件,它从 url 获取 token ,让用户登录(如果正确)并从 url 中删除 token 。然而:

I) Django 建议不要在中间件中访问 POST/GET 数据,我不确定为什么会这样......这同样适用于 request.path 吗? https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-view

II) 我想从 URL 中删除 token ,所以 /album3/pic42/~53Cr3t70K3n/like/ -> /album3/pic42/like/ .但是更改 request.path 不起作用。该页面将不会被找到,而

  • 中间件确实处理正确(通过打印验证)
  • 直接进入/album3/pic42/like/确实有效
  • 错误(带 token )显示 Request URL: http://www.site.com/album3/pic42/like/

  • 有没有解决办法,还是我完全从错误的角度接近这个?

    提前致谢!

    我刚刚意识到要在客户端更改它,显然我需要重定向(为什么我没有想到......)。但是,能够在没有新请求的情况下仅在服务器端重写它仍然很有用,例如访问个性化图像。

    P.s.:如果需要更多细节,请随意跳过

    我正在一个(将)向用户发送个性化电子邮件的网站上工作。我希望用户能够通过电子邮件链接中的 token 单击电子邮件中的链接并自动登录。这是正常登录的补充。 (我知道它不太安全,因为人们可能会转发电子邮件,但这对我的网站来说已经足够了)。网址看起来像这样:
    /album3/pic42/~53Cr3t70K3n/like/(去掉 http://www.site.com,Django 这样做)

    我正在编写一个中间件来匹配它并在适当的时候让用户登录,一个用于接受 token 作为有效凭证的身份验证后端和一个 token 模型。

    中间件 process_request 函数:
    def process_request(self, request):
        if '/~' in request.path:
    result = re.search('(.*)/~(.+?)/(.*)', request.path)
    (uidb36, token) = result.group(2).split('-', 2)
    user = authenticate(uidb36 = uidb36, token = token)
    if user: login(request, user)
    return HttpResponseRedirect('%s/%s' % (result.group(1), result.group(3)) + ('?' + '&'.join('='.join(item) for item in request.GET.items()) if request.GET else ''))
    return None

    现在它适用于重定向,我希望也能够在内部进行。

    最佳答案

    如果你不想搞砸 upload handlers ,我有一个更好的解决方案给你:

  • 在您的 urls.py 中创建一个规则来专门捕获带有 token 的访问
    把它放在urlpatterns的开头以确保首先对其进行评估。像这样的事情会做:
    (r'/~', 'my_app_name.my_redirect_view'),
  • 创建 View :
    def my_redirect_view(request):
    #Compiled regular expressions work much faster
    beloved_tokens = re.compile(r'(.*)/~(.+?)/(.*)')
    result = beloved_tokens.search(request.path)
    try:
    (uidb36, token) = result.group(2).split('-', 2)
    path_end = result.group(3)
    # We use "try" to be sure that no one had
    # messed with our beloved tokens:
    except AttributeError:
    raise Http404
    else:
    user = authenticate(uidb36 = uidb36, token = token)
    if user:
    login(request, user)
    return HttpResponseRedirect('%s/%s' % (result.group(1), result.group(3)) + ('?' + '&'.join('='.join(item) for item in request.GET.items()) if request.GET else ''))
    else:
    raise Http404
  • 关于Django 更改中间件中的 request.path(通过 url 中的 token 进行身份验证),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8024513/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com