Django:RedirectView的HTTP错误410(Gone)

时间:2017-07-12 07:02:06

标签: python django web-services web

调用以下Django View时出现HTTP 410错误:

>>> views.py:

class ReopenMilestoneView(
    dj_auth_mixins.LoginRequiredMixin, dj_views.RedirectView
):

    pattern_name = 'bibliotheka_dashboard'

    def dispatch(self, request, *args, **kwargs):
        print('DISPATCH BEGIN')
        instance = project_models.Milestone.objects.get(pk=kwargs['pk'])
        instance.state = project_models.STATE_OPEN
        instance.save()
        print('DISPATCH END')

        return super(ReopenMilestoneView, self).dispatch(
            request, *args, **kwargs
        )


    def http_method_not_allowed(self, *args, **kwargs):
        print('HTTP NOT ALLOWED BEGIN')
        try:
            return super(ReopenMilestoneView, self).http_method_not_allowed(
                *args, **kwargs
            )
        except:
            print('EXCEPTION')
        print('HTTP NOT ALLOWED END')

    def get_redirect_url(self, *args, **kwargs):
        print('REDIRECT BEGIN')
        result = super(ReopenMilestoneView, self).get_redirect_url(
            *args, **kwargs
        )
        print('REDIRECT END, result = ' + str(result))
        url = urlresolvers.reverse('bibliotheka_dashboard')
        url2 = urlresolvers.reverse(self.pattern_name)
        print('REDIRECT END, URL_resolved = ' + str(url))
        print('REDIRECT END, pattern_name = ' + str(self.pattern_name))
        print('REDIRECT END, URL_2_resolved = ' + str(url2))

        return result

>>> urls.py:

...
    url(
        r'^milestone/dashboard/$',
        project_views.MilestoneDashboard.as_view(),
        name='milestone_dashboard'
    ),
    url(
        r'^milestone/(?P<pk>[\w-]+)/dashboard/$',
        project_views.MilestoneDashboard.as_view(),
        name='milestone_specific_dashboard'
    ),
...

我通过Django文档中提到的三个方法“RedirectView”添加了打印作为常规工作流程(django)的一部分。

Dispatch正确执行但是,当自动解析“pattern_name”时,“RedirectView”失败...手动解析它,解决了问题。

DISPATCH BEGIN
DISPATCH END
REDIRECT BEGIN
REDIRECT END, result = None
REDIRECT END, URL_resolved = /
REDIRECT END, pattern_name = bibliotheka_dashboard
REDIRECT END, URL_2_resolved = /

Gone: /prj/milestone/2/reopen/
[12/Jul/2017 13:28:34] "GET /prj/milestone/2/reopen/ HTTP/1.1" 410 0

之前我使用过“RedirectView”,但我从来没有遇到过这个错误,有什么想法吗? Django没有返回很多信息......

我的网址定义如下:

from django.conf.urls import url, include
from django.conf.urls import static as dj_static
from django.contrib import admin

from bibliotheka import settings as bibliotheka_settings
from documentation.views import project as project_views


urlpatterns = [
    url(
        r'^$',
        project_views.MilestoneDashboard.as_view(),
        name='bibliotheka_dashboard'
    ),
    url(r'^admin/', admin.site.urls),
    url(r'^accounts/', include('accounts.urls')),
    url(r'^accounts/', include('allauth.urls')),
    url(r'^prj/', include('documentation.urls.project')),
    url(r'^dox/', include('documentation.urls.documents')),
    url(r'^dox/', include('documentation.urls.discrepancies')),
]

if bibliotheka_settings.DEBUG:
    urlpatterns += dj_static.static(
        bibliotheka_settings.MEDIA_URL,
        document_root=bibliotheka_settings.MEDIA_ROOT
    )

我正在尝试使用有问题的视图重定向到“/”。

1 个答案:

答案 0 :(得分:3)

Django未能撤消milestone_dashboard。在Django&lt; = 1.11中,它使NoReverseMatch静音,并返回410响应。

此行为已在Django 2.0中更改(请参阅ticket 26911),因此Django将不再对异常进行静音。

当你使用pattern_name时,Django试图用相同的args和kwargs反转。您不希望这样,因为您从包含pk的网址重定向到没有任何参数的网址。

您可以使用url设置reverse_lazy

from django.urls import reverse_lazy

class ReopenMilestoneView(RedirectView):
    url = reverse_lazy('bibliotheka_dashboard')