Django(一)预热
WSGI
WSGI(Web Server Gateway Interface)web服務器網關接口。它是python下的一個標準,定義了web服務器和web應用或框架之間一種簡單而通用的接口。在python中,它的具體實現是wsgiref模塊。客戶端(瀏覽器)把http請求發送給web服務器,web服務器封裝請求,再把請求發送給web應用,web應用處理請求,通過web服務器,將響應返回給客戶端。
手動實現一個web框架
為了更好的理解web框架,我們來試著手動實現一個簡單的web框架。先寫基本的邏輯:
from wsgiref.simple_server import make_server # 引用類route = {} # 用來存儲url path 和函數的對應關系的路由def deco(name): # 裝飾器,自動添加視圖函數到路由def wrapper(func):route[name] = funcreturn wrapper@deco('/login') def login(request):with open('login.html', 'rb')as f:return [f.read()]@deco('/auth') def auth(request):# environ對象的QUERY_STRING鍵對應用戶提交的用戶名和密碼,我們將它提取出來。login_info = request.get('QUERY_STRING') # user=ayhan&pwd=123user, pwd = login_info.split('&')_, user = user.split('=')_, pwd = pwd.split('=')if user == 'ayhan' and pwd == '123':return [b'login ok!']else:return [b'user or password error']def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])# environ ; 由wsgiref封裝了請求信息的對象。# start_response響應頭:狀態碼 + 鍵值對# 最簡單的響應如下,直接返回一個bytes字符串# msg = '<h1>hello world</h1>'# return [msg.encode('utf-8')] # 注意,要加[]# 實際中應該根據用戶的請求,返回不同的響應path = environ.get('PATH_INFO')# 獲取請求路徑,通過它來判斷用戶訪問的路徑,來返回不同的頁面# if path == '/seb':# with open('seb.html','rb')as f:# data = f.read()# return [data]# elif path == '/tom':# pass# else:# return [b'404']# 不用if判斷,用路由來處理請求,調用對應的視圖函數if path in route: # 路由分發res = route[path](environ)return reselse:return [b'404']server = make_server("", 8080, application) # 實例化一個WSGI服務器對象(底層基于socket),監聽ip和端口 # 不寫默認本機ip; 重寫application方法 server.serve_forever() # 運行服務器,調用application將上述代碼用包和模塊的方式組織起來,就是一個簡單的框架:
程序主邏輯 bin.py如下:
視圖函數如下:
route = {} # 用來存儲url path 和函數的對應關系的路由def deco(name): # 裝飾器,自動添加視圖函數到路由def wrapper(func):route[name] = funcreturn wrapper@deco('/login') def login(request):with open('templates/login.html', 'rb')as f:return [f.read()]@deco('/auth') def auth(request):# environ對象的QUERY_STRING鍵對應用戶提交的用戶名和密碼,我們將它提取出來。login_info = request.get('QUERY_STRING') # user=ayhan&pwd=123user, pwd = login_info.split('&')_, user = user.split('=')_, pwd = pwd.split('=')if user == 'ayhan' and pwd == '123':return [b'login ok!']else:return [b'user or password error']這樣,一個簡單的web框架就完成了,只需添加視圖函數和模板,就可以可擴展其功能。
初識Django
Django是用python開發的一個開源web框架。有了它,我們可以專注于編寫清晰、易維護的代碼。
1 創建項目
在終端輸入如下命令,可以創建一個項目:
django-admin startproject project_name,項目名可以自定義,這里我們創建一個名為myweb的項目,創建完成后,可以看到如下的目錄結構:
項目名根目錄下分別有manage.py和一個全局文件夾myweb:
- manage.py 命令行工具,用來與Django進行交互
- __init__.py python包文件
- settings.py 配置文件
- urls.py 路由分發,定義了url訪問路徑與視圖函數的映射關系
- wsgi.py 網關文件,部署服務器用
Django內建了一個輕量級web服務器,僅供開發使用。它同一時間只能處理一次請求,且沒有安全審計。因此在生成環境中,還是要部署Apache或Nginx這類專業的web服務器。
現在我們在終端通過命令來啟動這個開發服務器:
python manage.py runserver [ip] [port]
如果不指定ip和端口,默認運行在本機的8000端口。通過瀏覽器訪問http://127.0.0.1:8000/時,將看到一個默認頁面。那是因為我們還沒有創建任何應用并設置路由。下面我們就為這個項目創建一個應用。
2 創建應用
切換到到項目的根目錄下,輸入如下命令:
python manage.py startapp app_name
這里,我創建一個名為blog的應用。項目根目錄下將生成一個以blog命名的新目錄。我們在該目錄下手動新建一個templates文件夾,用來存放html模板。
打開全局文件夾myweb下的setting.py,將新創建的blog應用添加到INSTALLED_APPS中。Django在尋找應用模板,及執行數據庫遷移等操作,都要以這步為前提:
3 定義視圖函數
views.py中的定義的函數是實現應用的具體業務邏輯,這些函數統稱為視圖函數。現在我們來定義一個視圖函數,用它來返回首頁內容。并在template文件夾下建立一個index.html文件,編輯內容<h1>Welcome to index page!</h1>。
from django.shortcuts import renderdef index(request):"""該視圖函數用來返回首頁的內容:param request: 請求對象:return: 返回由render函數渲染的html模板并返回的http響應"""return render(request, 'index.html')4 url映射
我們知道用戶通過url訪問網站,不同的url應該調用不同的視圖函數,這樣才能正確處理用戶的請求,并返回響應內容。現在我們為剛剛定義的index視圖函數添加url映射關系。
修改myweb文件夾下的urls.py文件,添加url與映射。
這里簡單說下一個url的構成:
5 啟動服務
python manage.py runserver [ip] [port] 比如:python manage.py runserver 192.168.16.2:8000 。注意訪問時可能會提示DisallowedHost,解決方案:編輯項目settings.py 中的ALLOWED_HOSTS = ['*']即可。
我們在創建項目時已經啟動了服務,Django會檢測代碼更改并自動重啟服務。如果有必要,可以ctl + c退出,然后重啟服務。現在我們試著訪問http://127.0.0.1/index,將看到首頁:
總結
以上是生活随笔為你收集整理的Django(一)预热的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 各种系统文件目录 临时,缓存,d
- 下一篇: java乱码