是一個爲完美主義者設計的web框架html
The web framework for perfectionists with deadlines.python
Django可使你可以用更少的代碼,更加輕鬆且快速去開發web應用。web
Django makes it easier to build better Web apps more quickly and with less code.面試
下面這段太長了,有請百度翻譯:sql
Django是一個高級python web框架,它鼓勵快速開發和乾淨、實用的設計。由經驗豐富的開發人員構建,解決了許多web開發的麻煩,所以你能夠專一於編寫你的應用程序,而無需從新造輪子。它是免費且開源的。數據庫
Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of Web development, so you can focus on writing your app without needing to reinvent the wheel. It’s free and open source.django
說人話:flask
參考:http://www.javashuo.com/article/p-qlmpimbx-do.htmlapi
計算機名不能是中文瀏覽器
文件的命名儘可能也不要用中文
若是是中文可能會引發 encoding 編碼報錯
一個pycharm窗口只能有一個項目,不要把多個項目項目放在一個窗口下
注意 django 的版本問題...(下面有展開說明)
起了一個django項目後,必定要注意端口
想起多個django項目,要記得更換端口(防止端口衝突)
# 計算機名不能有中文
# Django版本問題
不一樣版本的django固然有所不一樣,爲了防止出現意外bug,最好使用同一版本(行業潛規則:不要嘗試最新版本)
下文以 1.11.11 版本展開,版本不一樣可能會有不一樣的問題
下載安裝仍是須要一點點時間的,能夠考慮使用國內的 pip源
下面的安裝方式選一個便可
pip3 install django==1.11.11(1.11.11是版本號)
必定要記得選你須要的版本
在命令行敲入以下命令便可(在安裝 django時就已經自動給咱們配置過環境變量了,因此這裏能夠直接在命令行敲)
django-admin
返回相似下面的一堆信息就是安裝成功了
django-admin startproject project_name(項目名)
先切換到項目要存放的目錄再創,一個應用(app)對應一起獨立的功能
命令:
django-admin startapp app01(應用名) 或 python manage.py startapp app01(應用名)
要切到項目根目錄下(否則找不到這個 manage.py 文件)
python manage.py runserver
#注意 用命令行建立 django 項目不會自動新建 templates 模板文件夾,須要你本身手動建立,而且須要你本身去 settings.py 文件中註冊該文件路徑
創項目時能夠創一個應用(app),後續經過命令行建立其餘的
#命令行(要掌握,可能面試會讓手寫 ****) python manage.py startapp app02
建立的應用(app)必定要在 settings 裏 註冊(添加記錄)才能生效(前面那些 django開頭的是 django 項目自帶的 app)
pycharm建立項目時的那個app會自動配進來
命令行裏建立的應用(app)都須要來這裏配置上去 (*****)
點綠色箭頭便可啓動項目
若是命令行啓動項目沒問題,而 pycharm 啓動啓動不了請注意 python 解釋器是否選對,我有朋友就是選成了 pythonw,致使 django 項目在 pycharm 裏面跑不起來
必定要把錯誤的給刪掉,不然下一次仍是默認使用第一個的
+項目根目錄 +應用文件夾(app01) +migrations 文件夾 數據庫遷移記錄 -admin.py django後臺管理 -apps.py 應用註冊相關 -models.py orm表模型類 -tests.py 測試文件 -views.py 視圖函數/類 +與項目名同名的文件夾 -settings.py django暴露給用戶可配置的文件 -urls.py 路由文件,配置路由與視圖函數對應關係 -wsgi.py +templates 頁面模板文件夾,通常放待渲染數據的html頁面 -test.html 待渲染數據的頁面(使用django自帶的模板語法去渲染) -mange.py django的入口文件
這裏只截取了部分代碼做介紹
# ...其餘代碼... # Application definition # 新建立的應用(app)必定要來這裏添加(註冊)纔有效 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 'app01.apps.App01Config', # pycharm建立項目時會自動把那個app在這裏註冊了 'app01', # 註冊 命令行建立的app01,加到這裏來 完整寫法: 'app01.apps.App01Config', 'app02', # 註冊 命令行建立的app02,加到這裏來 完整寫法: 'app02.apps.App01Config', ] # django中間件 django的門戶 保安 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'myfirstdjangodemo.urls' # 模板文件配置相關 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'myfirstdjangodemo.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases # 數據庫相關 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # ...其餘代碼...
前提:這一塊開始默認 django 項目的已經建立好了
三板斧:
HttpResponse: 用來返回字符串給頁面
render: 返回html頁面而且可以給該頁面傳值
redirect: 重定向,返回指定的頁面html(瀏覽器能夠看到302狀態碼)
強調:每新添加一個功能都應該在路由文件 urls.py中添加一個路由與視圖的對應關係(請求路徑的時候纔有對應的 視圖函數/類 去處理)
最簡單的步驟:
先建立app
配置路由(路由與視圖函數的對應關係)
寫視圖函數(要用到 HttpResponse, redirect,記得本身導過來)
編寫模板頁面
first_django_project/urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views # 導入視圖函數文件 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), # 新添加的路由, index 瀏覽器端口後面的地址 --> 127.0.0.1地址:8000端口/index, views.index 輸入前面地址時將要執行的函數 ]
app01/views.py
from django.shortcuts import render, HttpResponse, redirect # 引入 HttpResponse(直接返回字符串並打包成響應體返回) 和 redirect(重定向頁面) # Create your views here. # index 路由對應的視圖函數,這裏用 HttpResponse 返回一個字符串 def index(request): return HttpResponse('<h1>Hello, this is Index!</h1>') # 能夠返回html標籤,瀏覽器依舊會渲染效果
127.0.0.1:8000/index/
first_django_project/urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views # 導入視圖函數文件 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), # 新添加的 登陸路由 與 對應的視圖函數 ]
新建頁面
templates/login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>這是登陸頁面</h1> {# django的模板語法(支持字典 點語法取值 dic.key,但不支持字典的原生語法,這一點不如jinja2(模板引擎語法,通常和flask框架搭配使用) 強大!) #} <h3>{{ user_dict.username }}</h3> </body> </html>
添加視圖函數
app01/views.py
from django.shortcuts import render, HttpResponse, redirect # 引入 HttpResponse(直接返回字符串並打包成響應體返回) 和 redirect(重定向頁面) # Create your views here. def index(request): return HttpResponse('<h1>Hello, this is Index!</h1>') # login 路由對應的視圖函數,這裏用 render 返回 html 格式的頁面字符串 def login(request): user_dict = { # 模擬後臺處理好的數據 "username": "jason" } # login.html 這裏不須要加上templates 文件夾,已經作過配置了,會自動找到的 # return render(request, 'login.html') # 可什麼數據都不帶 # {"user_dict": user_dict} 包裝成響應體返回, 鍵"user_dict"在模板中能夠拿到 return render(request, 'login.html', {"user_dict": user_dict})
first_django_project/urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views # 導入視圖函數文件 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), url(r'^home/', views.home), # 新添加的 home 路由 與 對應的視圖函數(這裏是演示重定向,直接跳轉到 login路由去處理) ] 配置視圖
from django.shortcuts import render, HttpResponse, redirect # 引入 HttpResponse(直接返回字符串並打包成響應體返回) 和 redirect(重定向頁面) # Create your views here. def index(request): return HttpResponse('<h1>Hello, this is Index!</h1>') def login(request): user_dict = { "username": "jason" } return render(request, 'login.html', {"user_dict": user_dict}) def home(request): # home 路由對應的視圖函數 print("----> 請求home 路徑,進入到了 home的路由函數...") return redirect('/login/')
剛在後臺打印了一句話,看看有沒有