WeChatアプレット開発への道(8)Djangoルーティング

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")))

おすすめ

転載: blog.csdn.net/xulei1132562/article/details/113615811