目錄css
衆所周知,全部的Web應用基本都是基於B/S結構,其本質上其實就是一個socket服務端(web服務器),一個socket客戶端(用戶瀏覽器)。下面的代碼就是一個簡單的web端,運行後,使用瀏覽器訪問,會打印hello worldhtml
#!/usr/bin/env python #_*_coding:utf-8_*_ import socket def handle_request(client): buf = client.recv(1024) client.send(b"HTTP/1.1 200 OK\r\n\r\n") client.send(b"Hello, world") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8000)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
上述代碼經過socket實現了web服務端的本質,而對於真實開發中的Python Web程序來講,通常會分爲兩部分:服務器程序和應用程序。前端
爲了方便應用程序的開發,就出現了衆多的Web框架,例如:Django、Flask、web.py 等。不一樣的框架有不一樣的開發方式,可是不管如何,開發出的應用程序都要和服務器程序配合,才能爲用戶提供服務。這樣,服務器程序就須要爲不一樣的框架提供不一樣的支持。這樣混亂的局面不管對於服務器仍是框架,都是很差的。對服務器來講,須要支持各類不一樣框架,對框架來講,只有支持它的服務器才能被開發出的應用使用。這時候,標準化就變得尤其重要。咱們能夠設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準,那麼他們就能夠配合使用。一旦標準肯定,雙方各自實現。這樣,服務器能夠支持更多支持標準的框架,框架也可使用更多支持標準的服務器。python
WSGI全稱爲:The Python Web Server Gateway Interface,單從名字來看就是一種網關,而網關的做用就是在協議之間進行轉換。
WSGI是爲 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口,是一種規範,定義了使用Python編寫的Web app與Web server之間接口格式,實現web app與web server間的解耦。mysql
Python標準庫提供的獨立WSGI服務器稱爲wsgiref。nginx
# 利用wsgiref完成上面簡單的web服務程序 from wsgiref.simple_server import make_server def RunServer(environ, start_response): # environ 存放的是用戶訪問時提交的信息,包涵http header等 start_response('200 OK', [('Content-Type', 'text/html')]) # 構建http response頭部信息 return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] # 返回給用戶的信息,注意是 bytes 格式。 if __name__ == '__main__': httpd = make_server('', 8000, RunServer) # 啓動一個服務,監聽8000端口,請求進來交給RunServer函數處理 print("Serving HTTP on port 8000...") httpd.serve_forever() # 啓動服務開始接受請求
說到web開發,就須要遵循必定的開發模式。著名的MVC/MTV模式,其本質是使各組件之間保持鬆耦合關係。web
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程序的模式正則表達式
MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的徹底控制。sql
MTV是一種使用MTV(Model Templates Views 模型-模版-視圖)設計建立 Web 應用程序的模式數據庫
此外,Django還有一個url分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理,view再調用相應的Model和Template,邏輯處理以下:
MVC即模型-視圖-控制器模式,就是爲那些須要爲一樣的數據提供多個視圖的應用程序而設計的。它很好地實現了數據層與表示層的分離,特別適用於開發與用戶圖形界面有關的應用程序。控制器用來處理用戶命令以及程序事件;模型維護數據並提供數據訪問方法;視圖用於數據的顯示。
MTV即模型-模版-視圖模式,其標準名稱是有爭議的。在MVC的解釋中,視圖描述了展示給用戶的數據,是指所看到的數據,而不是如何看見它。在python中視圖是指對某一特定URL的回調函數,由於回調函數描述了所要展示的數據。模版用於將內容與展示分離。在django中,視圖描述了要展示的數據,而視圖通常轉交給模版。模版描述了數據如何展示。控制器則是指django框架自己,經過URL配置,系統將一個請求發送到一個合適的視圖。
Django是重量級選手中最有表明性的一位。許多成功的網站和APP都基於Django。是一個開放源代碼的Web應用框架,由Python寫成。遵照BSD版權,初次發佈於2005年7月, 並於2008年9月發佈了第一個正式版本1.0 。
本次選擇djang 1.11.20 版本,進行學習
Django是標準的MTV框架。
下面使用django建立服務端站點,並顯示hello world頁面信息。
使用命令行執行以下命令進行安裝
pip3 install Django==1.11.20
注意:會安裝在python安裝目錄的scripts目錄下。針對多環境的狀況下,使用哪一個解釋器安裝,那麼就會安裝在哪一個版本下。安裝完畢後會在scripts下產生一個django-admin.py文件,利用該文件能夠在命令行下建立一個Django項目。
django-admin.py startproject PEOJECTNAME
建立完畢後:會產生PROJECTNAME命名的文件夾,裏面包含 PROJECTNAME 目錄 和 manager.py文件。
其中:
python manage.py startapp APPNAME
爲何一個項目裏要建立一個應用?舉個例子:微信是一個項目,那麼通信錄,錢包,朋友圈就是一個個相互獨立功能,這裏叫作應用。一個項目是全部應用的集合。
建立一個應用以後會產生同名目錄,目錄下的主要文件功能以下:
views.py 中的函數:必定是來根據用戶輸入的內容來返回一個具體的頁面,wsgi模塊用來負責HTTP協議的解析,而後放在views視圖函數中,做爲一個固定的參數(request)使用。
python manage.py runserver PORT
啓動一個web應用服務,並監聽8800端口,這樣就啓動了一個django項目了,但這是咱們測試時的啓動方式,生產上不會這麼用。
下面來實現一個站點,當咱們訪問時,輸出hello world信息
定義url選擇器是爲了能在用戶輸入url的時候把對應的url映射到指定的views函數中去處理,因此urls.py會存放在項目全局的目錄下。
# urls.py文件 from blog import views # blog爲項目名,導入views模塊 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.index), # 就能夠表示首頁 ]
url的參數:
通過項目的urls控制,那麼請求將會分配給具體的應用(函數)來處理,因此須要在應用的目錄中的views.py文件中進行添加。因爲咱們返回的是靜態頁面,不須要進行數據庫相關的處理,因此在index函數內,能夠直接返回頁面給客戶端。
這裏有兩種方式:
返回html標籤:
# blog/models.py from django.shortcuts import HttpResponse def index(request): return HttpResponse('<h1>hello world</h1>')<br> # 注意:用戶的請求經由wsgi處理後,會返回一個對象標識,通常這裏使用request來接受這個對象。 # HttpResponse 用戶對客戶的相應
返回html文件:
全部的html文件是由Templates來進行處理的,因此須要如今Templates目錄下建立要返回的html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> </body> </html>
對應的models.py修改成
from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') # render,的第一個參數就是request,標識把後面的index文件返回給這個request
答覆的html文件,render會去Templates下尋找,由於在setting.py文件中已經定義了Templates的路徑
在項目目錄下執行
python manage.py runserver 8080
啓動完畢後,使用瀏覽器訪問。
http://127.0.0.1:8080
爲了使咱們的項目依賴的文件放在特定的地方提供訪問,那麼咱們在建立完項目還須要作一些基礎的配置。
靜態文件:好比css,js文件都是要提供給用戶進行下載的,因此咱們通常規定靜態文件,存放在django項目的一級子目錄static中,須要手動建立這個目錄,而後作以下配置。
# 修改settings.py文件 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), # 添加靜態文件路徑 )
用來集中存放用於返回給用戶的模板文件(若是是利用pycharm建立的項目,它會自動幫咱們建立template目錄,並自動進行關聯),建立templates目錄(一樣存放在django項目的一級子目錄下)。
# 修改settings.py文件 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] # 添加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', ], }, }, ]
csrftoken用於防止csrf攻擊,csrf的相關配置將在後面進行說明,因此這裏能夠先關閉csrftoken。
# 修改settings.py文件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 註釋掉csrf中間件便可(須要重啓django項目) 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
django支持MySQL 5.5+ 官方建議使用mysqlclient 1.3.7+ 來驅動,因此這裏須要先安裝
pip install myclient
web站點最重要的數據庫鏈接配置,須要在settings.py中設置所鏈接的數據庫。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎 'NAME': 'blog', # 庫名 'USER': 'dahl', # 數據庫用戶名 'PASSWORD': '123456', # 數據庫密碼 'HOST': '127.0.0.1', # 數據庫地址 'PORT': '3306', # 數據庫端口 } }
支持的數據庫引擎有:
'django.db.backends.postgresql' 'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle'
更多的配置方法參考:https://docs.djangoproject.com/en/1.11/ref/settings/#databases
若是安裝mysqlclient失敗,提示缺乏C++,那麼不建議安裝全部的編譯環境,由於即使是安裝因此,可能沒法編譯成功,因此能夠在一下網站中直接查找現成的whl包。https://www.lfd.uci.edu/~gohlke/pythonlibs/
Django 提供了基於 web 的管理工具即django-admin,它能夠經過web頁面來管理咱們項目中的表,但前提是你已經把表註冊給admin管轄了。
默認狀況下,django-admin是隨django一塊兒安裝的,要使用它,還須要通過如下步驟:
在項目根目錄下執行
python manage.py createsuperuser
按照提示建立django-admin的管理用戶
django-admin須要一些表來處理admin後臺的登陸、認證等信息,因此咱們須要在數據庫中把這些表建立。django的自帶的orm能夠幫咱們完成這項操做,若是你的項目須要建立表,那麼請首先確保項目的配置文件settings.py中的INSTALLAPP列表中包含你的應用名稱
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'user' # 這個就是咱們的應用名稱,注意它的路徑是從項目的頂級目錄開始的 ]
項目本身的models中須要自行編寫數據庫表的映射類,django-admin的映射類已經內置。
執行以下命令生成遷移文件
python manage.py makemigrations
執行完畢後,會在項目目錄下生成migrations目錄,裏面存放的是因此的遷移記錄,不要隨意刪除。
執行以下命令完成表遷移(在數據庫中建立)
python manage.py migrate
當咱們對models.py中的映射類結構進行修改時,那麼每次都須要進行上述兩步操做
注意:
默認狀況下django-admin的後臺管理是英文的,能夠在settings.py文件中修改成中文顯示
# LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-Hans' # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai'
若是想要django-admin管理項目本身的表信息,那麼須要將表註冊給django-admin,那麼就須要在應用目錄下的admin.py中進行以下操做
from django.contrib import admin from user.models import User # 導入models.py中要被管理的類 # Register your models here. admin.site.register(User) # 註冊給amdin
附User表:(models.py中)
class User(models.Model): class Meta: db_table = 'user' id = models.AutoField(primary_key=True) name = models.CharField(max_length=48, null=False) email = models.CharField(max_length=64, unique=True, null=False) password = models.CharField(max_length=128, null=False) def __repr__(self): return '<User {} {}>'.format(self.id, self.name)
這時,從新啓動django,那麼就能夠訪問admin了。(項目根目錄下)
python manage.py runserver 8080
在瀏覽器中輸入127.0.0.1:8080/admim 輸入剛剛建立的superuser便可。