1. 程式人生 > >Python自動化開發學習14

Python自動化開發學習14

空白 什麽 可選 還原 級別 自動跳轉 基礎上 分隔 stat

Web的三個層次

網頁設計思路是把網頁分成三個層次,即:結構層(HTML)、表示層(CSS)、行為層(Javascript)。
形象的比喻,先是HTML捏了一個人,然後CSS則是給人穿上衣服,最後通過JS讓人動起來。

Web服務的本質

對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。用戶向服務器發送一個請求。然後服務器響應,將數據和格式發回給客戶端,然後斷開這個連接。客戶端收到返回的數據後,通過瀏覽器將數據按照一定的格式呈現出來。整個過程就是一個socket的短連接。
下面是一個服務端的python代碼,實現一個簡單的Hello World:

import socket

def handle_request(conn):
    data = conn.recv(1024)  # 接收數據,隨便收到啥我們都回復Hello World
    conn.send(‘HTTP/1.1 200 OK\r\n\r\n‘.encode(‘utf-8‘))  # 這是什麽暫時不需要知道,客戶端瀏覽器會處理
    conn.send(‘Hello World‘.encode(‘utf-8‘))  # 回復的內容,就是網頁的內容

def main():
    # 先起一個socket服務端
    server = socket.socket()
    server.bind((‘localhost‘, 8000))
    server.listen(5)
    # 然後持續監聽
    while True:
        conn, addr = server.accept()  # 開啟監聽
        handle_request(conn)  # 將連接傳遞給handle_request函數處理
        conn.close()  # 關閉連接

if __name__ == ‘__main__‘:
    main()

在本機啟動上面的socket之後,直接使用瀏覽器作為客戶端連接。在地址欄輸入 http://127.0.0.1:8000/http://localhost:8000/ 之後,瀏覽器上就會顯示服務端返回的內容了。
這裏顯示的內容比較low,實際應用中,要返回給客戶端的網頁內容比較大。而且除了數據,還會包括格式(html標簽)。實際應用中會將所有的內容寫成一個html文件,然後再返回數據的時候調用這個文件。
先寫一個簡單的帶一點標簽的html文件,index.html:

<h1 style="background-color: red">Hello World</h1>
<a href="http://www.51cto.com">51CTO</a>
<table border="1">
    <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
    </tr>
    <tr>
        <td>A</td>
        <td>B</td>
        <td>C</td>
    </tr>
</table>

然後我們的socket不在發送簡單的數據,而是讀取文件,將文件中的數據發送給客戶端。
在上面代碼的基礎上修改一下handle_request函數的內容:

def handle_request(conn):
    data = conn.recv(1024)  # 接收數據,隨便收到啥我們都回復Hello World
    conn.send(‘HTTP/1.1 200 OK\r\n\r\n‘.encode(‘utf-8‘))  # 這是什麽暫時不需要知道,客戶端瀏覽器會處理
    # conn.send(‘Hello World‘.encode(‘utf-8‘))  # 回復的內容
    # 讀取html文件,將文件內容返回給客戶端
    with open(‘index.html‘ , encoding=‘utf-8‘) as file:
        html = file.read()
        conn.send(html.encode(‘utf-8‘))

現在已經將html和我們的socket服務分離了,需要返回給客戶端什麽樣的頁面,我們只需要編輯修改我們的html文件即可。而我們的socket服務器代碼則負責和客戶端的數據交換。
之後學習Web暫時只需要關註html的部分就好了,直接使用瀏覽器打開本地的html文件就可以查看實現的效果。

html標簽

使用pycharm直接創建一個html文件,內容如下(HTML5的模板):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>

&lt;!DOCTYPE html&gt; :這是一個聲明,聲明下面html的版本。這裏是一個html5的聲明。這個不是html標簽,下面的都是。
&lt;html lang="en"&gt; :這是一個html標簽,裏面的 lang="en" 是標簽內部的屬性。一般html標簽這麽寫就行了。這個屬性也用不著。
&lt;head&gt; :head標簽,html的頭,後面詳講
&lt;body&gt; :body標簽,html的主體,後面詳講
最後補充一個
註釋 :<!-- 註釋的內容 -->

標簽的分類

主動閉合標簽:大多數的標簽都是這種形式。標簽有兩部分,比如上面的<html>、<head>、<body>,後面都有一個對應的</html>、</head>、</body>來主動閉合這個標簽。
自閉合標簽:像上面 head 中的 meta 標簽,就是一個自閉合標簽。這類標簽比較少。另外也可以這樣寫<meta />,加上一個/符號,不影響瀏覽器的識別,但是可以直觀的讓人看明白各個標簽已經閉合了。推薦加上表示閉合的/

