wab框架

http協議

一、http簡介

? ? ?? 1.HTTP是一個基于TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。

? ? ? 2.HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展

? ? 3.HTTP協議工作于客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。

?

?

二、http協議的特點

? ? ? 1、簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。

?

由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。

?

? ? ? 2、靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。

?

? ? ? 3.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。

?

? ? ? 4.無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。

?

缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

三、http請求協議

1、http請求協議遵循以下格式

請求協議遵循以下格式:

? ? 請求首行;? ? //請求方式、請求路徑、協議和版本? ?如:GET? /index.html? ?http/127.0.0.1

? ?請求頭信息;? ? 請求頭名稱:請求頭內容,即key:value格式

? 空行? :? ? ? ? ?用來用請求體分開

? 請求體:? ? ? GET 沒有請求體,POST有請求體

?

在http協議中最為常用的請求體是GET,與POST? ??

2.get的請求

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8
View Code

HTTP默認的請求方法就是GET
? ? ?* 沒有請求體
? ? ?* 數據量有限制!
? ? ?* GET請求數據會暴露在瀏覽器的地址欄中

GET請求常用的操作:
? ? ? ?1. 在瀏覽器的地址欄中直接給出URL,那么就一定是GET請求
? ? ? ?2. 點擊頁面上的超鏈接也一定是GET請求
? ? ? ?3. 提交表單時,表單默認使用GET請求,但可以設置為POST

請求頭

?

1、Host請求的web服務器域名地址2、User-AgentHTTP客戶端運行的瀏覽器類型的詳細信息。通過該頭部信息,web服務器可以判斷出http請求的客戶端的瀏覽器的類型。3、Accept指定客戶端能夠接收的內容類型,內容類型的先后次序表示客戶都接收的先后次序4、Accept-Lanuage指定HTTP客戶端瀏覽器用來展示返回信息優先選擇的語言5、Accept-Encoding指定客戶端瀏覽器可以支持的web服務器返回內容壓縮編碼類型。表示允許服務器在將輸出內容發送到客戶端以前進行壓縮,以節約帶寬。
而這里設置的就是客戶端瀏覽器所能夠支持的返回壓縮格式。6、Accept-CharsetHTTP客戶端瀏覽器可以接受的字符編碼集7、Content-Type顯示此HTTP請求提交的內容類型。一般只有post提交時才需要設置該屬性有關Content-Type屬性值有如下兩種編碼類型:(1)“application/x-www-form-urlencoded”: 表單數據向服務器提交時所采用的編碼類型,默認的缺省值就是“application/x-www-form-urlencoded”。然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。(2)“multipart/form-data”: 在文件上載時,所使用的編碼類型應當是“multipart/form-data”,它既可以發送文本數據,也支持二進制數據上載。當提交為表單數據時,可以使用“application/x-www-form-urlencoded”;當提交的是文件時,就需要使用“multipart/form-data”編碼類型。

3.post請求

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley

?

?

http響應協議

三、響應格式

1.HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。

復制代碼
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8<html><head></head><body><!--body goes here--></body>
</html>
第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。

第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(ok)

第二部分:消息報頭,用來說明客戶端要使用的一些附加信息

第二行和第三行為消息報頭,
Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8

第三部分:空行,消息報頭后面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。

空行后面的html部分為響應正文。

2.響應狀態嗎

?

狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求常見狀態碼:200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden                 //服務器收到請求,但是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
復制代碼

?

四、get與post請求區別

?

GET請求GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive注意最后一行是空行
POST請求POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley

?

? ?? ? ? ? 1、? 在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放在HTTP包的body中。

? ? ? ? ?2、 GET方式提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST則沒有此限制。

? ? ? ? 3、安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那么使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那么還是使用 post為好。

????? 4.、服務器取值方式不一樣。GET方式取值,如php可以使用$_GET來取得變量的值,而POST方式通過$_POST來獲取變量的值。

web應用與web框架

對于所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。

?

import socketdef 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, yuan</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()

