鍍金池/ 教程/ Python/ Views和URL
更上一層樓
歸檔, AboutMe和標(biāo)簽分類(lèi)
動(dòng)態(tài)URL
Django簡(jiǎn)介
Models
項(xiàng)目與APP
Template
開(kāi)發(fā)環(huán)境和Django安裝
多說(shuō),markdown和代碼高亮
Admin
Views和URL
搜索和ReadMore
RSS和分頁(yè)

Views和URL

網(wǎng)頁(yè)程序的邏輯

request進(jìn)來(lái)->從服務(wù)器獲取數(shù)據(jù)->處理數(shù)據(jù)->把網(wǎng)頁(yè)呈現(xiàn)出來(lái)

  • url設(shè)置相當(dāng)于客戶(hù)端向服務(wù)器發(fā)出request請(qǐng)求的入口, 并用來(lái)指明要調(diào)用的程序邏輯
  • views用來(lái)處理程序邏輯, 然后呈現(xiàn)到template(一般為GET方法, POST方法略有不同)
  • template一般為html+CSS的形式, 主要是呈現(xiàn)給用戶(hù)的表現(xiàn)形式

簡(jiǎn)單Django Views和URL

Django中views里面的代碼就是一個(gè)一個(gè)函數(shù)邏輯, 處理客戶(hù)端(瀏覽器)發(fā)送的HTTPRequest, 然后返回HTTPResponse,

那么那么開(kāi)始在my_blog/article/views.py中編寫(xiě)簡(jiǎn)單的邏輯

    #現(xiàn)在你的views.py應(yīng)該是這樣
    from django.shortcuts import render
    from django.http import HttpResponse

    # Create your views here.
    def home(request):
        return HttpResponse("Hello World, Django")

那么如何使這個(gè)邏輯在http請(qǐng)求進(jìn)入時(shí), 被調(diào)用呢, 這里需要在my_blog/my_blog/urls.py中進(jìn)行url設(shè)置

    from django.conf.urls import patterns, include, url
    from django.contrib import admin

    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'my_blog.views.home', name='home'),
        # url(r'^blog/', include('blog.urls')),

        url(r'^admin/', include(admin.site.urls)),
        url(r'^$', 'article.views.home'),  #由于目前只有一個(gè)app, 方便起見(jiàn), 就不設(shè)置include了
    )

url()函數(shù)有四個(gè)參數(shù), 兩個(gè)是必須的:regex和view, 兩個(gè)可選的:kwargs和name

  • regex是regular expression的簡(jiǎn)寫(xiě),這是字符串中的模式匹配的一種語(yǔ)法, Django 將請(qǐng)求的URL從上至下依次匹配列表中的正則表達(dá)式,直到匹配到一個(gè)為止。

更多正則表達(dá)式的使用可以查看Python正則表達(dá)式

  • view當(dāng) Django匹配了一個(gè)正則表達(dá)式就會(huì)調(diào)用指定的view邏輯, 上面代碼中會(huì)調(diào)用article/views.py中的home函數(shù)
  • kwargs任意關(guān)鍵字參數(shù)可傳一個(gè)字典至目標(biāo)view
  • name命名你的 URL, 使url在 Django 的其他地方使用, 特別是在模板中

現(xiàn)在在瀏覽器中輸入127.0.0.1:8000應(yīng)該可以看到下面的界面

http://wiki.jikexueyuan.com/project/django-set-up-blog/images/64.png" alt="成功" />

Django Views和URL更近一步

很多時(shí)候我們希望給view中的函數(shù)邏輯傳入?yún)?shù), 從而呈現(xiàn)我們想要的結(jié)果

現(xiàn)在我們這樣做, 在my_blog/article/views.py加入如下代碼:

    def detail(request, my_args):
        return HttpResponse("You're looking at my_args %s." % my_args)

在my_blog/my_blog/urls.py中設(shè)置對(duì)應(yīng)的url,

    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'my_blog.views.home', name='home'),
        # url(r'^blog/', include('blog.urls')),

        url(r'^admin/', include(admin.site.urls)),
        url(r'^$', 'article.views.home'),
        url(r'^(?Pd+)/$', 'article.views.detail', name='detail'),
    )

^(?Pd+)/$這個(gè)正則表達(dá)式的意思是將傳入的一位或者多位數(shù)字作為參數(shù)傳遞到views中的detail作為參數(shù), 其中?P定義名稱(chēng)用于標(biāo)識(shí)匹配的內(nèi)容

一下url都能成功匹配這個(gè)正則表達(dá)數(shù)

  • http://127.0.0.1:8000/1000/
  • http://127.0.0.1:8000/9/

嘗試傳參訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)

修改在my_blog/article/views.py代碼:

    from django.shortcuts import render
    from django.http import HttpResponse
    from article.models import Article

    # Create your views here.
    def home(request):
        return HttpResponse("Hello World, Django")

    def detail(request, my_args):
        post = Article.objects.all()[int(my_args)]
        str = ("title = %s, category = %s, date_time = %s, content = %s"
            % (post.title, post.category, post.date_time, post.content))
        return HttpResponse(str)

這里最好在admin后臺(tái)管理界面增加幾個(gè)Article對(duì)象, 防止查詢(xún)對(duì)象為空, 出現(xiàn)異常

現(xiàn)在可以訪(fǎng)問(wèn)http://127.0.0.1:8000/1/

顯示如下數(shù)據(jù)表示數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)正確(這些數(shù)據(jù)都是自己添加的), 并且注意Article.objects.all()返回的是一個(gè)列表

http://wiki.jikexueyuan.com/project/django-set-up-blog/images/65.png" alt="數(shù)據(jù)" />

小結(jié):

  • 如何編寫(xiě)views和設(shè)置url
  • 如何通過(guò)url向views傳參
  • 如何通過(guò)參數(shù)來(lái)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)資源