Web 框架
1、Web框架
Web框架(Web framework)是一種開(kāi)發(fā)框架,用來(lái)支持動(dòng)態(tài)網(wǎng)站、網(wǎng)絡(luò)應(yīng)用和網(wǎng)絡(luò)服務(wù)的開(kāi)發(fā)。這大多數(shù)的web框架提供了一套開(kāi)發(fā)和部署網(wǎng)站的方式,也為web行為提供了一套通用的方法。web框架已經(jīng)實(shí)現(xiàn)了很多功能,開(kāi)發(fā)人員使用框架提供的方法并且完成自己的業(yè)務(wù)邏輯,就能快速開(kāi)發(fā)web應(yīng)用了。瀏覽器和服務(wù)器的是基于HTTP協(xié)議進(jìn)行通信的。也可以說(shuō)web框架就是在以上十幾行代碼基礎(chǔ)張擴(kuò)展出來(lái)的,有很多簡(jiǎn)單方便使用的方法,大大提高了開(kāi)發(fā)的效率。
wsgiref模塊
最簡(jiǎn)單的Web應(yīng)用就是先把HTML用文件保存好,用一個(gè)現(xiàn)成的HTTP服務(wù)器軟件,接收用戶請(qǐng)求,從文件中讀取HTML,返回。
如果要?jiǎng)討B(tài)生成HTML,就需要把上述步驟自己來(lái)實(shí)現(xiàn)。不過(guò),接受HTTP請(qǐng)求、解析HTTP請(qǐng)求、發(fā)送HTTP響應(yīng)都是苦力活,如果我們自己來(lái)寫(xiě)這些底層代碼,還沒(méi)開(kāi)始寫(xiě)動(dòng)態(tài)HTML呢,就得花個(gè)把月去讀HTTP規(guī)范。
正確的做法是底層代碼由專門(mén)的服務(wù)器軟件實(shí)現(xiàn),我們用Python專注于生成HTML文檔。因?yàn)槲覀儾幌M佑|到TCP連接、HTTP原始請(qǐng)求和響應(yīng)格式,所以,需要一個(gè)統(tǒng)一的接口協(xié)議來(lái)實(shí)現(xiàn)這樣的服務(wù)器軟件,讓我們專心用Python編寫(xiě)Web業(yè)務(wù)。這個(gè)接口就是WSGI:Web Server Gateway Interface。而wsgiref模塊就是python基于wsgi協(xié)議開(kāi)發(fā)的服務(wù)模塊。
from wsgiref.simple_server import make_serverdef mya(environ, start_response):print(environ)start_response('200 OK', [('Content-Type', 'text/html')])if environ.get('PATH_INFO') == '/index':with open('index.html','rb') as f:data=f.read()elif environ.get('PATH_INFO') == '/login':with open('login.html', 'rb') as f:data = f.read()else:data=b'<h1>Hello, web!</h1>'return [data]if __name__ == '__main__':myserver = make_server('', 8011, mya)print('監(jiān)聽(tīng)8010')myserver.serve_forever()wsgiref簡(jiǎn)單應(yīng)用 wsgiref應(yīng)用2、手寫(xiě)Web框架
models.py
鏈接數(shù)據(jù)庫(kù)返回字典格式:
cursor=pymysql.cursors.DictCursor
myserver.py
from wsgiref.simple_server import make_serverfrom urls import url_pattersdef mya(environ, start_response):# print(environ)start_response('200 OK', [('Content-Type', 'text/html')])func = Nonefor item in url_patters:if item[0] == environ.get('PATH_INFO'):func = item[1]breakif func:data = func(environ)return [data]else:return [b'404']if __name__ == '__main__':myserver = make_server('', 8011, mya)print('監(jiān)聽(tīng)8010')myserver.serve_forever()啟動(dòng)文件 啟動(dòng)文件urls.py
from views import * url_patters = [('/login', login),('/index', index),('/time', time), ]路由配置 路由配置views.py
def index(environ):with open('templates/index.html', 'rb') as f:data = f.read()return data def time(environ):import datetimenow=datetime.datetime.now().strftime('%y-%m-%d %X')print(now)return now.encode('utf-8') from urllib.parse import parse_qs import pymysql def login(request):if request.get("REQUEST_METHOD") == "POST":try:request_body_size = int(request.get('CONTENT_LENGTH', 0))except (ValueError):request_body_size = 0request_body = request['wsgi.input'].read(request_body_size)data = parse_qs(request_body)user = data.get(b"user")[0].decode("utf8")pwd = data.get(b"pwd")[0].decode("utf8")# 連接數(shù)據(jù)庫(kù)conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='web') # db:庫(kù)名# 創(chuàng)建游標(biāo)cur = conn.cursor()SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd)cur.execute(SQL)if cur.fetchone():f = open("templates/backend.html", "rb")data = f.read()data = data.decode("utf8")return data.encode("utf8")else:print("OK456")return b"user or pwd is wrong"else:f = open("templates/login.html", "rb")data = f.read()f.close()return data視圖函數(shù) 視圖函數(shù)tempaltes下
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> 登錄成功 </body> </html>backend.html backend.Html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> index </body> </html>index index <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><h4>登錄頁(yè)面</h4> <form action="http://127.0.0.1:8011/login" method="post">用戶名 <input type="text" name="user">密碼 <input type="text" name="pwd"><input type="submit"> </form> </body> </html>login.html login.html3、其他SOCKET服務(wù)端
'cgi': CGIServer,'flup': FlupFCGIServer,'wsgiref': WSGIRefServer,'waitress': WaitressServer,'cherrypy': CherryPyServer,'paste': PasteServer,'fapws3': FapwsServer,'tornado': TornadoServer,'gae': AppEngineServer,'twisted': TwistedServer,'diesel': DieselServer,'meinheld': MeinheldServer,'gunicorn': GunicornServer,'eventlet': EventletServer,'gevent': GeventServer,'geventSocketIO':GeventSocketIOServer,'rocket': RocketServer,'bjoern' : BjoernServer,'auto': AutoServer,都遵循一個(gè)協(xié)議wsgi(Web Server Gateway Interface web服務(wù)網(wǎng)關(guān)接口)
轉(zhuǎn)載于:https://www.cnblogs.com/gwklan/p/10981678.html
總結(jié)
- 上一篇: iOS 14.2 RC版是什么版为什么称
- 下一篇: 学习activemq,在spring中a