對於全部的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。html
下面利用socket實現一個簡單的web框架:python
#!/usr/bin/env python #coding:utf-8 import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, Seven") 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()
而對於真實開發中的python web程序來講,通常會分爲兩部分:服務器程序和應用程序。服務器程序負責對socket服務器進行封裝,並在請求到來時,對請求的各類數據進行整理。應用程序則負責具體的邏輯處理。爲了方便應用程序的開發,就出現了衆多的Web框架,例如:Django、Flask、web.py 等。不一樣的框架有不一樣的開發方式,可是不管如何,開發出的應用程序都要和服務器程序配合,才能爲用戶提供服務。這樣,服務器程序就須要爲不一樣的框架提供不一樣的支持。這樣混亂的局面不管對於服務器仍是框架,都是很差的。對服務器來講,須要支持各類不一樣框架,對框架來講,只有支持它的服務器才能被開發出的應用使用。這時候,標準化就變得尤其重要。咱們能夠設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準,那麼他們就能夠配合使用。一旦標準肯定,雙方各自實現。這樣,服務器能夠支持更多支持標準的框架,框架也可使用更多支持標準的服務器。linux
WSGI(Web Server Gateway Interface)是一種規範,它定義了使用python編寫的web app與web server之間接口格式,實現web app與web server間的解耦。web
python標準庫提供的獨立WSGI服務器稱爲wsgiref。sql
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return '<h1>Hello, web!</h1>' if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print "Serving HTTP on port 8000..." httpd.serve_forever()
全部的web框架都是在此基礎上進行擴展補充的。shell
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。數據庫
mtv是相似的模型框架。django
MVC:Model、View、Controllerjson
MTV:Model、Template、View設計模式
Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MVC的軟件設計模式,即模型M,視圖V和控制器C。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容爲主的網站的,便是CMS(內容管理系統)軟件。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。
Django是一個基於MVC構造的框架。可是在Django中,控制器接受用戶輸入的部分由框架自行處理,因此 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),稱爲 MTV模式。它們各自的職責以下:
模型(Model),即數據存取層
處理與數據相關的全部事務: 如何存取、如何驗證有效性、包含哪些行爲以及數據之間的關係等。
模板(Template),即表現層
處理與表現相關的決定: 如何在頁面或其餘類型文檔中進行顯示。
視圖(View),即業務邏輯層
存取模型及調取恰當模板的相關邏輯。模型與模板之間的橋樑。
基本結構:
│ db.sqlite3 ----------sqlie3數據庫 │ manage.py │ ├─logres │ │ admin.py 後臺,能夠用不多量的代碼就擁有一個強大的後臺。 │ │ apps.py │ │ models.py 與數據庫操做相關,存入或讀取數據時用到這個 │ │ tests.py │ │ urls.py │ │ views.py │ │ 處理用戶發出的請求,從urls.py中對應過來, 經過渲染templates中的網頁能夠將顯示 │ │ 內容好比登錄後的用戶名,用戶請求的數據,輸出到網頁。 │ │ __init__.py │ │ │ ├─migrations │ │ 0001_initial.py │ │ __init__.py │ │ │ │ ├─Mushishi │ │ settings.py Django 的設置,配置文件,好比 DEBUG 的開關,靜態文件的位置等 │ │ urls.py urls.py │ │ 網址入口,關聯到對應的views.py中的一個函數(或者generic類), │ │ 訪問網址就對應一個函數。 │ │ wsgi.py wsgi有多重一種uwsgi和wsgi,你用那種wsgi來運行Django, 通常不用改只有你用到的時候在改 │ │ __init__.py │ │ ├─static └─templates templates中的Html模板, index.html login.html regist.html
1.window 使用pycharm安裝 過程略 2.window上使用pip安裝 pip install django 3.linux下使用pip安裝 yum install python-pip pip install django=1.9.5 4.檢查是否安裝成功 >>> import django >>> django.VERSION
1.建立django命令 django-admin.py startproject project-name(你工程的名字) 2.建立django的app python manage.py startapp app-name(你app的名字) 或 django-admin.py startapp app-name(你app的名字) 3.同步數據庫 python manage.py syncdb 注意:Django 1.7.1及以上的版本須要用如下命令 python manage.py makemigrations python manage.py migrate 4.調試模式 python manage.py runserver 8001 #監聽全部可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址) python manage.py runserver 0.0.0.0:8000 5.清除數據庫 python manage.py flush 6.建立超級管理員 python manage.py createsuperuser 按照提示就ok 7.修改管理員密碼 python manage.py changepassword username(你當時設定的用戶名) 8.導入和導出數據 python manage.py dumpdata appname > appname.json python manage.py loaddata appname.json 9.進入數據庫 python manage.py dbshell 10.更多命令 python manage.py
建立一個project工程
首先點擊 file-newproject而後按照如圖所示建立一個工程
執行完目錄結構以下:
目錄解釋以下:
hello -- 自定義的工程名稱
--settings.py 主配置文件
--urls url路由文件
--wsgi 網絡通訊接口
teplates html文件存放歸檔
接下來開始建立 app
以下在pychrom下的terminal中執行
$ python3 manage.py startapp helloworld
$
這時的目錄結構以下:
編寫路由規則:
路由規則在urls文件裏:添加以下規則
"""hello URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from helloworld import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), #制定路由規則 ]
在views.py
from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse def index(request): return HttpResponse("Hello world") #
啓動django程序:
而後訪問:
http://127.0.0.1:8000/index/
。。