13

だから私はセクションに分割されたサイトをプログラミングしていますが、それ自体がサブセクションに分割されています。私のセットアップでは、ユーザーがセクションへのリンク (たとえば「/home」としましょう) をクリックすると、そのサブセクションの 1 つ (「/home/cover」など) にリダイレクトされます。さらに、ユーザーがページのルートに移動すると、セクションの 1 つ (私の場合は「/home」) にリダイレクトされます。この設定では、誰かがルートに移動すると、最初に「/home」にリダイレクトされ、そこから「/home/cover」にリダイレクトされます。これらのリダイレクトは次のように実装されます。

メインの urls.py:

from django.conf.urls import patterns, include, url
from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='/home')),
    url(r'^home/', include('components.home.urls', namespace='components.home')),
    ...
)

コンポーネント/ホーム/urls.py:

from django.conf.urls import patterns, include, url
from django.views.generic.base import RedirectView

from components.home import views

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='cover')),
    url(r'^cover$', views.cover, name='home_cover'),
    ...
)

実際には、これはうまくいくようです。サイトをナビゲートでき、すべてのリダイレクトが本来の動作をします。ただし、それらの単体テスト、特にルートリダイレクトの単体テストを実装する方法がわかりません。

私が最初に設計したテストは次のようなものでした。

def test_root_url_redirects_to_home_url(self):
    response = self.client.get('/')
    self.assertRedirects(response, '/home', status_code=301)

ただし、実行すると、次のエラーに直面します。

"AssertionError: 301 != 200 : Couldn't retrieve redirection page '/home':
response code was 301 (expected 200)."

これで、すべての二重リダイレクトを簡単に削除し、リダイレクトされたすべての URL が直接そのターゲットを指すようにすることができましたが、現在の構成はよりクリーンで維持しやすいと感じているため、適切にテストできる方法があれば完璧です.

私はDjangoとWeb開発全般に非常に慣れていないので、ここで明らかな答えが欠けていたら申し訳ありません.

4

2 に答える 2