Django框架中的URL路由

时间:2015-07-31 15:04:17

标签: django http redirect web

所以我正在建立一个相当简单的网站,允许用户创建和编辑个人资料。我正在为网站创建网址,其中包含以下“规则”:

  • Tray应该重定向到家。
  • In [94]: class Tray(object): ....: @property ....: def trayData(self): ....: return (1,2,3,4) ....: In [95]: t=Tray() In [96]: t.trayData Out[96]: (1, 2, 3, 4) 应重定向到www.website.com的个人资料。
  • www.website.com/profile/person应重定向到person的个人资料,因为该网址应在www.website.com/profile/person/extra/useless/info之后“修剪”。
  • person应重定向回profile/person/,然后重定向到主页。

到目前为止我的代码如下。

www.website.com/profile

第2部分:

www.website.com

使用此代码,当用户输入# my_site/urls.py from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^$', include('my_app.urls')), url(r'^profile/', include('my_app.urls')), url(r'^admin/', include(admin.site.urls)), ] 时,用户 被重定向到主页,但地址栏仍然显示# my_app/urls.py from django.conf.urls import url from django.http import HttpResponse from . import views urlpatterns = [ url(r'^(?P<username>[\w-]*)/$', views.profile, name='profile'), url(r'^(?P<username>[^\w-])/$', views.profile, name='profile'), # still link to the profile url(r'^$', views.home, name="home"), ] ,我不想要。我想要它阅读www.mysite.com/profile。此外,我没有遵守上面给出的规则列表中的第3条规则。我想有一个URL“清理”功能,它修剪了URL的不需要的部分,但我不知道如何做到这一点。任何帮助将不胜感激。

非常感谢。

1 个答案:

答案 0 :(得分:0)

要在浏览器中更改路径,您需要使用实际的http重定向,而不仅仅是Django网址匹配的后备。

# my_site/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^$', include('my_app.urls')),
    url(r'^admin/', include(admin.site.urls)),
]


# my_app/urls.py

from django.conf.urls import url
from django.views.generic import RedirectView    

from . import views

urlpatterns = [
   url(r'^profile/(?P<username>[^/]+)/$', views.profile, name='profile'),
   url(r'^profile/(?P<username>[^/]+)/(.*)?', RedirectView.as_view(pattern_name='profile')),
   url(r'^profile/$', RedirectView.as_view(pattern_name='home')),
   url(r'^$', views.profile, name="home"),
]

解释:

  • ^profile/(?P<username>[^/]+)/$匹配mysite.com/profile/my-user-name/,最后没有垃圾
  • '^profile/(?P<username>[^/]+)/(.*)?'在最后匹配垃圾邮件的情况(在有效的用户名和/之后)...你想要在查找垃圾邮件之前要求斜杠,否则如果你有两个用户{{ 1}}和john您始终会在网址中将johnsmithjohnsmith用户匹配(将john视为额外垃圾)。然后,我们进行真正的http重定向到规范配置文件URL
  • smith仅匹配'^profile/$'并进行真正的http重定向到主页

有关重定向的详情,请参阅:https://stackoverflow.com/a/15706497/202168

当然也是文档:
https://docs.djangoproject.com/en/1.8/ref/class-based-views/base/#redirectview
https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#redirect