详解如何用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,其实最常用的,是第一种与第二种,第三种方法很少用。