摘要:從導(dǎo)入相應(yīng)函數(shù),即傳入一個(gè)上一步中的類,返回對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容,具體實(shí)現(xiàn)將在后續(xù)講解。后續(xù)只要去處理解析請(qǐng)求和響應(yīng)部分即可,主程序可以不用再修改。下一篇文章編程解析請(qǐng)求頭
Flask或者其他框架都是封裝的比較完善,我們可以不去關(guān)注路由、SESSION等到底是怎么實(shí)現(xiàn)的,現(xiàn)在我們使用socket來實(shí)現(xiàn)一個(gè)帶有注冊(cè)、登錄功能的To do網(wǎng)站,這樣能對(duì)后端框架了解的稍微更深入一點(diǎn)(當(dāng)然你也可以直接去看Flask源碼)。
主程序runserver.py代碼如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket from exts import Request from route import response_for_request from datetime import datetime def run_server(host="", port=1207): # 建立一個(gè)socket.socket()類s with socket.socket() as s: # 設(shè)置s在服務(wù)端關(guān)閉后馬上釋放端口,避免Address already in use錯(cuò)誤 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 綁定host和port s.bind((host, port)) while 1: # 開始監(jiān)聽傳入連接,可以掛起的最大連接數(shù)為5 s.listen(5) # 接受連接,根據(jù)buffer_size不斷讀取內(nèi)容 connection, address = s.accept() r = "" buffer_size = 1024 while 1: data = connection.recv(1024).decode("utf-8") r += data if len(data) < buffer_size: break # 防止瀏覽器傳空請(qǐng)求過來 if len(r.split()) < 2: continue # 最后取得的r是一個(gè)http請(qǐng)求頭字符串,對(duì)其解析,然后使用sendall返回相應(yīng)的內(nèi)容 request = Request(r) # 每次請(qǐng)求時(shí)打印時(shí)間,請(qǐng)求的方法和路徑 print(str(datetime.now())[:19], request.method, request.path) response = response_for_request(request) connection.sendall(response) connection.close() if __name__ == "__main__": run_server()
run_server函數(shù)代碼的簡(jiǎn)單說明可以看注釋;from exts import Request:從exts導(dǎo)入一個(gè)Request類,這個(gè)Request類是自己編寫的,用于解析http請(qǐng)求頭,這部分是很簡(jiǎn)單的,在網(wǎng)上搜索http請(qǐng)求相關(guān)內(nèi)容,就可以自行寫一個(gè),包括返回請(qǐng)求頭的路徑、方法、各個(gè)字段以及body部分等,都是字符串相關(guān)的操作。
from route import response_for_request:從route.py導(dǎo)入相應(yīng)函數(shù),即傳入一個(gè)上一步中的Request類,返回對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容,具體實(shí)現(xiàn)將在后續(xù)講解。
可以說,主程序就已經(jīng)編寫好了,整個(gè)邏輯也很簡(jiǎn)單,使用socket監(jiān)聽連接,解析請(qǐng)求,返回請(qǐng)求對(duì)應(yīng)的內(nèi)容。后續(xù)只要去處理解析請(qǐng)求和響應(yīng)部分即可,主程序可以不用再修改。
下一篇文章:【python socket編程】—— 2.解析http請(qǐng)求頭
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41330.html
摘要:對(duì)于網(wǎng)絡(luò)編程來說,免不了要用到模塊。表示另一端的地址。以上主要是針對(duì)流數(shù)據(jù)的編程。對(duì)于協(xié)議的數(shù)據(jù),處理略有不同。通過傳入對(duì)象調(diào)用來監(jiān)聽對(duì)象的文件描述符,一旦發(fā)現(xiàn)對(duì)象就緒,就通知應(yīng)用程序進(jìn)行相應(yīng)的讀寫操作。 對(duì)于python網(wǎng)絡(luò)編程來說,免不了要用到socket模塊。下面分享一下個(gè)人對(duì)python socket的一些理解。 socket編程步驟 服務(wù)端創(chuàng)建一個(gè)socket,綁定地址和端...
摘要:請(qǐng)求頭的換行使用的是。編寫一個(gè)類,來解析請(qǐng)求的方法路徑和,如下下一篇文章編程響應(yīng) 前文:【python socket編程】—— 1.初探 在上一篇文章中我們知道,socket.accept()接受的數(shù)據(jù)是請(qǐng)求頭,請(qǐng)求頭格式是這樣的: POST /login HTTP/1.1 Host: 127.0.0.1:1207 User-Agent: Mozilla/5.0 (X11; Ubunt...
摘要:原文地址的中文名字叫做套接字,這種東西就是對(duì)的封裝。運(yùn)行結(jié)果如下簡(jiǎn)單解析一下上述代碼來說明一下服務(wù)器的流程首先,根據(jù)協(xié)議族或地址族套接字類型以及具體的的某個(gè)協(xié)議來創(chuàng)建一個(gè)。很容易受到攻擊,造成拒絕服務(wù)。 [原文地址:https://blog.ti-node.com/blog...] socket的中文名字叫做套接字,這種東西就是對(duì)TCP/IP的封裝。現(xiàn)實(shí)中的網(wǎng)絡(luò)實(shí)際上只有四層而已,從上...
摘要:原文地址要想更好了解編程,有一個(gè)不可繞過的環(huán)節(jié)就是在中,一切皆文件實(shí)際上要文件干啥不就是讀寫么所以,這句話本質(zhì)就是才是王道用的打開文件關(guān)閉文件讀讀寫寫,這叫本地文件在編程中,本質(zhì)就是網(wǎng)絡(luò)所以,在開始進(jìn)一步的編程前,我們必須先從概念上認(rèn)識(shí)好 [原文地址:https://blog.ti-node.com/blog...] 要想更好了解socket編程,有一個(gè)不可繞過的環(huán)節(jié)就是IO.在Lin...
閱讀 2764·2021-11-22 14:45
閱讀 916·2021-10-15 09:41
閱讀 1075·2021-09-27 13:35
閱讀 3700·2021-09-09 11:56
閱讀 2642·2019-08-30 13:03
閱讀 3203·2019-08-29 16:32
閱讀 3312·2019-08-26 13:49
閱讀 779·2019-08-26 10:35