head內標簽

&lt;meta charset="UTF-8"&gt; :指定頁面的字符編碼,否則中文可能會變成亂碼。
&lt;title&gt; :定義頁面標題。一般會顯示在瀏覽器的標題欄或標簽頁上。
還可以加一些其他標簽,舉例一些比較常用的,基本上都用處不大
&lt;meta http-equiv="Refresh" Content="30"&gt; :頁面30秒自動刷新
&lt;meta http-equiv="Refresh" Content="5;url=http://www.51cto.com" &gt; :頁面5秒後自動跳轉,這種跳轉用的少,因為不是動態的無法顯示倒計時或進度條,學了JS可以用JS來實現跳轉並且能顯示倒計時。
&lt;meta name=‘keywords‘ content=‘NGA,National Geographic Azeroth,遊戲社區,魔獸世界,魔獸世界中文數據庫,wow,World of Warcraft‘&gt; :加關聯字,給搜索引擎搜索用的。告訴搜索引擎搜索什麽關鍵字可以搜索到你的網站。對我們用處不大。
&lt;meta name=‘description‘ content=‘NGA 最專業的魔獸世界討論 及綜合遊戲社區‘&gt; :加網站描述,同樣用處不大
&lt;meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"&gt; :網站兼容模式的設置,就是告訴瀏覽器選擇什麽模式來打開網頁,通過content的屬性識別。以上代碼IE = edge告訴IE使用最新的引擎渲染網頁,chrome = 1則是告訴chrome可以激活Chrome Frame。
&lt;link rel="shortcut icon" href="image/favicon.ico"/&gt; :指定網站的圖標
還有更多的 &lt;link&gt; 標簽,以及 &lt;style&gt; 標簽和 &lt;script&gt; 標簽後面的章節用到的時候會再講。

特殊符號

有些特殊符號瀏覽器可能無法直接識別,需要轉義。下面列舉幾個常用的,更多的只能到時候再去查了:

HTML源代碼 顯示符號 描述
空格
&lt; < 小於號或顯示標記
&gt; > 大於號或顯示標記
& & 可用於顯示其它特殊字符
" 雙引號
? ? 已註冊
? ? 版權
? ? 商標

body內標簽-入門

先了解一下下面幾個簡單的標簽
&lt;p&gt; :段落標簽,段落和段落直接會有行間距
&lt;br&gt; :換行標簽,自閉合,也可以這麽寫&lt;br /&gt;
&lt;h1&gt; - &lt;h6&gt; :標題標簽,只有6個級別

塊級標簽 和 行內標簽

&lt;br&gt; 這種是自閉和的,標簽之間沒有內容,所以都不屬於
塊級標簽:標簽之間的內容會占一整行,上面的幾個都是塊級標簽
行內標簽:也叫內聯標簽,標簽之間的內容接著前面的內容顯示,不會換行
&lt;span&gt; :這就是一個行內標簽。這個標簽本身沒有任何格式就是一個白板,但是可以通過定義標簽的屬性,來定義標簽之間內容的格式。
&lt;div&gt; :也是一個白板,但是是一個塊級標簽。這個標簽很重要,做前端最重要的就是要掌握div+css,做頁面布局的。
&lt;form&gt; :表單標簽,在下面的input裏面講。

body內標簽-提交數據

下面的這些標簽都是用於客戶端向服務器提交數據的

input標簽

通過登錄表單來講一下input標簽,還有一個form標簽會用到,順便也講了
&lt;input&gt; :根據不同的type屬性,會有多種形式。
下面的body中有4種input,可以在瀏覽器中打開。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action=" ">
    <input type="text" />
    <input type="password" />
    <input type="button" value="登錄1" />
    <input type="submit" value="登錄2" />
</form>
</body>
</html>

type="text" :可以輸入文本,
type="password" :可以輸入密碼,
type="button" :是一個按鈕,現在點下去沒效果,還需要其他東西。
type="submit" :提交表單,是另外一種按鈕。同樣沒效果,直接將form表單的內容提交到form的action屬性指定的url。
不過上面的input內容還無法識別,需要加上name屬性:

<input type="text" name="username" />
<input type="password" name="pwd" />

