Django?視圖與網址
?
Django中網址是寫在 urls.py 文件中,用正則表達式對應 views.py 中的一個函數(或者generic類),我們用一個項目來演示。
django開發的大型網站。下載本節所有源代碼:
學習編程最好的辦法就是動手敲代碼,請按照教程做,本節很簡單,不提供源代碼了,動手開始吧!
一,首先,新建一個項目(project), 名稱為 mysite
1 | django-admin?startproject?mysite |
備注:
用django做一個簡單網站,1. 如果 django-admin 不行,請用 django-admin.py
2. 如果是在Linux是用源碼安裝的,或者用 pip 安裝的,也是用 ?django-admin.py 命令
django返回圖片給前端、?
運行后,如果成功的話, 我們會看到如下的目錄樣式 ? (沒有成功的請參見環境搭建一節):
1 2 3 4 5 6 7 | mysite ├──?manage.py └──?mysite ???? ├──?__init__.py ???? ├──?settings.py ???? ├──?urls.py ???? └──?wsgi.py |
我們會發現執行命令后,新建了一個?mysite?目錄,其中還有一個?mysite?目錄,這個子目錄 mysite 中是一些項目的設置?settings.py?文件,總的urls配置文件?urls.py?以及部署服務器時用到的?wsgi.py?文件,?__init__.py?是python包的目錄結構必須的,與調用有關。
django admin 自定義頁面、?
我們到外層那個 mysite?目錄下(不是mysite中的mysite目錄)
二, 新建一個應用(app), 名稱叫 learn
1 | python?manage.py?startapp?learn? #?learn?是一個app的名稱 |
我們可以看到mysite中多個一個 learn 文件夾,其中有以下文件。
1 2 3 4 5 6 | learn/ ├──?__init__.py ├──?admin.py ├──?models.py ├──?tests.py └──?views.py |
注:Django 1.8.x 以上的,還有一個 migrations 文件夾。Django 1.9.x 還會在 Django 1.8 的基礎上多出一個 apps.py 文件。但是這些都與本文無關。
?
把我們新定義的app加到settings.py中的INSTALL_APPS中
修改?mysite/mysite/settings.py
1 2 3 4 5 6 7 8 9 10 | INSTALLED_APPS? = ?( ???? 'django.contrib.admin' , ???? 'django.contrib.auth' , ???? 'django.contrib.contenttypes' , ???? 'django.contrib.sessions' , ???? 'django.contrib.messages' , ???? 'django.contrib.staticfiles' , ???? 'learn' , ) |
備注,這一步是干什么呢? 新建的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板文件(app-name/templates/下的文件)和靜態文件(app-name/static/中的文件) , 后面你會學習到它們分別用來干什么.
定義視圖函數(訪問頁面時的內容)
我們在learn這個目錄中,把views.py打開,修改其中的源代碼,改成下面的
1 2 3 4 5 6 | #?coding:utf-8 from ?django.http? import ?HttpResponse def ?index(request): ???? return ?HttpResponse(u "歡迎光臨?自強學堂!" ) |
第一行是聲明編碼為utf-8, 因為我們在代碼中用到了中文,如果不聲明就報錯.
第二行引入HttpResponse,它是用來向網頁返回內容的,就像Python中的 print 一樣,只不過 HttpResponse 是把內容顯示到網頁上。
我們定義了一個index()函數,第一個參數必須是?request,與網頁發來的請求有關,request 變量里面包含get或post的內容,用戶瀏覽器,系統等信息在里面(后面會講,先了解一下就可以)。
函數返回了一個 HttpResponse 對象,可以經過一些處理,最終顯示幾個字到網頁上。
那問題來了,我們訪問什么網址才能看到剛才寫的這個函數呢?怎么讓網址和函數關聯起來呢?
定義視圖函數相關的URL(網址) ?(即規定 訪問什么網址對應什么內容)
我們打開?mysite/mysite/urls.py?這個文件, 修改其中的代碼:
?
由于 Django 版本對 urls.py 進行了一些更改:
Django 1.7.x 及以下的同學可能看到的是這樣的:
1 2 3 4 5 6 7 8 9 10 11 | from ?django.conf.urls? import ?patterns,?include,?url from ?django.contrib? import ?admin admin.autodiscover() urlpatterns? = ?patterns('', ???? url(r '^$' ,? 'learn.views.index' ),?? #?new ???? #?url(r'^blog/',?include('blog.urls')), ???? url(r '^admin/' ,?include(admin.site.urls)), ) |
Django 1.8.x - Django 2.0 版本的同學,Django 官方鼓勵(或說要求)先引入,再使用:
1 2 3 4 5 6 7 8 9 | from ?django.conf.urls? import ?url from ?django.contrib? import ?admin from ?learn? import ?views?as?learn_views?? #?new urlpatterns? = ?[ ???? url(r '^$' ,?learn_views.index),?? #?new ???? url(r '^admin/' ,?admin.site.urls), ] |
Django 2.0 版本的同學,urls.py 有比較大的變化(a)(上面 Django 1.8 的在 2.0 中也可以用,是兼容的)
1 2 3 4 5 6 7 8 9 | from ?django.contrib? import ?admin from ?django.urls? import ?path from ?learn? import ?views?as?learn_views?? #?new urlpatterns? = ?[ ???? path('',?learn_views.index),?? #?new ???? path( 'admin/' ,?admin.site.urls), ] |
以上都修改并保存后,我們來看一下效果!
在終端上運行?python manage.py runserver?我們會看到類似下面的信息:
1 2 3 4 5 6 7 8 9 10 11 12 | $?python?manage.py?runserver Performing?system?checks... System?check?identified?no?issues?(0?silenced). You?have?14?unapplied?migration(s).?Your?project?may?not?work?properly?until?you?apply?the?migrations?for?app(s):?admin,?auth,?contenttypes,?sessions. Run?'python?manage.py?migrate'?to?apply?them. December?14,?2017?-?15:09:47 Django?version?2.0,?using?settings?'mysite2.settings' Starting?development?server?at?http://127.0.0.1:8000/ Quit?the?server?with?CONTROL-C. |
提示:上面有一些數據庫相關的提示,但目前我們沒有用到,暫時先忽略他們。
我們打開瀏覽器,訪問?http://127.0.0.1:8000/
?
不出意料的話會看到:
注意:如果是在另一臺電腦上訪問要用 python manage.py ip:port 的形式,比如監聽所有ip:
1 2 3 | python?manage.py?runserver?0.0.0.0:8000 監聽機器上所有ip?8000端口,訪問時用電腦的ip代替?127.0.0.1 |
Django中的 urls.py 用的是正則進行匹配的,如果不熟悉,您可以學習正則表達式以及Python正則表達式。