WeChat Official Account Alan 2. django
Contents
overview
- First of all, do you know how to pronounce “Django”?
Django 的名字來源於一個吉普賽爵士吉他手的名字Django Reinhardt,至今為止,他被認為是世界上最棒的吉他手之一。
/ˈdʒæŋɡo/
django – “重量級”.
django用python 寫成, MVC 模式(or MTV)
Django的理念是DRY(Don’t Repeat Yourself).
references
Django basic frame
- manage.pyy & django-admin.pyy
- 這兩個檔案程式碼和包含命令基本是一樣的,只不過django-admin.py一般只用來建立專案,而manage.py用來管理建立好了的專案。
- 常見命令的使用,比如建立專案,建立應用,建立超級使用者,資料表建立及更新,啟動伺服器等都包含在django-admin.py和manage.py裡.
更詳細
- urls.pyy
網址入口,關聯到對應的views.py中的一個函式(或者generic類),訪問網址就對應一個函式。 - views.pyy
處理使用者發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示內容. - models.pyy
models.pyy 決定了資料庫長什麼樣. - forms.pyy
form.py是Django用來生成form表單程式碼和驗證表單資料是否合法的一個檔案, 可以在該檔案中建立Form類, 實現自定義表單的功能
from django import forms
- templates directory
views.pyy 中的函式渲染templates中的Html模板 - settings.pyy
Django 的設定,配置檔案,比如 DEBUG 的開關,靜態檔案的位置等。
- __file__ 這個變數可以獲取到當前檔案路徑。os.path.dirname(file) 得到檔案所在目錄,再來一個os.path.dirname()就是目錄的上一級,用一個變數儲存這個路徑,可移植性更好.
- DEBUG = True // 部署時就不要讓使用者瞅見bug
- ALLOWED_HOSTS 哪些域名可以訪問,即使在 Apache 或 Nginx 等中綁定了,這裡不允許的話,也是不能訪問的。
當 DEBUG=False 時,這個為必填項,如果不想輸入,可以用 ALLOW_HOSTS = [’*’] 來允許所有的。- 一般來說我們只要把靜態檔案放在 APP 中的 static 目錄下,部署時用 python manage.pyy collectstatic 就可以把靜態檔案收集到(複製到) STATIC_ROOT 目錄. 也可以用STATICFILES_DIRS =()來設定.
- admin.pyy
admin.pyy與後臺相關,只需少許程式碼就可以實現強大的功能. - requirements.txt
執行pip install -r requirements.txt 就可以自動安裝requirements.txt檔案制定的所有包及版本. %這是一個很好的方式%
FBI Warning : 是在shell中哦~
基本命令
FBI Warning: 是在shell中, 不是python中.
- 新建專案 startproject
django-admin.pyy startproject project_name
特別是在 windows 上,如果報錯,嘗試用 django-admin 代替 django-admin.pyy 試試
如果執行成功,會自動生成一些檔案目錄, e.g. manage.pyy, urls.pyy,settings.pyy.
- 新建app startapp
python manage.pyy startapp app_name
或 django-admin.pyy startapp app_name
- django-admin.pyy 是安裝Django後多出的一個命令,並不是執行的當前目錄下的django-admin.pyy(當前目錄下也沒有).
一般一個專案有多個app,一個應用也可以用在多個專案中.
如果執行成功,會在專案目錄下生成一個app_name directory.
然後把新定義的app加到settings.py中的INSTALL_APPS中.- 新建的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板檔案(app-name/templates/下的檔案)和靜態檔案(app-name/static/中的檔案)
- 建立or更改資料庫
python manage.pyy makemigrations // 建立更改的檔案
python manage.pyy migrate // 將生成的py檔案應用到資料庫 - 使用開發伺服器 runserver
開發伺服器,即開發時使用,一般修改程式碼後會自動重啟,方便除錯和開發,但是由於效能問題,建議只用來測試,不要用在生產環境。
python manage.py runserver
# 當提示埠被佔用的時候,可以用其它埠:
python manage.py runserver 8001
# 監聽機器所有可用 ip (電腦可能有多個內網ip或多個外網ip)
python manage.py runserver 0.0.0.0:8000
# 如果是外網或者區域網電腦上可以用其它電腦檢視開發伺服器
# 訪問對應的 ip加埠,比如 http://172.16.20.2:8000
View
定義檢視函式相關的URL(網址) i.e. 檢視函式<–mapping–>URL.
urls.pyy is different in different Django versions .
template
%最簡單的django.http.HttpResponse 來把內容顯示到網頁上%,但是要真的做個東西出來,當然得用模板渲染了.
預設配置下,Django 的模板系統會自動找到app下面的templates資料夾中的模板檔案。
Django 模板查詢機制
Django 查詢模板的過程是在每個 app 的 templates 資料夾中找,各個 app 的 templates 形成一個資料夾列表,Django 遍歷這個列表,一個個資料夾進行查詢,當在某一個資料夾找到的時候就停止,所有的都遍歷完了還找不到指定的模板的時候就是 Template Not Found (過程類似於Python找包)。Hence , 一個app可以用另一個app的模板檔案.
template 中迴圈/條件判斷/標籤/過濾器
- list 列表
mylist=["1","b"] // may be defined in views.pyy
{%for i in mylist%}
{{i}}
{% endfor %}
usage: {{var}} {%label%} (for --> endfor)
獲取當前使用者: {{ request.user }}
獲取當前網址: {{ request.path }}
獲取當前GET引數:{{ request.GET.urlencode }}
- dict 字典
{% for key, value in info_dict.items %} # in .html file
{{ key }}: {{ value }}
{% endfor %}
- ==, !=, >=, <=, >, < 這些比較都可以在模板中使用
and, or, not, in, not in 也可以在模板中使用
{% if num <= 100 and num >= 0 %}
num在0到100之間
{% else %}
數值不在範圍之內!
{% endif %}
Model
Model is related to database ;
與資料庫相關的程式碼一般寫在 models.pyy 中,只需要在settings.py中配置即可,不用更改models.py中的程式碼,豐富的API極大的方便了使用。
修改資料表
Django 1.7.x 及以後的版本集成了 South 的功能,在修改models.py了後執行:
# makemigrations會在當前目錄下生成一個migrations資料夾,該資料夾的內容就是資料庫要執行的內容
python manage.py makemigrations
#migrate就是執行之前生成的migrations檔案,這一步才是操作資料庫的一步
python manage.py migrate
Django每次更新模型都需要執行以上兩步,Django模型增加內容需要設定變數的初始值,否則會在第一步出現問題.
QuerySet API
從資料庫中查詢出來的結果一般是一個集合,這個集合叫做 QuerySet。
靜態檔案
靜態檔案放在對應的 app 下的 static 資料夾中 或者 STATICFILES_DIRS 中的資料夾中。
部署
- 收集靜態檔案
#把以前放在app下static中的靜態檔案全部拷貝到 settings.pyy 中設定的 STATIC_ROOT 資料夾中
python manage.pyy collectstatic
2 use nginx or apache2
nginx + uwsgi socket 的方式來部署 Django 更主流.
test
Django中有完善的單元測試,我們可以對開發的每一個功能進行單元測試,這樣只要執行一個命令python manage.pyy test,就可以測試功能是否正常.