Django实现URL重定向的三种方案详解
本文详解Django中实现URL重定向的三种主要方式:通过URL配置使用RedirectView或redirect_to参数、在视图中利用HttpResponseResponse对象、以及启用django.contrib.redirects应用进行数据库驱动的重定向。文章对比了各方法的适用场景,指出前两种为常用方案,第三种适用于处理404错误自动跳转。
在使用Django开发Web应用时,经常需要将旧URL重定向到新URL。这种映射关系可能具有固定规则,也可能完全随机,其核心目的均是为了满足业务需求。总体而言,Django提供了多种实现重定向(redirect)的方法。
主要有以下三种实现路径: 1. 在URL配置中指定redirect_to参数或使用RedirectView(适用于Django 1.3及以上版本); 2. 在视图函数中通过HttpResponseRedirect类实现重定向; 3. 利用Django内置的redirects应用进行重定向管理。
方法一:在URL配置中指定redirect_to参数或使用RedirectView(适用于Django 1.3及以上版本)
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
)
from django.views.generic import RedirectView
urlpatterns = patterns('',
(r'^one/$', RedirectView.as_view(url='/another/')),
)
方法二:在视图函数中通过HttpResponseRedirect实现重定向
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
方法三:利用Django内置的redirects应用实现重定向
若采用第三种方法,需执行以下步骤: 1. 在settings.py文件的INSTALLED_APPS配置中添加'django.contrib.redirects'; 2. 在MIDDLEWARE_CLASSES(或MIDDLEWARE,视Django版本而定)配置中添加'django.contrib.redirects.middleware.RedirectFallbackMiddleware'; 3. 执行manage.py syncdb命令,创建django_redirect数据表。该表包含site_id、old_path和new_path三个字段。
该方案的核心工作由RedirectFallbackMiddleware承担。当Django检测到404错误时,中间件会查询django_redirect表以查找匹配的URL。若找到匹配项且new_path不为空,则自动重定向至新URL;若new_path为空,则返回410状态码;若无匹配记录,则按常规方式返回原有的错误信息。
需要注意的是,此方法仅处理404相关错误,并不涉及500服务器错误的重定向。
如何对django_redirect表进行增加和删除操作?
from django.db import models
from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible
class Redirect(models.Model):
site = models.ForeignKey(Site)
old_path = models.CharField(_('redirect from'), max_length=200, db_index=True,
help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'."))
new_path = models.CharField(_('redirect to'), max_length=200, blank=True,
help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'."))
class Meta:
verbose_name = _('redirect')
verbose_name_plural = _('redirects')
db_table = 'django_redirect'
unique_together=(('site', 'old_path'),)
ordering = ('old_path',)
def __str__(self):
return "%s ---> %s" % (self.old_path, self.new_path)
可以参考上述模型定义,利用Django相关的ORM(对象关系映射)功能来实现数据的save(保存)和delete(删除)操作。
上述三种方法均可实现Django的重定向功能。在实际开发中,第一种和第二种方法最为常用,而第三种方法的使用频率相对较低。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













