2017-10-02 8 views
0

Facebook、GitHub、およびTwitterはすべて、URL階層のルートにユーザプロファイルURLを配置します(例:http://twitter.com/jack)。URL階層のルートにユーザプロファイルをルーティング

http://twitter.com/searchのような他の「システム」URLが最初に解決されるため、@searchという名前のユーザーはサイトの一部をハイジャックすることができないようにする必要があります。

とNOシステムのURLが存在しない、とそのようなユーザープロファイルが見つからない場合、彼らは404

DjangoのURLルーティングを使用してこれを達成するための最良の方法は何を投げる必要があります

?私の現在のソリューションは、次のとおりです。

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    # etc, ..., then this last: 
    url(r'^(?P<username>.+)$', views.view_profile), 
] 

def view_profile(request, username): 
    try: 
    user = User.objects.get(username=username) 
    except User.DoesNotExist: 
    raise Http404('User does not exist') 
    return HttpResponse(username + ' exists!') 

このように、view_profileビューはキャッチオール他の場所で処理されないURLのためです。しかし、ユーザがいなければ404例外が発生するのは理想的ではないようですが、DjangoのURLルータに要求のルーティングを再開するよう指示する「間違ったルート」シグナルを発生させたいと思います。このようにして、Djangoは、catch-allルートを持たない場合と同じ方法で404を生成します。

This questionは本質的に同じことを要求しますが、解決策はユーザープロファイルのサブパスを作成することでした。

+1

これは、実際にDjangoルーティングの仕組みではありません。 DjangoはURLを最初に解決し、関連するビューを呼び出します。そのフェーズがすでに完了しているため、ビューからルーティングを「再開」するように指示することはできません。 –

+0

あなたのユーザプロファイルのURLをルートレベルにしたい場合、 'view_profile'をキャッチオールにする必要があります。あなたが投稿した[The answer](https://stackoverflow.com/a/24539162/4593972)は、ソリューションに近づけることができます。 – olieidel

答えて

0

私は、実際には、ユーザープロファイルに対処するためのより多くのRESTfulな方法をお勧めします。良い組織やユーザープロファイルの経路が/users/{pk}/であるか、クライアントの方が簡単であれば(私たちはそのようにしています)/users/me/クライアントはIDを覚えておく必要はなく、ユーザーはセッションまたは認証から選択します/ベアラトークン、あるいはあなたが好きな認証システムであれば可能です。