详解如何用django实现redirect的几种方法总结
用django开发web应用,经常会遇到从一个旧的url转向一个新的url。这种隐射也许有规则,也许没有。但都是为了实现业务的需要。总体说来,有如下几种方法实现django的redirect。
1.在url中配置redirect_to或者RedirectView(django1.3版本以上)
2.在view中通过HttpResponseRedirect实现redirect
3.利用django的redirectsapp实现
1在url中配置redirect_to或者RedirectView(django1.3版本以上)
fromdjango.views.generic.simpleimportredirect_to
urlpatterns=patterns('',
(r'^one/$',redirect_to,{'url':'/another/'}),
)
fromdjango.views.genericimportRedirectView
urlpatterns=patterns('',
(r'^one/$',RedirectView.as_view(url='/another/')),
)
2.在view中通过HttpResponseRedirect实现redirect
fromdjango.httpimportHttpResponseRedirect
defmyview(request):
...
returnHttpResponseRedirect("/path/")
3.利用django的redirectsapp实现
1.在settings.py中 增加'django.contrib.redirects'到你的INSTALLED_APPS设置.
2.增加'django.contrib.redirects.middleware.RedirectFallbackMiddleware'到你的MIDDLEWARE_CLASSES设置中.
3.运行manage.pysyncdb.创建django_redirect这个表,包含了site_id,old_pathandnew_path字段.
主要工作是RedirectFallbackMiddleware 完成的,如果django 发现了404错误,这时候,就会进django_redirect去查找,有没有匹配的URL。如果有匹配且新的RUL不为空则自动转向新的URL,如果新的URL为空,则返回410.如果没有匹配,仍然按原来的错误返回。
注意,这种仅仅处理404相关错误,而不是500错误的。
增加删除django_redirect表呢?
fromdjango.dbimportmodels
fromdjango.contrib.sites.modelsimportSite
fromdjango.utils.translationimportugettext_lazyas_
fromdjango.utils.encodingimportpython_2_unicode_compatible
@python_2_unicode_compatible
classRedirect(models.Model):
site=models.ForeignKey(Site)
old_path=models.CharField(_('redirectfrom'),max_length=200,db_index=True,
help_text=_("Thisshouldbeanabsolutepath,excludingthedomainname.Example:'/events/search/'."))
new_path=models.CharField(_('redirectto'),max_length=200,blank=True,
help_text=_("Thiscanbeeitheranabsolutepath(asabove)orafullURLstartingwith'http://'."))
classMeta:
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)
采用类似如上的MODEL,另外用DJANGO相关ORM就可以实现save,delete了。
以上三种方法都可以实现djangoredirect,其实最常用的,是第一种与第二种,第三种方法很少用。