what's the Django
python的框架主要有:Django、Flask、Tornado
Django是一個開放源代碼的Web應用框架,由Python寫成。它的主要特點是大而全,我們需要用到的關於Web框架的內容他幾乎都包括,我們只要稍作改動就可以完成一個比較復雜的項目。
Django最具代表性的就是它的MTV模型,分別代表:
-
- models: 處理與數據庫相關的操作
- template:模板語法--->將變量(數據庫數據)如何巧妙嵌入html頁面中
- views:邏輯處理,主要用於后端的程序的編寫並將需要展現的數據發送到template
此外,Django還有一個urls分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template,即起到路徑與視圖函數的映射關系的作用。
Django的基本生命周期如下圖所示

Django基本命令
pip3 install django
django namage.py startproject 項目名
#這里項目名取mysite,創建完后會得到對應文件夾
#- mysite:項目名稱
#- manage.py: 啟動文件,控制項目命令
#- mysite : 全局文件
#- __init__.py
#- settings.py:包含了項目的默認設置,包括數據庫信息,調試標志以及其他一些工作的變量
#- urls.py:路由信息,負責把URL模式映射到應用程序
#- wsgi.py
python manage.py startapp 應用名
python manage.py runserver ip port #啟動起來后,我們輸入相應的IP和端口就可以訪問到網站了,例如我們的ip用的本機,端口是8080的話訪問的網址就輸入 http://127.0.0.1:8080/ #Django 啟動時報錯 UnicodeEncodeError ...通常是因為計算機名為中文,改成英文的計算機名重啟下電腦就可以了。
''' python manage.py syncdb 注意:Django 1.7.1 及以上的版本需要用以下命令
python manage.py makemigrations python manage.py migrate 這種方法可以創建表,當你在models.py中新增了類時,運行它就可以自動在數據庫中創建表了,不用手動創建。 '''
python manage.py flush #此命令會詢問是 yes 還是 no, 選擇 yes 會把數據全部清空掉,只留下空表。
''' python manage.py createsuperuser # 按照提示輸入用戶名和對應的密碼就好了郵箱可以留空,用戶名和密碼必填 # 修改 用戶密碼可以用: python manage.py changepassword username '''
python manage.py shell #Django 會自動進入在settings.py中設置的數據庫,如果是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。 #在這個終端可以執行數據庫的SQL語句。如果您對SQL比較熟悉,可能喜歡這種方式。
python manage.py # 查看所有的命令,忘記子名稱的時候特別有用。
靜態文件配置
概述: 靜態文件交由Web服務器處理,Django本身不處理靜態文件。簡單的處理邏輯如下(以nginx為例): URI請求-----> 按照Web服務器里面的配置規則先處理,以nginx為例,主要求配置在nginx. conf里的location |---------->如果是靜態文件,則由nginx直接處理 |---------->如果不是則交由Django處理,Django根據urls.py里面的規則進行匹配 以上是部署到Web服務器后的處理方式,為了便於開發,Django提供了在開發環境的對靜態文件的處理機制,方法是這樣:
靜態文件配置說明:
''' 靜態文件的處理又包括STATIC和MEDIA兩類,這往往容易混淆,在Django里面是這樣定義的: MEDIA:指用戶上傳的文件,比如在Model里面的FileFIeld,ImageField上傳的文件。如果你定義 MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上傳的文件就會被保存到c:\temp\media\abc eg: class blog(models.Model): Title=models.charField(max_length=64) Photo=models.ImageField(upload_to="photo") 上傳的圖片就上傳到c:\temp\media\photo,而在模板中要顯示該文件,則在這樣寫 在settings里面設置的MEDIA_ROOT必須是本地路徑的絕對路徑,一般是這樣寫: BASE_DIR= os.path.abspath(os.path.dirname(__file__)) MEDIA_ROOT=os.path.join(BASE_DIR,'media/').replace('\\','/') MEDIA_URL是指從瀏覽器訪問時的地址前綴,舉個例子: MEDIA_ROOT=c:\temp\media\photo MEDIA_URL="/data/" 在開發階段,media的處理由django處理: 訪問http://localhost/data/abc/a.png就是訪問c:\temp\media\photo\abc\a.png 在模板里面這樣寫<img src="/media/abc/a.png"> 在部署階段最大的不同在於你必須讓web服務器來處理media文件,因此你必須在web服務器中配置, 以便能讓web服務器能訪問media文件 以nginx為例,可以在nginx.conf里面這樣: location ~/media/{ root/temp/ break; } 具體可以參考如何在nginx部署django的資料。 '''
static配置:
STATIC主要指的是如css,js,images這樣文件:
STATIC_URL = '/static/' # 別名 STATICFILES_DIRS = ( os.path.join(BASE_DIR,"static"), #實際名 ,即實際文件夾的名字 ) ''' 注意點1: django對引用名和實際名進行映射,引用時,只能按照引用名來,不能按實際名去找 <script src="/statics/jquery-3.1.1.js"></script> ------error-----不能直接用實際名,必須用規定好的別名STATIC_URL = '/static/': <script src="/static/jquery-3.1.1.js"></script> 注意點2: STATICFILES_DIRS = ( ("app01",os.path.join(BASE_DIR, "app01/statics")), ) <script src="/static/app01/jquery.js"></script> '''
media配置:
# in settings: MEDIA_URL="/media/" MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload") # in urls: from django.views.static import serve url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
視圖層中urls.py的內容
URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是建立起url與視圖函數的映射關系。我們就是以這種方式告訴Django,對於這個url要調用這段視圖函數的代碼,對於那個url該調用那段視圖函數的代碼。
''' urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ] 參數說明: 一個正則表達式字符串 一個可調用對象,通常為一個視圖函數(html頁面)或一個指定視圖函數路徑的字符串 可選的要傳遞給視圖函數的默認參數(字典形式) 一個可選的name參數 '''
URLconf的正則字符串參數
一、基本配置
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ] ''' 如果url出現覆蓋現象的情況,匹配第一個url 1 一旦匹配成功則不再繼續往下 2 若要從URL 中捕獲一個值進行傳值,只需要在它周圍放置一對圓括號。 3 最前面不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。 4 每個正則表達式前面的'r'和最后的'$' 是可選的但是建議加上。 一些請求的例子: /articles/2005/3/ 不匹配上述任何URL,因為列表中的第三個模式要求月份應該是兩個數字。 /articles/2003/ 將匹配列表中的第一個模式而不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。 /articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將調用函數 views.month_archive(request, '2005', '03')。 '''
#設置項是否開啟URL訪問地址后面不為/跳轉至帶有/的路徑 APPEND_SLASH=True
二、正則的有名分組(named group)
上面的示例使用簡單的、沒有命名的正則表達式組(通過圓括號)來捕獲URL 中的值並以位置參數傳遞給視圖函數。在更高級的用法中,可以使用命名的正則表達式組來捕獲URL 中的值並以關鍵字參數傳遞給視圖。
在Python 正則表達式中,命名正則表達式組的語法是(?p<name>pattern),其中name是組的名稱,pattern是要匹配的模式。
下面是以上URLconf 使用命名組的重寫:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ] ''' 這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字參數而不是位置參數傳遞給視圖函數。例如: /articles/2005/03/ 請求將調用views.month_archive(request, year='2005', month='03')函數 /articles/2003/03/03/ 請求將調用函數views.article_detail(request, year='2003', month='03', day='03')。 在實際應用中,這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤 —— 你可以在你的視圖函數定義中重新安排參數的順序。
當然,這些好處是以簡潔為代價;有些開發人員認為命名組語法丑陋而繁瑣。 '''
三、URLconf
URLconf 在請求的URL 上查找,將它當做一個普通的Python 字符串。不包括GET和POST參數以及域名。
例如,http://www.example.com/myapp/ 請求中,URLconf 將查找/myapp/。
在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找/myapp/。
URLconf 不檢查請求的方法。換句話講,所有的請求方法 —— 同一個URL的POST、GET、HEAD等等 —— 都將路由到相同的函數。
URLconf 捕獲的參數永遠是字符串
每個捕獲的參數都作為一個普通的Python 字符串傳遞給視圖,無論正則表達式使用的是什么匹配方式。例如,下面這行URLconf 中:views.year_archive 的year 參數將是一個字符串
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
指定視圖函數的參數可以設置一個默認值。 下面是一個URLconf 和視圖的示例:
# URLconf from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # View (in blog/views.py) def page(request, num="1"): ... ''' 在上面的例子中,兩個URL模式指向同一個視圖views.page —— 但是第一個模式不會從URL 中捕獲任何值。
如果第一個模式匹配,page() 函數將使用num參數的默認值"1"。如果第二個模式匹配,page() 將使用正則表達式捕獲的num 值。 '''
四、路由分發:起到解耦作用
from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), ]
這樣做的作用是防止因為耦合性過高,使得其中一行代碼出錯時整個程序崩潰,影響到其他功能的使用。解耦后,若有一個app出現故障,其余功能不受影響,仍可繼續使用,也方便修復
傳遞額外的選項給視圖函數(了解)
URLconfs 具有一個鈎子,函數可以接收一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。
例如:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ]
在這個例子中,對於/blog/2005的請求,Django 將調用views.year_archive(request,year='2005',foo='bar')
這個技術在Syndication 框架中使用較多,來傳遞元數據和選項給視圖。
URL 的反向解析
在使用Django 項目時,一個常見的需求是獲得URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。
人們強烈希望不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。
換句話講,需要的是一個DRY 機制。除了其它有點,它還允許設計的URL 可以自動更新而不用遍歷項目的源代碼來搜索並替換過期的URL。
獲取一個URL 最開始想到的信息是處理它視圖的標識(例如名字),查找正確的URL 的其它必要的信息有視圖參數的類型(位置參數、關鍵字參數)和值。
Django 提供一個辦法是讓URL 映射是URL 設計唯一的地方。你填充你的URLconf,然后可以雙向使用它:
-
- 根據用戶/瀏覽器發起的URL 請求,它調用正確的Django 視圖,並從URL 中提取它的參數需要的值。
- 根據Django 視圖的標識和將要傳遞給它的參數的值,獲取與之關聯的URL。
第一種方式是我們在前面的章節中一直討論的用法。第二種方式叫做反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查。
在需要URL 的地方,對於不同層級,Django 提供不同的工具用於URL 反查:
-
- 在模板中:使用url 模板標簽。
- 在Python 代碼中:使用django.core.urlresolvers.reverse()函數。
- 在更高層的與處理Django 模型實例相關的代碼中:使用get_absolute_url()方法。
例子:
考慮下面的URLconf:
from django.conf.urls import url from . import views urlpatterns = [ #... url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'), #... ]
根據這里的設計,某一年nnnn對應的歸檔的URL是/articles/nnnn/。
你可以在模板的代碼中使用下面的方法獲得它們:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul>
在Python后端的代碼中,這樣使用:
from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
如果出於某種原因決定按年歸檔文章發布的URL應該調整一下,那么你將只需要修改URLconf 中的內容。
在某些場景中,一個視圖是通用的,所以在URL 和視圖之間存在多對一的關系。對於這些情況,當反查URL 時,只有視圖的名字還不夠。
命名URL 模式
為了完成上面例子中的URL 反查,將需要使用命名的URL 模式。URL 的名稱使用的字符串可以包含任何你喜歡的字符。不只限制在合法的Python 名稱。
當命名URL 模式時,請確保使用的名稱不會與其它應用中名稱沖突。如果你的URL 模式叫做comment,而另外一個應用中也有一個同樣的名稱,當你在模板中使用這個名稱的時候不能保證將插入哪個URL。
在URL 名稱中加上一個前綴,比如應用的名稱,將減少沖突的可能。我們建議使用myapp-comment而不是comment。