這樣就會把數據組織成一個字典的形式提交出去,name就是字典的key,你在前端文本框輸入的數據就是字典的value。這樣提交之後,就可以通過name屬性的值也就是字典的key獲取到前端文本的內容。這部分還得後面再講了,暫時只要會以這樣的形式提交,之後再學怎麽獲取到值以及處理。
&lt;form&gt; 標簽還有一個methon屬性,指定提交的形式,默認是GET。一共就2個可選值GET和POST。指定的話就是這麽寫:
&lt;form action=" " method="get"&gt;&lt;form action=" " method="post"&gt;
以GET形式提交,會把表單的內容拼接到url後面,然後發送出去。放在http的請求頭中。
以POST形式提交,會把表單的內容放在內容中發送出去。放在http的請求體中。
HTTP請求報文:HTTP請求報文由3部分組成(請求行+請求頭+請求體)。具體這裏就不研究了。
現在還不會寫web服務,不過有現成的服務器可以測試提交表單。打開瀏覽器,在瀏覽器中輸入這樣的url:“https://www.baidu.com/s?wd=你要搜索的內容“ ,就可以直接打開搜索結果的頁面。於是自己編輯一個網頁,內容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="https://www.baidu.com/s">
    <input type="text" name="wd" />
    <input type="submit" value="搜索" />
</form>
</body>
</html>

現在用瀏覽器打開我們自己的網頁,在文本框輸入你要搜索的內容,然後點擊搜索按鈕查看效果。
&lt;input type="text" name="wd" value="默認值" /&gt; :這裏也可以加上value屬性,這樣打開的頁面中文本框中不再是空白,而是會有一個默認值。
type="radio" :單選框,相同的name屬性表示是一個選擇項的,定義不同的value值可以獲取到你的選擇
type="checkbox" :復選框,相同的name屬性表示是一個選擇項的,每個選項給不用的value值,可以判斷你選中了哪些,沒選中哪些。

<body>
    <p>請選擇性別:<br /></p>
    男:<input type="radio" name="sex" value="M" />
    女:<input type="radio" name="sex" value="F" />
    <p>愛好:</p>
    足球:<input type="checkbox" name="favor" value="football" />
    藍球:<input type="checkbox" name="favor" value="basketball" />
    排球:<input type="checkbox" name="favor" value="volleyball" />
    棒球:<input type="checkbox" name="favor" value="baseball" />
</body>

通過屬性 checked="checked" 可以設置選項默認被選中。
&lt;input type="file" name="filename" /&gt; :可以用於上傳文件。要上傳文件,需要將這個放到form標簽中,並且在form標簽中要定義 enctype="multipart/form-data" 。因為還需要服務器端處理,在講到web框架的時候再細講了。
&lt;input type="reset" value="重置" /&gt; :可以重置form中的所有內容,還原到打開時候的默認值。

多行文本-textarea標簽

&lt;textarea&gt; :用於實現輸入多行文本,主動閉合標簽,在標簽之間的部分可以寫上默認值。一般會加上name屬性,用於取數據。

<textarea name="text">這裏寫上默認值</textarea>

下拉列表-select標簽

簡單的下拉列表代碼如下:

<select name="city1">
    <option value="BJ">北京</option>
    <option value="SH">上海</option>
    <option value="GJ">廣州</option>
    <option value="SZ">深圳</option>
</select>

在select標簽裏設置name屬性,用於取數據
每個option標簽裏設置value屬性,用於確認該選項是否被選中
size屬性 :可以設置size屬性,將列表自動展開一定的項目
selected屬性 :設置 selected="selected" ,將該選項設為默認
multiple屬性 :設置 multiple="multiple" ,將列表定義為多選。可以通過Ctrl選中多個,也可以通過Shift或者拖拽來連續選中多個

<select name="city2" size="3">
    <option value="BJ">北京</option>
    <option value="SH" selected="selected">上海</option>
    <option value="GJ">廣州</option>
    <option value="SZ">深圳</option>
</select>
<select name="city3" size=6 multiple="multiple">
    <option value="BJ">北京</option>
    <option value="SH" selected="selected">上海</option>
    <option value="GJ">廣州</option>
    <option value="SZ">深圳</option>
</select>

另外還有一個分組的下拉列表,代碼如下:

<select name="city1">
    <optgroup label="直轄市">
        <option value="BJ">北京</option>
        <option value="SH">上海</option>
    </optgroup>
    <optgroup label="江蘇省">
        <option value="NJ">南京</option>
        <option value="SZ">蘇州</option>
        <option value="WX">無錫</option>
    </optgroup>
</select>

小結

以上,能夠把數據提交給服務器的標簽就講完了。
之後的標簽就是用來點綴,用來頁面布局等等這類功能了。

body內標簽-布局

下面是一些常用的功能性的或者是頁面布局的標簽

超鏈接-a標簽

通過a標簽可以定義超鏈接,通過超鏈接我們可以實現頁面的跳轉:

<body>
<a href="http://www.baidu.com">百 度</a>
<a href="http://www.163.com/" target="_blank">網易</a>
</body>