Python之路【第二十七篇】:web服務器django

Django

1、web框架

框架,即時framework,特指爲解決一個開放性問題而設計的具備必定約束性的支撐結構,使用框架能夠幫你快速開發特定的系統,簡單的說,就是用別人搭建好的舞臺來表演你的才藝。html

對於全部的web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。python

import socket

def 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, simon</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業務。web

這個接口就是WSGI:Web Server Gateway Interface.正則表達式

 例子:shell

#_*_ coding:utf-8 _*_
# Author:Simon
# Datetime:2019/9/28 14:39
# Software:PyCharm

from wsgiref.simple_server import make_server


def foo1(): f=open("index1.html","rb") data=f.read() return data def foo2(): f=open("index2.html","rb") data=f.read() return data def application(environ, start_response): print("path",environ["PATH_INFO"]) path=environ["PATH_INFO"] start_response('200 OK', [('Content-Type', 'text/html')]) if path=="/simon": return [foo1()] elif path=="/zhurui": return [foo2()] else: return [b"404"] # return [b'<h1>Hello, web!</h1>']  httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') # 開始監聽HTTP請求: httpd.serve_forever()

模擬web框架:數據庫

#_*_ coding:utf-8 _*_
# Author:Simon
# Datetime:2019/9/28 14:39
# Software:PyCharm

from wsgiref.simple_server import make_server

import time def foo1(req): f=open("index1.html","rb") data=f.read() return data def foo2(req): f=open("index2.html","rb") data=f.read() return data def login(req): print(req["QUERY_STRING"]) return b"welcome!" def signup(req): pass def showtime(req): times=time.ctime() # return ("<h1>time:%s</h1>"%str(times)).encode("utf8") f=open("showtime.html","rb") data=f.read() data=data.decode("utf8") data=data.replace("{{time}}",str(times)) return data.encode("utf8") def router(): url_patterns=[ ("/login",login), ("/signup",signup), ("/zhurui",foo2), ("/simon",foo1), ("/showtime",showtime), ] return url_patterns def application(environ, start_response): print("path",environ["PATH_INFO"]) path=environ["PATH_INFO"] start_response('200 OK', [('Content-Type', 'text/html')]) url_patterns = router() func=None for item in url_patterns: if item[0]==path: func=item[1] break if func: return [func(environ)] else: return [b"404"] # return [b'<h1>Hello, web!</h1>']  httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') # 開始監聽HTTP請求: httpd.serve_forever()

 2、MVC和MTV模式

著名的MVC模式:所謂的MVC就是把web應用分爲模型(M),控制器(C),視圖(V)三層;他們之間以一種插件似的,鬆耦合的方式鏈接在一塊兒。django

模型負責業務對象與數據庫的對象(ORM),視圖負責與用戶的交互(頁面),控制器(C)接收用戶的輸入調用模型和視圖完成用戶的請求。瀏覽器

 

 Djando的MTV模型本質上與MVC模型沒什麼區別,也是各組件之間爲了保持鬆耦合關係,只是定義上有些不一樣,Django的MTV分別表明:服務器

Model(模型):負責業務對象與數據庫的對象(ORM)app

Template(模板):負責如何把頁面展現給用戶

View(視圖):負責業務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個url分發器,它的做用是將一個個URL的頁面請求分給不一樣的view處理,view再調用相應的Model和Template

 

 3、Django的流程和命令行工具

3.1 django流程:

django
    #安裝: pip3 install django
 添加環境變量 #1 建立project django-admin startproject mysite //建立項目 ---mysite ---settings.py ---url.py ---wsgi.py ---- manage.py(啓動文件) #2 建立APP  python mannage.py startapp app01 #3 settings配置  TEMPLATES STATICFILES_DIRS=( os.path.join(BASE_DIR,"statics"), ) STATIC_URL = '/static/' # 咱們只能用 STATIC_URL,但STATIC_URL會按着你的STATICFILES_DIRS去找#4 根據需求設計代碼  url.py view.py #5 使用模版 render(req,"index.html") #6 啓動項目 python manage.py runserver 127.0.0.1:8090 #7 鏈接數據庫,操做數據 model.py

3.2 django的命令行:

django-admin.py 是Django的一個用於管理任務的命令行工具,manage.py是對django-admin.py的簡單包裝,每個Django Project裏都會有一個mannage.py。

<1> 建立一個django工程 : django-admin.py startproject mysite

        當前目錄下會生成mysite的工程,目錄結構以下:

manage.py----------------django項目裏面的工具,經過能夠調用django shell和數據庫等。

settings.py----------------包含項目的默認設置,包含數據庫信息,調試標緻以及其餘一些工做的變量。

<2>在mysite目錄下建立blog應用: python manage.py startapp blog

 

使用pycharm快捷建立:

<3>啓動django項目:python manage.py runserver 8080

       這樣咱們的django就啓動起來了!當咱們訪問:http://127.0.0.1:8080/時就能夠看到:

 3、Django URL(路由系統)

URL配置(URL conf)就像Django所支撐網站的目錄。它的本質是URL模式以及要爲該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。

urlpatterns = [
    url(正則表達式, views視圖函數,參數,別名),
]

參數說明:

● 一個正則表達式字符串

● 一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串

● 可選的要傳遞給視圖函數的默認參數(字典形式)

● 一個可選的name參數

實例:

from django.contrib import admin
from django.urls import path from django.conf.urls import url from blog import views urlpatterns = [ path(r'admin/', admin.site.urls), path(r'show_time/', views.show_time), url(r'article/(\d{4})$', views.article_year), url(r'article/(?P<year>\d{4})/(?P<month>\d{2})', views.article_year_month), url(r'article/(?P<year>\d{4})/(?P<month>\d{2}/\d+)', views.article_year_month), ]
相關文章
相關標籤/搜索