Django:带有RedirectView的HTTP错误410(已消失)

Ric*_*rdo 0 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'
    ),
...
Run Code Online (Sandbox Code Playgroud)

我通过常规工作流程(django)的Django文档中提到的三种方法形式“ RedirectView”添加了打印件。

调度已正确执行,但是当自动解析“ 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
Run Code Online (Sandbox Code Playgroud)

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

我的URL定义如下:

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
    )
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*air 5

Django无法反转milestone_dashboard。在Django <= 1.11中,它使静音NoReverseMatch,并返回410响应。

Django 2.0中,此行为已更改(请参见故障单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')
Run Code Online (Sandbox Code Playgroud)