ルーティングシステム
私たちは、プロジェクトのジャンゴを起動すると、Djangoはブラウザを介して、プロジェクト内のリソースにアクセスしたいです
私たちは、Djangoのプロジェクト内のURLでルートを設定する必要があります
urlpatterns = [ URL(R ' ^管理/ ' 、admin.site.urls)、 URL(R ' ^テスト/ ' 、TEST1) ]
この機能は、ブラウザジャンゴにアクセスすることができます
これは、ファイルのコメントの始まりをURLでしかし、あなたが私たちに言った後のURLは、次の3つに従うことができます
ファンクションビュー 1.追加輸入を: から MY_APPのインポートビュー 2 urlpatternsにURLを追加します:URL(R 「^ $ 」、views.home、名前= 「ホーム」) クラス - ベースのビュー 1.追加輸入を: から other_app .viewsはインポートホーム 2. urlpatternsにURLを追加します:URL(R ' ^ $ '、Home.as_view()、名前= ' ホーム' ) 別のURLconfを含む 1.インポートは、()関数:からdjango.conf.urlsは、インポート、URLが含ま 2. urlpatternsにURLを追加します:URL(R ' ^ブログ/ '、(含ま' blog.urls ')を)
我々は、このルートの年末までに最終一致機能へのルートは、と考えたときだけということを学んだ後
1.ルートは、関数名とのマッチング
最初は、上記の機能に直接あるルート終了を表します
クラスメソッドの呼び出しas_view 2.ルーティング試合
第二は、クラス、コールas_view()メソッドであり、私たちは私たちが何を達成するのを助けるためにas_viewの方法で見ることができます
この関数は、最も高い優先順位を括弧と優先されます
まず、結合方法のas_viewのクラスを取ります
次いで、オブジェクト・クラス・インスタンスの寿命で機能as_viewビュー機能で閉鎖、及び発送方法アウトバック結果を生成します
そして、関数オブジェクトの返り値のas_view実際には、このビューので、このアプローチの本質は、関数を使用することです
あなたが実装プロセスのCBVを理解したい場合、あなたは今日、発送方法を見て行くことができる私たちは、次のルート分布を説明するに焦点を当てます
3.ルート分布
執筆:経由含める行くための分布とルーティング
urlpatterns = [ URL(R ' ^管理/ ' 、admin.site.urls)、 URL(R ' ^テスト/ '、(含める' app01.urlsを' )) ]
1.まずは、内部関数を見てみましょう私たちは何をしたに役立つ含ま
上記の分析を通して、私たちは知っている、実際には文字列で書かれたモジュールをインポートすると、フォームのタプルを返すことを行うために私たちを助ける含ま
これは、(URLは、なし、なし)導入後は、基本的には差のURLではありません(「app01.urls」)、およびこの製剤が含まれると言います
2.私たちは、URLを見てみましょう()何をしましたか
このように、我々は一般的に、彼は私たちの(モジュールオブジェクト、なし、なし)を入れていないに変換することを意味するものと理解することができます(リスト、なし、なし)
ここでの分析以来3、その後、私はルートは、この(リスト、なし、なし)も問題にはならないと一致する直接
確かに、これは私たちのルートディストリビューションの本質場合です
urlpatterns = [ url(r'^test/', ([ # 这里是分一级路由 url(r'^test_1', ([ # 这是分的二级路由,我们可以通过这种方式无限往下分 url(r'^test_1_1', test_1_1), url(r'^test_1_2', test_1_2) ],None, None)), url(r'^test_2', test_2), ],None, None)), ]
注意: 只有当路由匹配后面跟的是函数对象时,这条路由才算结束,否则如果是([],None,None)这种,接着往下分,往下找。
路由系统
当我们启动一个django项目后,想要通过浏览器访问到django项目中的资源
就需要在django中的urls项目中进行路由配置
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/', test1), ]
这样就可以在浏览器访问到jango中的函数
然而在这个urls文件开头注释中,就已经告诉了我们url后面可以跟以下三种
Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
我们又了解到,只有当一条路由最后匹配到一个函数之后,这条路由才算结束
1. 路由匹配跟函数名
上面的第一种就是直接跟函数,表示一条路由的终止
2. 路由匹配跟类调用as_view方法
第二种跟的是类,调用了as_view()的方法,我们可以看一下as_view方法帮我们实现了什么
函数加括号优先级最高,会优先执行
首先,走了as_view的类绑定方法
然后在as_view中生成了一个闭包函数view,在该函数中把类实例化长生对象,并把dispatch方法的结果返出来
然后as_view的返回值其实这个view函数对象,所以这种方法的本质还是跟的函数
如果你想了解cbv的执行过程,可以接着去dispatch方法中看一看,今天我们着重讲解下面的路由分发include
3. 路由分发
写法: 通过include把以及路由分发下去
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/', include('app01.urls')), ]
1. 首先我们来了解一下include函数内部帮我们干了什么
通过以上的分析我们知道,include帮我们干的事情其实是导入字符串写的模块,并以元组的形式返回
也就说 include('app01.urls') 和 导入urls之后的这种写法 (urls, None, None) 本质上是没有区别的
2. 我们再来看一下url()干了什么事
这样我们大致可以理解为,他把我们的(模块对象,None,None) 转换成了(列表,None,None)
3. 既然分析到了这里, 那么我直接在路由匹配通过这种 (列表,None,None) 应该也是不成问题的
确实就是如此,这也是我们路由分发的本质
= urlpatterns [ URL(R&LT ' ^テスト/ '、([ #ここでは、部分経路である URL(R&LT ' ^ TEST_1 '、([ #2つのルート点である、我々はこのように無制限に分周することができ URL(R&LT ' ^ test_1_1 ' 、test_1_1)、 URL(R&LT ' ^ test_1_2 ' 、test_1_2) ]、なし、なし))、 URL(R&LT ' ^ TEST_2 ' 、TEST_2) ]、なし、なし)) ]
注:ルーティング機能一致がオブジェクトが続いている場合にのみ、ルートの終わりを考え、またはそれは([]、なし、なし)これはない場合、見下ろし、下向き。