WeChatアプレット開発への道(8)Djangoルーティング
簡単に言うと、ルーティングとは、ユーザーが要求したURLリンクに基づいて対応する処理プログラムを決定し、処理結果を返すことです。つまり、URLとDjangoビューがマッピング関係を確立します。
Djangoルーティングはurls.pyで構成され、urls.pyの各構成は対応する処理方法に対応します。
異なるバージョンのDjangoのurls.py構成は少し異なります(ブロガーが使用するバージョン3.2.10):
パス:通常のパスに使用されます。通常の最初の制限記号を自分で手動で追加する必要はありません。追加されました。
re_path:通常のパスに使用されます。通常の最初の制限記号を手動で追加する必要があります。
例:
from django.urls import re_path # 用re_path 需要引入
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index), # 普通路径
re_path(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]
通常のパスでのグループ化
通常のパスでの名前のないグループ化名前のないグループ化
は、位置、1対1の対応によってパラメーターを渡します。
リクエストを除いて、ビュー内の他のパラメータの数は、URL内のグループの数と同じである必要があります。
from django.conf.urls import url
from django.urls import re_path
from django.urls import path
from django.contrib import admin
from . import views,testdb,search,search2
urlpatterns = [
path('admin/', admin.site.urls),
re_path("^index/([0-9]{4})/$", views.index),
]
正規表現を自分で学ぶのが最善です。
from django.http import HttpResponse
from django.shortcuts import render
def runoob(request):
name ="中国矿业大学计算机学院许磊"
return render(request,"runoob.html",{
"name":name})
def index(request,year):
print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
return HttpResponse('中国矿业大学计算机学院许磊')
通常のパスでの名前付きグループ化
構文:(?P <グループ名>正規表現)
名前付きグループ化には、位置の順序に関係なく、キーワードによってパラメーターが渡されます。
リクエストを除いて、ビュー内の他のパラメーターの数はurl内のグループの数と同じである必要があり、ビュー内のパラメーターの名前はurl内のグループ名に対応している必要があります。
通常のパスの名前付きグループ
ルーティング配布(インクルード)に
問題があります。Djangoプロジェクトの複数のアプリディレクトリが1つのURLを共有しているため、混乱やメンテナンスの不便が発生しやすくなっています。
解決策:ルート配布(インクルード)を使用して、各アプリディレクトリに独自のURLを設定します。
ステップ:
1、在每个 app 目录里都创建一个 urls.py 文件。
2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。
それぞれのアプリディレクトリに、独自のurls.pyファイルを書き込んでパスにジャンプします。
app01ディレクトリ:
from django.urls import path,re_path
from app01 import views # 从自己的 app 目录引入 views
urlpatterns = [
re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),
]
app02ディレクトリ:
from django.urls import path,re_path
from app02 import views # 从自己的 app 目录引入views
urlpatterns = [
re_path("^xxx/(?P[0-9]{4})/$", views.xxx),
]
それぞれのビュー関数を、それぞれのアプリディレクトリのviews.pyファイルに書き込みます。
逆分析
機能の増加に伴い、ルーティングレイヤーのURLが変更され、対応するビューレイヤーとテンプレートレイヤーのURLを変更する必要があり、メンテナンスが非常に面倒で不便です。
現時点では、逆分析を使用できます。ルーティングレイヤーのURLが変更された場合、変更されたURLはビューレイヤーとテンプレートレイヤーで動的に解決されるため、変更の必要はありません。
逆分析は通常、テンプレートのハイパーリンクとビューのリダイレクトで使用されます。
共通パス
エイリアスurls.pyのルート、name = "routealias"。
path("login1/", views.login, name="login")
views.pyで、django.urlsからreverseを導入し、reverse(「ルートエイリアス」)を使用して解像度を逆にします。
return redirect(reverse("login"))
テンプレートテンプレートのHTMLファイルで、逆分析に{%url "route alias"%}を使用します。
<form action="{% url 'login' %}" method="post">
名前空間
名前空間(英語:名前空間)は、表示される識別子の範囲です。
識別子は複数の名前空間で定義でき、異なる名前空間でのその意味は関係ありません。
繰り返される定義は他の名前空間にあるため、任意の識別子を新しい名前空間で定義でき、繰り返される識別子と競合することはありません。
問題があります:ルーティングエイリアス名にスコープがありません。DjangoはURLを逆方向に解析するときに、プロジェクトのグローバル順序で検索します。最初のルーティングエイリアス名で指定されたURLを見つけると、すぐに返されます。 。同じルーティングエイリアス名が異なるアプリディレクトリの下のURLに定義されている場合、URLの逆解析エラーが発生する可能性があります。
解決策:名前空間を使用します。
共通パス
定義名前空間(includeはタプル)の形式は次のとおりです。
include(("app名称:urls","app名称"))
path("app01/", include(("app01.urls","app01")))
path("app02/", include(("app02.urls","app02")))