在 django 中间件中使用 HTTP HttpResponsePermanentRedirect 时站点进入重定向循环

Posted

技术标签:

【中文标题】在 django 中间件中使用 HTTP HttpResponsePermanentRedirect 时站点进入重定向循环【英文标题】:Site enters into Redirect loop when using HTTP HttpResponsePermanentRedirect in django middleware 【发布时间】:2014-02-05 13:10:59 【问题描述】:

当我尝试在 Heroku 上部署时,我的网站中出现了带有此代码的重定向循环。这是中间件的代码

# -*- coding: utf-8 -*-

from django.utils.functional import SimpleLazyObject
from django.conf import settings
from django.http import HttpResponsePermanentRedirect

def get_country_request(ip):
   import pygeoip
   file_path = settings.PROJECT_ROOT + '/data/GeoIP.dat.dat'
   gi = pygeoip.GeoIP(file_path)
   country = gi.country_name_by_addr(ip)   
   if country:
      return country

class LocationMiddleWare(object):


    def process_request(self, request):
        if 'HTTP_X_FORWARDED_FOR' in request.META:
            request.META['REMOTE_ADDR'] = request.META['HTTP_X_FORWARDED_FOR']
        ip = request.META['REMOTE_ADDR']
        print request.path
        country = get_country_request(ip)             
        if country == "India":
          return HttpResponsePermanentRedirect('/en/')       
        if country == "Netherlands":
          return HttpResponsePermanentRedirect('/nl/')
        return None

请提出我哪里做错了,并建议是否有更好的方法。

提前致谢!

【问题讨论】:

【参考方案1】:

您总是重定向来自印度和荷兰的人,这是一个循环,因为没有中断。仅当 request.path 不是 /en//nl/ 时才应该进行重定向。

def process_request(self, request):
    # NOTICE: This will make sure redirect loop is broken.
    if request.path in ["/en/", "/nl/"]:
        return None
    if 'HTTP_X_FORWARDED_FOR' in request.META:
        request.META['REMOTE_ADDR'] = request.META['HTTP_X_FORWARDED_FOR']
    ip = request.META['REMOTE_ADDR']
    print request.path
    country = get_country_request(ip)             
    if country == "India":
        return HttpResponsePermanentRedirect('/en/')       
    if country == "Netherlands":
        return HttpResponsePermanentRedirect('/nl/')
    return None

【讨论】:

非常感谢!你太棒了:) 很高兴能帮上忙 :)

以上是关于在 django 中间件中使用 HTTP HttpResponsePermanentRedirect 时站点进入重定向循环的主要内容,如果未能解决你的问题,请参考以下文章

django考点

django考点答案

Django中间件详解

python 在Heroku上关闭django的中间件。见http://stackoverflow.com/questions/30969597/how-do-i-handle-dyno-restar

Django----中间件详解

Django----中间件详解