?

wsgiref模塊

from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8000...')
# 開始監聽HTTP請求:
httpd.serve_forever()

創建一個自己的框架

manage.py

import wsgi
print("server is working...")
wsgi.s.serve_forever()

urls

?

from app01 import views#  路徑與邏輯函數的映射關系
URLpattern= (("/login", views.login),("/auth", views.auth),("/reg", views.reg),("/reg_auth", views.reg_auth)
)

?

views

?

def login(environ):with open("template/login.html", "rb") as f:data = f.read()return datadef auth(environ):print("QUERY_STRING", environ.get("QUERY_STRING"))  # user=yuan&pwd=123useron, pwdon = environ.get("QUERY_STRING").split("&")_, user = useron.split("=")_, pwd = pwdon.split("=")import pymysql# 連接數據庫# conn = pymysql.connect(host='', port=3306, user='root', passwd='', db='s6')  # db:庫名conn = pymysql.connect(host='localhost', user='root', password='123', database='s6')# 創建游標cur = conn.cursor()SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD='%s'" % (user, pwd)cur.execute(SQL)if cur.fetchone():with open("template/backend.html", "r") as f:data = f.read()data = data % userreturn data.encode("utf8")else:with open("template/login.html", "rb") as f:data = f.read()return datadef reg(environ):with open("template/reg.html", "rb") as f:data = f.read()return datadef reg_auth(environ):print("QUERY_STRING", environ.get("QUERY_STRING"))useron, pwdon ,repeat_pwdon= environ.get("QUERY_STRING").split("&")_,user= useron.split("=")_,pwd = pwdon.split("=")_,repeat_pwd = repeat_pwdon.split("=")print(user,pwd,repeat_pwd)if repeat_pwd==pwd:import pymysqlconn = pymysql.connect(host='localhost', user='root', password='123', database='s7')cur = conn.cursor()SQL="insert into userinfo1(name,password) values('%s','%s')"%(user,pwd)cur.execute(SQL)conn.commit()with open("template/login.html","rb") as f:data = f.read()return dataelse:with open("template/reg.html","rb") as f:data = f.read()return data

?

models

?

import pymysql
#連接數據庫
# conn = pymysql.connect(host='localhost',port= 3306,user = 'root',password='123',db='s6') #db:庫名
conn=pymysql.connect(host='localhost',user='root',password='123',database='s7')
#創建游標
cur = conn.cursor()# sql='''
# create table userinfo(
#         id INT PRIMARY KEY ,
#         name VARCHAR(32) ,
#         password VARCHAR(32)
# )
#
# # '''
sql='''
create table userinfo1(id INT PRIMARY KEY auto_increment,name VARCHAR(32) ,password VARCHAR(32)
)'''cur.execute(sql)# cur.executemany("insert into userinfo values(%s,%s,%s)", [(1,"yuan","123"),
#                                                           (2,"alex","456"),
#                                                           (3,"egon","789")])
cur.executemany("insert into userinfo1 values(%s,%s,%s)", [(1,"yuan","123"),(2,"alex","456"),(3,"egon","789")])
conn.commit()
#關閉指針對象
cur.close()
#關閉連接對象
conn.close()

?

wsgi

?

from wsgiref.simple_server import make_serverimport urlsdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])print("environ",environ)print("path",environ.get("PATH_INFO"))  # /login
path=environ.get("PATH_INFO")  # /auth
URLpattern=urls.URLpatternprint("URLpattern",URLpattern)func=Nonefor item in URLpattern:if path==item[0]:func=item[1]breakif func:return [func(environ)]else:return [b"<h1>404</h1>"]s=make_server("127.0.0.1",8083,application)

?

?重點

web框架:wsgiref模塊的使用from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8000...')# 開始監聽HTTP請求:httpd.serve_forever()
wsgiref模塊的使用(重點:背會)

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/mengqingjian/p/7701358.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282090.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++ 二維矩陣 轉vector_Python線性代數學習筆記——矩陣的基本運算和基本性質,實現矩陣的基本運算...

