Django 框架篇: 一. Django介绍; 二. 安装; 三. 创建项目;
Django介紹
? 一. web框架:
? 框架,即framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞臺來做表演。
對于所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。
import socketdef handle_request(client):buf = client.recv(1024)client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8")) client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8")) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8001)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()????? 最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,接收用戶請求,從文件中讀取HTML,返回。
如果要動態生成HTML,就需要把上述步驟自己來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,如果我們自己來寫這些底層代碼,還沒開始寫動態HTML呢,就得花個把月去讀HTTP規范。
????? 正確的做法是底層代碼由專門的服務器軟件實現,我們用Python專注于生成HTML文檔。因為我們不希望接觸到TCP連接、HTTP原始請求和響應格式,所以,需要一個統一的接口,讓我們專心用Python編寫Web業務。
這個接口就是WSGI:Web Server Gateway Interface。
------------------------Do a web? framework ourselves----------------------
step 1:
from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>'] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') # 開始監聽HTTP請求: httpd.serve_forever()?
注意:
整個application()函數本身沒有涉及到任何解析HTTP的部分,也就是說,底層代碼不需要我們自己編寫, 我們只負責在更高層次上考慮如何響應請求就可以了。application()函數必須由WSGI服務器來調用。有很多符合WSGI規范的服務器,我們可以挑選一個來用。Python內置了一個WSGI服務器,這個模塊叫wsgiref application()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數://environ:一個包含所有HTTP請求信息的dict對象;//start_response:一個發送HTTP響應的函數。在application()函數中,調用:start_response('200 OK', [('Content-Type', 'text/html')]) 就發送了HTTP響應的Header,注意Header只能發送一次,也就是只能調用一次start_response()函數。 start_response()函數接收兩個參數,一個是HTTP響應碼,一個是一組list表示的HTTP Header,每 個Header用一個包含兩個str的tuple表示。 通常情況下,都應該把Content-Type頭發送給瀏覽器。其他很多常用的HTTP Header也應該發送。 然后,函數的返回值b'<h1>Hello, web!</h1>'將作為HTTP響應的Body發送給瀏覽器。 有了WSGI,我們關心的就是如何從environ這個dict對象拿到HTTP請求信息,然后構造HTML, 通過start_response()發送Header,最后返回Body。?
?? 二. MVC和MTV模式:
Django的MTV模式本質是各組件之間為了保持松耦合關系,Django的MTV分別代表:
? ? ? ? Model(模型):負責業務對象與數據庫的對象(ORM)
? ? ? ? Template(模版):負責如何把頁面展示給用戶
? ? ? ? View(視圖):負責業務邏輯,并在適當的時候調用Model和Template
? ? ? ? 此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template
?
?? 三. 服務器程序和應用程序:
對于真實開發中的python web程序來說,一般會分為兩部分:服務器程序和應用程序。
服務器程序負責對socket服務端進行封裝,并在請求到來時,對請求的各種數據進行整理。
應用程序則負責具體的邏輯處理。為了方便應用程序的開發,就出現了眾多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的開發方式,但是無論如何,開發出的應用程序都要和服務器程序配合,才能為用戶提供服務。
?
這樣,服務器程序就需要為不同的框架提供不同的支持。這樣混亂的局面無論對于服務器還是框架,都是不好的。對服務器來說,需要支持各種不同框架,對框架來說,只有支持它的服務器才能被開發出的應用使用。
這時候,標準化就變得尤為重要。我們可以設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準,那么他們就可以配合使用。一旦標準確定,雙方各自實現。這樣,服務器可以支持更多支持標準的框架,框架也可以使用更多支持標準的服務器。
WSGI(Web Server Gateway Interface)就是一種規范,它定義了使用Python編寫的web應用程序與web服務器程序之間的接口格式,實現web應用程序與web服務器程序間的解耦。
常用的WSGI服務器有uwsgi、Gunicorn。而Python標準庫提供的獨立WSGI服務器叫wsgiref,Django開發環境用的就是這個模塊來做服務器。
?
從這繼續...
wsgiref:
我們利用wsgiref模塊來替換我們自己寫的web框架的socket server部分:
""" 根據URL中不同的路徑返回不同的內容--函數進階版 返回HTML頁面 讓網頁動態起來 wsgiref模塊版 """ from wsgiref.simple_server import make_server # 將返回不同的內容部分封裝成函數 def index(url): # 讀取index.html頁面的內容 with open("index.html", "r", encoding="utf8") as f: s = f.read() # 返回字節數據 return bytes(s, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") def timer(url): import time with open("time.html", "r", encoding="utf8") as f: s = f.read() s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S")) return bytes(s, encoding="utf8") # 定義一個url和實際要執行的函數的對應關系 list1 = [ ("/index/", index), ("/home/", home), ("/time/", timer), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 設置HTTP響應的狀態碼和頭信息 url = environ['PATH_INFO'] # 取到用戶輸入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()?
jinja2:
上面的代碼實現了一個簡單的動態,我完全可以從數據庫中查詢數據,然后去替換我html中的對應內容,然后再發送給瀏覽器完成渲染。 這個過程就相當于HTML模板渲染數據。 本質上就是HTML內容中利用一些特殊的符號來替換要展示的數據。 我這里用的特殊符號是我定義的,其實模板渲染有個現成的工具:?jinja2
下載jinja2:
pip install jinja2 ?index2.html文件使用jinja2渲染index2.html文件:
from wsgiref.simple_server import make_server from jinja2 import Template def index(url): # 讀取HTML文件內容 with open("index2.html", "r", encoding="utf8") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({'name': 'alex', 'hobby_list': ['抽煙', '喝酒', '燙頭']}) # 把數據填充到模板中 return bytes(ret, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") # 定義一個url和實際要執行的函數的對應關系 list1 = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 設置HTTP響應的狀態碼和頭信息 url = environ['PATH_INFO'] # 取到用戶輸入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()?
現在的數據是我們自己手寫的,那可不可以從數據庫中查詢數據,來填充頁面呢?
使用pymysql連接數據庫:
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select name, age, department_id from userinfo") user_list = cursor.fetchall() cursor.close() conn.close()創建一個測試的user表:
CREATE TABLE user(id int auto_increment PRIMARY KEY,name CHAR(10) NOT NULL,hobby CHAR(20) NOT NULL )engine=innodb DEFAULT charset=UTF8;?
模板的原理就是字符串替換,我們只要在HTML頁面中遵循jinja2的語法規則寫上,其內部就會按照指定的語法進行相應的替換,從而達到動態的返回內容。
?
?安裝
?Django官方下載地址:https://www.djangoproject.com/download/
命令行語句下載:
pip3 install django==1.11.15若 pip 下載失敗, 卸載pip 從官網重新下載官網地址:https://pypi.org/project/pip/
?
?創建項目
?? 1、菜單欄 File——>New Project...
填寫項目保存位置、應用名稱。
?? 2、更改setting.py?
將?'django.middleware.csrf.CsrfViewMiddleware'注釋掉,否則會出現下面的情況。
?
? ? 3、settings.py中的templates 中的DIRS需要檢查下是否為空,如果為空,添加上os.path.join(BASE_DIR,'templates')。
這是模板中沒有設置,設置模板找到如下圖的路徑,打開settings.py-tpl,相同位置添加上上os.path.join(BASE_DIR,'templates')。下次創建項目就可不再手動添加。
?? 4、templates文件夾下創建HTML文件。
?? 5、編輯urls.py文件,增加映射關系。
?? 6、編輯views.py,添加視圖處理函數。
?? 7、terminal中輸入 python manage.py runserver IP:PORT ?啟動服務
?
?? 8、局域網中的瀏覽器輸入HTTP://IP:PORT/login 就可訪問驗證。
?
相關命令
?
1、創建一個django project
django-admin startproject mysite?當前目錄下會生成mysite的工程,目錄結構如下:
? ? ????
- manage.py?-----?Django項目里面的工具,通過它可以調用django?shell和數據庫等。
- settings.py?----?包含了項目的默認設置,包括數據庫信息,調試標志以及其他一些工作的變量。
- urls.py?-----?負責把URL模式映射到應用程序。
2、在mysite目錄下創建應用,比如blog:
python manage.py startapp blog? ? ????
3、啟動django項目
python manage.py runserver 8080? ? ? ?這樣我們的django就啟動起來了!當我們訪問:http://127.0.0.1:8080/時就可以看到:
? ? ? ?
4、同步更改數據庫表或字段
'''python manage.py syncdb注意:Django 1.7.1 及以上的版本需要用以下命令python manage.py makemigrationspython manage.py migrate'''這種方法可以創建表,當你在models.py中新增了類時,運行它就可以自動在數據庫中創建表了,不用手動創建。
5、清空數據庫
python manage.py flush?此命令會詢問是 yes 還是 no, 選擇 yes 會把數據全部清空掉,只留下空表。
6、創建超級管理員
'''python manage.py createsuperuser# 按照提示輸入用戶名和對應的密碼就好了郵箱可以留空,用戶名和密碼必填# 修改 用戶密碼可以用:python manage.py changepassword username'''7、Django 項目環境終端
python manage.py shell這個命令和 直接運行 python 進入 shell 的區別是:你可以在這個 shell 里面調用當前項目的 models.py 中的 API,對于操作數據的測試非常方便。
8、Django 項目環境終端
ython manage.py dbshellDjango 會自動進入在settings.py中設置的數據庫,如果是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。
在這個終端可以執行數據庫的SQL語句。如果您對SQL比較熟悉,可能喜歡這種方式。
9、更多命令
python manage.py?查看所有的命令,忘記子名稱的時候特別有用。
10 static配置
#3、STATIC文件還可以配置STATICFILES_DIRS,指定額外的靜態文件存儲位置。# STATIC_URL的含義與MEDIA_URL類似。# ---------------------------------------------------------------------------- #注意1: #為了后端的更改不會影響前端的引入,避免造成前端大量修改 STATIC_URL = '/static/' #引用名 STATICFILES_DIRS = ( os.path.join(BASE_DIR,"statics") #實際名 ,即實際文件夾的名字 ) #django對引用名和實際名進行映射,引用時,只能按照引用名來,不能按實際名去找 #<script src="/statics/jquery-3.1.1.js"></script> #------error-----不能直接用,必須用STATIC_URL = '/static/': #<script src="/static/jquery-3.1.1.js"></script> #注意2(statics文件夾寫在不同的app下,靜態文件的調用): STATIC_URL = '/static/' STATICFILES_DIRS=( ('hello',os.path.join(BASE_DIR,"app01","statics")) , ) #<script src="/static/hello/jquery-1.8.2.min.js"></script> #注意3: STATIC_URL = '/static/' {% load staticfiles %} # <script src={% static "jquery-1.8.2.min.js" %}></script>轉載于:https://www.cnblogs.com/123zzy/p/9772853.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Django 框架篇: 一. Django介绍; 二. 安装; 三. 创建项目;的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node相关内容
- 下一篇: 微信小程序封装storage(含错误处理