DjangoビューとURL配布器
11326 ワード
表示:
ビューは一般的に
URLマッピング:
ビューが書き終わったら、URLにマッピングします.つまり、ユーザーがブラウザに
URLにパラメータを追加するには:
もちろん、文字列をクエリーすることでパラメータを渡すこともできます.サンプルコードは次のとおりです.
後でアクセスするときは
URLには別のurlsモジュールが含まれています.
私たちのプロジェクトでは、
以降、本のリストの
path関数: str:空でない文字列タイプ.デフォルトのコンバータ.ただし、スラッシュは含まれません. int:任意のゼロまたは正数の整形に一致する.ビュー関数にはintタイプがあります. slug:英語の横棒 uuid: path:空でない英語文字列に一致し、スラッシュを含めることができます.
に渡す.
re_path関数:
urlマッチングを書くときに、正規表現を使って複雑なニーズを実現するために書く場合があります.この場合、
include関数:
プロジェクトが大きくなった後、すべての
もちろん、
次に、アプリケーションネーミングスペースを しかし、このような前提は、アプリケーションネーミングスペースが含まれていることです.すなわち、
デフォルトのパラメータを指定します.
url反転:
以前はurlでビュー関数にアクセスしていました.時々私たちはこのビュー関数を知っていますが、彼のurlに戻りたいと思っています.この場合、
適用ネーミングスペースまたはインスタンスネーミングスペースがある場合は、反転時にネーミングスペースを追加する必要があります.サンプルコードは次のとおりです.
このurlでパラメータを渡す必要がある場合は、
カスタムURL変換器:
カスタムはクラスを定義します. は、 は、 は、 は、定義された変換器をdjangoに登録する.
たとえば、4つのデジタル年に一致する
ビューは一般的に
app
のviews.py
に書かれています.ビューの最初のパラメータは、常にrequest
(HttpRequest)オブジェクトです.このオブジェクトには、要求されたすべての情報が格納され、携帯パラメータやヘッダ情報などが含まれます.ビューでは、一般的に論理関連の操作を完了します.たとえば、このリクエストがブログを追加する場合、requestでこれらのデータを受信し、データベースに格納し、最後に実行した結果をブラウザに返すことができます.ビュー関数の戻り結果は、HttpResponseBase
オブジェクトまたはサブクラスのオブジェクトでなければなりません.サンプルコードは次のとおりです.from django.http import HttpResponse
def book_list(request):
return HttpResponse(" !")
URLマッピング:
ビューが書き終わったら、URLにマッピングします.つまり、ユーザーがブラウザに
url
と入力したときに、このビュー関数を要求することができます.ユーザーがurl
を入力して、私たちのウェブサイトに要求したとき、django
はプロジェクトのurls.py
ファイルから対応するビューを探します.urls.py
ファイルにはurlpatterns
変数があり、その後django
はこの変数からすべての一致規則を読み出す.一致規則は、django.urls.path
関数を使用してラップされる必要があります.この関数は、入力されたパラメータに基づいてURLPattern
またはURLResolver
のオブジェクトを返します.サンプルコードは次のとおりです.from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list)
]
URLにパラメータを追加するには:
url
には、いくつかのパラメータが動的に調整される必要がある場合があります.例えば、ある文章の詳細ページのurlが、https://www.jianshu.com/p/a5aab9c4978e
の後ろのa5aab9c4978e
がこの文章のid
であれば、簡書の文章の詳細ページのurlはhttps://www.jianshu.com/p/
と書くことができ、そのうちidは文章のidである.では、django
でこのようなニーズをどのように実現するか.このとき、path
関数で、カッコの形式を使用してパラメータを定義することができます.たとえば、私が今本の詳細を取得したい場合は、url
でこのパラメータを指定する必要があります.サンプルコードは次のとおりです.from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book//',views.book_detail)
]
views.py
のコードは次のとおりです.def book_detail(request,book_id):
text = " id :%s" % book_id
return HttpResponse(text)
もちろん、文字列をクエリーすることでパラメータを渡すこともできます.サンプルコードは次のとおりです.
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/detail/',views.book_detail)
]
views.py
のコードは次のとおりです.def book_detail(request):
book_id = request.GET.get("id")
text = " id :%s" % book_id
return HttpResponse(text)
後でアクセスするときは
/book/detail/?id=1
でパラメータを渡すことができます.URLには別のurlsモジュールが含まれています.
私たちのプロジェクトでは、
app
が1つしかないわけではありません.app
のviews
のすべてのビューをurls.py
に配置してマッピングすると、コードが非常に乱れているに違いありません.したがって、django
は、app
の内部に独自のurl
マッチング規則を含めることができ、プロジェクトのurls.py
にこのapp
を含むurls
をさらに統一する方法を提供する.この技術を使用するには、include
関数を使用する必要があります.サンプルコードは次のとおりです.# first_project/urls.py :
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls"))
]
urls.py
ファイルでは、book
というapp
に関連するすべてのurl
をapp/urls.py
に移動し、first_project/urls.py
では、include
関数を介してbook.urls
を含み、book
に関連するurlを要求するときにbook
のプレフィックスを追加する必要があります.# book/urls.py :
from django.urls import path
from . import views
urlpatterns = [
path('list/',views.book_list),
path('detail//',views.book_detail)
]
以降、本のリストの
url
にアクセスする場合は、/book/list/
にアクセスし、本の詳細ページのurl
にアクセスする場合はbook/detail/
にアクセスします.path関数:
path
関数の定義は、path(route,view,name=None,kwargs=None)
です.以下、これらのパラメータについて説明します.route
パラメータ:url
の一致規則.このパラメータでは、url
に伝達する必要があるパラメータを指定することができ、例えば、文書詳細ページにアクセスするときにid
を伝達することができる.伝達パラメータは、<>
の括弧で指定されます.また、パラメータを渡す際に、このパラメータのデータ型を指定することができ、例えば、文章のid
がint
型であれば、
と書くことができ、後で一致すると、id
がint
型であるurl
にのみ一致し、他のurl
には一致せず、ビュー関数でこのパラメータを取得する場合、int
型に変換されましたいくつかの一般的なタイプがあります.-
、または下線_
によって英語の文字または数字が接続された文字列.uuid
文字列に一致します.view
パラメータ:ビュー関数または .as_view()
またはdjango.urls.include()
関数の戻り値です.name
パラメータ:このパラメータはこのurl
に名前を付けたもので、これはプロジェクトが大きく、url
が多いときに役に立ちます.kwargs
パラメータ:ビュー関数に追加のパラメータを渡したい場合は、kwargs
パラメータで渡すことができます.このパラメータは辞書を受信します.ビュー関数に渡すと、キーワードパラメータとして渡されます.例えば、url
のルール:from django.urls import path
from . import views
urlpatterns = [
path('blog//', views.year_archive, {'foo': 'bar'}),
]
その後blog/1991/
というurlにアクセスするときにfoo=bar
をキーワードパラメータとしてyear_archive
関数re_path関数:
urlマッチングを書くときに、正規表現を使って複雑なニーズを実現するために書く場合があります.この場合、
re_path
を使って実現することができます.re_path
のパラメータはpath
のパラメータとそっくりであるが、最初のパラメータ、すなわちroute
のパラメータは正規表現であってもよい.re_path
を使用するいくつかの例示的なコードは、以下の通りである.from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'articles/(?P[0-9]{4})/', views.year_archive),
re_path(r'articles/(?P[0-9]{4})/(?P[0-9]{2})/', views.month_archive),
re_path(r'articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-_]+)/', views.article_detail),
]
include関数:
プロジェクトが大きくなった後、すべての
url
マッチングルールをプロジェクトのurls.py
ファイルに置くことはよくありませんが、各app
には独自のurls.py
ファイルがあり、このファイルには現在のapp
のすべてのurl
マッチングルールが格納されています.その後、プロジェクトのurls.py
ファイルに統一的に登録します.include
関数には様々な使い方がありますが、ここでは2つのよく使われる使い方を説明します.include(pattern,namespace=None)
:他のapp
のurls
を直接含んでいます.サンプルコードは次のとおりです:from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls"))
]
もちろん、
namespace
パラメータを渡してインスタンスネーミングスペースを指定することもできますが、インスタンスネーミングスペースを使用する前に、アプリケーションネーミングスペースを指定する必要があります.サンプルコードは次のとおりです.# urls.py :
from django.urls import path,include
urlpatterns = [
path('movie/',include('movie.urls',namespace='movie'))
]
次に、アプリケーションネーミングスペースを
movie/urls.py
に指定します.インスタンスコードは次のとおりです.from django.urls import path
from . import views
#
app_name = 'movie'
urlpatterns = [
path('',views.movie,name='index'),
path('list/',views.movie_list,name='list'),
]
include(pattern_list)
:path
またはre_path
関数を含むリストまたはメタグループを含むことができる.include((pattern,app_namespace),namespace=None)
:あるapp
のurls
が含まれている場合、ネーミングスペースを指定することができます.これは、異なるapp
の下で同じurl
が現れるのを防止するためであり、この場合、ネーミングスペースによって区別することができます.サンプルコードは次のとおりです:from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include(("book.urls",'book')),namespace='book')
]
myapp.urls.py
にurlpatterns
と同レベルの変数app_name
が追加される.デフォルトのパラメータを指定します.
path
またはre_path
を使用すると、route
にパラメータを含めることができますが、デフォルトのパラメータを指定したい場合があります.この場合は、以下の方法で完了できます.サンプルコードは次のとおりです.from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page/', views.page),
]
# View (in blog/views.py)
def page(request, num=1):
# Output the appropriate page of blog entries, according to num.
...
blog/
にアクセスすると、num
パラメータが渡されないため、最初のurlに一致し、view.page
というビュー関数が実行され、page
関数にはnum=1
というデフォルトパラメータがあります.したがって,このときパラメータを渡さなくてもよい.一方、blog/1
にアクセスすると、パラメータを渡すときにnum
が渡されるので、2番目のurl
に一致し、views.page
も実行され、渡されたパラメータをpage
関数のnum
に渡す.url反転:
以前はurlでビュー関数にアクセスしていました.時々私たちはこのビュー関数を知っていますが、彼のurlに戻りたいと思っています.この場合、
reverse
によって実現することができる.サンプルコードは次のとおりです.reverse("list")
> /book/list/
適用ネーミングスペースまたはインスタンスネーミングスペースがある場合は、反転時にネーミングスペースを追加する必要があります.サンプルコードは次のとおりです.
reverse('book:list')
> /book/list/
このurlでパラメータを渡す必要がある場合は、
kwargs
を介してパラメータを渡すことができる.サンプルコードは次のとおりです.reverse("book:detail",kwargs={"book_id":1})
> /book/detail/1
django
のうちreverse
がurl
を反転しているときはGET
要求とPOST
要求とを区別しないため、反転しているときにクエリー文字列のパラメータを追加することはできません.クエリー文字列のパラメータを追加する場合は、手動で追加するしかありません.サンプルコードは次のとおりです.login_url = reverse('login') + "?next=/"
カスタムURL変換器:
url
、int
などを含むdjango内蔵のuuid
変換器をいくつか学んだことがあります.これらの内蔵url
は、私たちのニーズを満たすことができない場合があります.そのため、djangoは私たちに自分のurl変換器を定義するインタフェースを提供しています.カスタム
url
変換器は、次の5つの手順で行えます.regex
変換器規則を保存するための正規表現であるクラス内の属性url
を定義する.to_python(self,value)
の値を変換してビュー関数に渡すurl
メソッドを実現する.to_url(self,value)
を反転するときに、伝達されたパラメータを変換して正しいurlに接合するurl
方法を実現する.たとえば、4つのデジタル年に一致する
url
変換器を書きます.サンプルコードは次のとおりです. # 1.
class FourDigitYearConverter:
# 2.
regex = '[0-9]{4}'
# 3. to_python
def to_python(self, value):
return int(value)
# 4. to_url
def to_url(self, value):
return '%04d' % value
# 5. django
from django.urls import register_converter
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
#
path('articles//', views.year_archive),
...
]