當學習完矩陣的定義以后&#xff0c;我們來學習矩陣的基本運算&#xff0c;與基本性質矩陣的基本運算&#xff1a;矩陣的加法&#xff0c;每一個對應元素相加&#xff0c;對應結果的矩陣例子&#xff1a;矩陣A和矩陣B表示的是同學上學期和下學期的課程的成績&#xff0c;兩個矩…

android 4.4以上能夠實現的沉浸式狀態欄效果

僅僅有android4.4以及以上的版本號才支持狀態欄沉浸效果 先把程序執行在4.4下面的手機上,看下效果: 在4.4以上的效果: 當然圖片也是能夠作為背景的.效果: 代碼: if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {Window window getWindow();window.setFlags(Wind…

為abp vnext生成C#客戶端給非abp第三方net程序使用

abp vnext提供了動態C#API客戶端和靜態C#API客戶端來調用abp項目的接口&#xff0c;但是有局限性&#xff1b;要使用動態C#API客戶端的項目必須也是ABP vnext的項目。靜態C#API客戶端也依賴abp的包&#xff0c;如下圖為的靜態客戶端依賴于 Volo.Abp.DependencyInjection、Volo.…

項目中引入composer包

假如在云服務器上&#xff0c;項目根目錄在 /data/shop&#xff0c;則 示例&#xff1a; cd /data/shop響應的結果可能會有兩種: 1、第一種是直接require成功 示例&#xff1a; composer require haveyb/tiny-laravel #響應結果 ./composer.json has been created Loading …

圓的擬合

1.三點求圓心和半徑 https://blog.csdn.net/liyuanbhu/article/details/52891868 2.最小二乘擬合圓轉載于:https://www.cnblogs.com/yhlx125/p/9671641.html

printf()函數不能直接輸出string類型

因為string不是c語言的內置數據&#xff0c;所以直接printf輸出string類型的是辦不到的。 要這樣輸出: printf("%s\n",a.c_str()); 舉例: #include<bits/stdc.h> using namespace std; int main(){string a"人生";printf("%s\n",a.c_str()…

C#項目代碼規范

目的 1.方便代碼的交流和維護。 2.不影響編碼的效率&#xff0c;不與大眾習慣沖突。 3.使代碼更美觀、閱讀更方便。 4.使代碼的邏輯更清晰、更易于理解。 在C#中通常使用的兩種編碼方式如下 Camel(駝峰式)&#xff1a; 大小寫形式&#xff0d;除了第一個單詞&#xff0c;所有單…

.NET MAUI實戰 FolderPicker

1.概要最近在遷移 GeneralUpdate.Tool的時候需要用到文件夾選擇&#xff0c;在MAUI中可以使用FolderPicker進行選擇。注意&#xff0c;和上篇文章的文件選擇不一樣。因為在.NET MAUI中目前還沒有傻瓜式直接可用的FolderPicker供開發者使用所以需要自己動手做一些修改。完整示例…

h5外賣源碼php_校園食堂外賣APP走紅 更多APP定制開發上一品威客網

近日&#xff0c;西安一高校推出了一款校園食堂外賣APP走紅網絡。該APP涵蓋學校食堂的所有飯菜&#xff0c;并可給該校的師生提供校園食堂飯菜外賣服務。飯菜價格與食堂統一&#xff0c;且僅供該校內的師生使用。 目前開發校園外賣訂餐系統可謂是一個較熱門的創業項目&#xff…

Python面向對象學習 1 (什么是面向對象,面向對象的應用場景,待更新)

程序設計的三種基本結構&#xff1a; 面向對象&#xff0c;面向過程&#xff0c;函數式編程1&#xff0c;什么是面向對象編程 面向對象編程是一種編程方式&#xff0c;此編程方式的落地需要使用 “類” 和 “對象” 來實現&#xff0c;所以&#xff0c;面向對象編程其實就是對 …

iPhone屏幕大小和適配建議(包括 XR XS XSM )

//4 ----:{{0, 0}, {320, 480}} //5、5s ----:{{0, 0}, {320, 568}} //6、6s、7、8 ----:{{0, 0}, {375, 667}} //6P、7P、8P ----:{{0, 0}, {414, 736}} 復制代碼X 系列 //X ----:{{0, 0}, {375, 812}} //XR ----:{{0, 0}, {414, 896}} //XS ----:{{0, 0}, {375, 812}} //XSM …

go語言中的方法method

package main;import "fmt"//重新定義一個類型 //為該INT類型擴展方法 type INT int;type A struct {name string; }type B struct {name string; }func main() {a : A{};a.Print();//指針傳遞a.Print2();fmt.Println(a);//同上(*A).Print2(&a);b : B{};b.Print(…

微信自定義tabbar有小紅點_自定義微信小程序tabBar組件上邊框的顏色

背景&#xff1a;在微信小程序的實際開發過程中&#xff0c;有時候我們需要修改微信小程序提供的 tabBar 組件頂部邊框的顏色&#xff0c;以滿足項目需求解決方案&#xff1a;方式一&#xff1a;通過tabBar組件自帶的 borderStyle 屬性來控制邊框的顏色&#xff0c;將邊框的顏色…

又一批優質.NET6實戰項目,面臨永久下線...

多好的實戰項目大家抓緊時間實操起來呀移動電商實戰這次能上岸&#xff0c;最重要的是這個Vue3VantUI.NET6SqlSugar移動電商實戰&#xff0c;全部都是最新最熱的技術棧&#xff0c;寫上簡歷后面試基本上都是問的這塊兒內容。我先給大家看看項目的UI。項目UI全套實戰源碼這個電商…

laravel 配置微信公眾號時{errcode:-106,errmsg:token check fail}

一、問題描述 做微信授權登錄時&#xff0c;遇到的一個坑&#xff0c;提示配置失敗&#xff0c;F12&#xff0c;響應為 errcode":-106,"errmsg":"token check fail 二、解決方案&#xff1a; 注&#xff1a;宗旨就是讓微信能夠訪問你填寫的網址&#xff…

電商企業怎樣用好大數據

電商企業怎樣用好大數據 大數據正在促生新的藍海&#xff0c;催生新的經濟增長點&#xff0c;正在成為政府和企業競爭的新焦點。2012年&#xff0c;瑞士達沃斯論壇發布《大數據&#xff0c;大影響》報告&#xff0c;稱“數據已經成為一種新的經濟資產類別&#xff0c;就像貨幣或…

ORACLE經常使用系統查詢

&#xfeff;&#xfeff;1 查詢系統全部對象 SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS FROM DBA_OBJECTS WHERE OWNERUPPER(SCOTT) 2 查看系統全部表 SELECT OWNER, TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES 3 查看全部用…

Safari 版本回退方法

回退條件 版本回退的前提是關閉電腦的SIP機制&#xff0c;命令行 csrutil status 檢測狀態。Mac os 10.14以下版本回退Safari后插件還是可以用的&#xff0c;升了新系統退了也沒法用了。我的是舊系統 SIP關閉方法 1 重啟MAC&#xff0c;按住cmdR直到屏幕上出現蘋果的標志和進度…

同步方法 調用異步防范_Spring一個注解實現方法的異步調用,再也不用單開線程了...

介紹同步調用先來演示一下什么是同步調用測試方法輸出如下doTaskOne start 1566121320372doTaskOne end 1566121321373doTaskTwo start 1566121321373doTaskTwo end 1566121322374可以看到方法一執行完畢&#xff0c;方法二才會執行異步調用不返回值1.Spring Boot啟動類上加Ena…

使用docker搭建redis主從

一、構建 Docker 環境 1、創建 dockerfile FROM centos:latest RUN groupadd -r redis && useradd -r -g redis redis RUN yum -y update && yum -y install epel-release && yum -y install redis && yum -y install net-tools EXPOSE 63…