天天看點

2Python全棧之路系列之Django路由與視圖Python全棧之路系列之Django路由與視圖

路由說白了就是與視圖(函數)的對應關系,怎麼說呢,一個路由對應一個視圖,比如上面文章中所提到的那樣,當打開<code>/users/</code>路徑的時候會讓<code>users</code>這個函數來進行邏輯處理,把處理的結果再傳回到前端。

那麼django是怎麼知道從哪裡找路由的配置檔案入口呢?其實這在<code>settings.py</code>檔案中已經被定義了:

<code>ROOT_URLCONF = </code><code>'ansheng.urls'</code>

絕對位址通路

<code># 通路位址必須是http://127.0.0.1:8000/hello/</code>

<code>url(r</code><code>'^hello/$'</code><code>, views.hello),</code>

使用正則與分組

在函數内需要接受year,month,day參數

<code>url(r</code><code>'^(?P&lt;year&gt;[0-9]{4})/(?P&lt;month&gt;[0-9]{2})/(?P&lt;day&gt;[0-9]{2})/$'</code><code>, views.deta),</code>

<code>deta</code>視圖必須接收以下參數:

<code>def</code> <code>deta(request, year, month, day):</code>

傳值

<code>url(r</code><code>'^(?P&lt;year&gt;[0-9]{4})/$'</code><code>, views.</code><code>id</code><code>, {</code><code>'foo'</code><code>: </code><code>'bar'</code><code>}),</code>

<code>id</code>函數必須接受year與foo參數

include分發,有利于解耦

<code># 當通路二級路由是cmdb的時候轉發給app01.urls處理</code>

<code>url(r</code><code>'^cmdb/$'</code><code>, include(</code><code>'app01.urls'</code><code>)),</code>

别名

主要用于前端的from表單驗證,如下執行個體,URLs位址的時候,因為from表單送出的位址使用了别名,是以會自動替換:

<code># urls.py</code>

<code>from</code> <code>django.conf.urls </code><code>import</code> <code>url</code>

<code>from</code> <code>app01 </code><code>import</code> <code>views</code>

<code>urlpatterns </code><code>=</code> <code>[</code>

<code>    </code><code>url(r</code><code>'^index/$'</code><code>, views.index, name</code><code>=</code><code>'bieming'</code><code>),</code>

<code>]</code>

<code># views.py</code>

<code>from</code> <code>django.shortcuts </code><code>import</code> <code>render,HttpResponse</code>

<code>def</code> <code>index(request):</code>

<code>    </code><code>if</code> <code>request.method</code><code>=</code><code>=</code><code>'POST'</code><code>:</code>

<code>        </code><code>username</code><code>=</code><code>request.POST.get(</code><code>'username'</code><code>)</code>

<code>        </code><code>password</code><code>=</code><code>request.POST.get(</code><code>'password'</code><code>)</code>

<code>        </code><code>if</code> <code>username</code><code>=</code><code>=</code><code>'as'</code> <code>and</code> <code>password</code><code>=</code><code>=</code><code>'123'</code><code>:</code>

<code>            </code><code>return</code> <code>HttpResponse(</code><code>"登陸成功"</code><code>)</code>

<code>    </code><code>return</code> <code>render(request, </code><code>'index.html'</code><code>)</code>

<code># index.html</code>

<code>&lt;form action</code><code>=</code><code>"{% url 'bieming' %}"</code> <code>method</code><code>=</code><code>"post"</code><code>&gt;</code>

<code>     </code><code>使用者名:&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code><code>&gt;</code>

<code>     </code><code>密碼:&lt;</code><code>input</code> <code>type</code><code>=</code><code>"password"</code> <code>name</code><code>=</code><code>"password"</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"submit"</code><code>&gt;</code>

<code>&lt;</code><code>/</code><code>form&gt;</code>

可以使用<code>incloud</code>把很多個路由進行拆封,然後把不同的業務放到不同的urls中,首先我們建立項目及應用

<code># 建立DjangoProjects項目</code>

<code>E:\&gt;django</code><code>-</code><code>admin.py startproject DjangoProjects</code>

<code>E:\&gt;cd DjangoProjects</code>

<code># 在項目内建立app1和app12應用</code>

<code>E:\DjangoProjects&gt;python manage.py startapp app1</code>

<code>E:\DjangoProjects&gt;python manage.py startapp app2</code>

項目的urls.py檔案内容

<code># E:\DjangoProjects\DjangoProjects\urls.py</code>

<code>from</code> <code>django.conf.urls </code><code>import</code> <code>url, include</code>

<code>from</code> <code>django.contrib </code><code>import</code> <code>admin</code>

<code>    </code><code># 當路由比對到一級路徑為app1時,就把這個URL交給app1.urls再次進行比對</code>

<code>    </code><code>url(r</code><code>'^app1/'</code><code>, include(</code><code>'app1.urls'</code><code>)),</code>

<code>    </code><code>url(r</code><code>'^app2/'</code><code>, include(</code><code>'app2.urls'</code><code>)),</code>

應用的urls.py和views.py檔案内容

<code># E:\DjangoProjects\app1\urls.py</code>

<code>from</code> <code>django.conf.urls </code><code>import</code> <code>url,include</code>

<code>from</code> <code>app1 </code><code>import</code> <code>views</code>

<code>    </code><code>url(r</code><code>'^hello/$'</code><code>, views.hello),</code>

<code># E:\DjangoProjects\app1\views.py</code>

<code>def</code> <code>hello(request):</code>

<code>    </code><code>return</code> <code>HttpResponse(</code><code>"Hello App1"</code><code>)</code>

<code>    </code> 

<code># E:\DjangoProjects\app2\urls.py</code>

<code>from</code> <code>app2 </code><code>import</code> <code>views</code>

<code># E:\DjangoProjects\app2\views.py</code>

<code>    </code><code>return</code> <code>HttpResponse(</code><code>"Hello App2"</code><code>)</code>

http請求:HttpRequest對象

http響應:HttpResponse對象

HttpRequest對象屬性

屬性

描述

request.path

請求頁面的路徑,不包括域名

request.get_full_path()

擷取帶參數的路徑

request.method

頁面的請求方式

request.GET

GET請求方式的資料

request.POST

POST請求方式的資料

HttpResponse對象屬性

render(request, ‘index.html’)

傳回一個模闆頁面

render_to_response(‘index.html’)

redirect(‘/login’)

頁面跳轉

HttpResponseRedirect(‘/login’)

給頁面傳回一個字元串

本文轉自 Edenwy  51CTO部落格,原文連結:http://blog.51cto.com/edeny/1925003,如需轉載請自行聯系原作者