---
# System prepended metadata

title: F04099526_鄭譯賢_業師筆記整理
tags: [python上課筆記]

---

# 業師演講筆記整理
---
## 1.發出Request
```python=
import requests
web = requests.get('https://httpbin.org/anything/get?user=andy')
```
:::success
<Response [200]>

:::
上面我對網站發出request並的到一個狀態碼200，代表請求成功
:::info
下面是HTTP協定中可能出現的狀態碼
1xx (Informational): 信息性狀態碼，指示請求已被接收，繼續處理。

2xx (Success): 成功狀態碼，表示請求已成功被伺服器接收、理解、並接受。

200 OK: 請求成功。常見的成功回應碼，表示伺服器成功處理了請求。

201 Created: 請求已經被實現，並且創建了一個新的資源。

204 No Content: 伺服器成功處理了請求，但沒有返回任何內容。

3xx (Redirection): 重新導向狀態碼，指示需要進行進一步的動作以完成請求。

301 Moved Permanently: 被請求的資源已永久移動到新位置。

302 Found (or Moved Temporarily): 被請求的資源暫時移動到新的位置。

304 Not Modified: 如果客戶端的請求的資源未修改，可以使用緩存的版本。

4xx (Client Error): 用戶端錯誤狀態碼，指示客戶端可能出現錯誤。

400 Bad Request: 伺服器無法理解請求的語法。

401 Unauthorized: 未授權，要求需要用戶驗證。

403 Forbidden: 伺服器理解請求，但拒絕執行它。

404 Not Found: 未找到請求的資源。

5xx (Server Error): 伺服器錯誤狀態碼，指示伺服器可能出現錯誤。

500 Internal Server Error: 伺服器遇到了一個未知的錯誤。

502 Bad Gateway: 伺服器作為閘道或代理，從上游伺服器接收到了一個無效的回應。

503 Service Unavailable: 伺服器目前無法處理請求（例如，由於超載或維護）。
:::
## 2.Request & response的結構
### 1.Request的結構
```python=
web.request.__dict__
```
:::success
{'method': 'GET',
 'url': 'https://httpbin.org/anything/get?user=andy',
 'headers': {'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'},
 '_cookies': <RequestsCookieJar[]>,
 'body': None,
 'hooks': {'response': []},
 '_body_position': None}
:::
![download](https://hackmd.io/_uploads/BkvB4qZS6.png)
### 1.Response的結構
```python=
web.__dict__
```
:::success
{'_content': b'{\n  "args": {\n    "user": "andy"\n  }, \n  "data": "", \n  "files": {}, \n  "form": {}, \n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.28.1", \n    "X-Amzn-Trace-Id": "Root=1-655c0d8a-2b56ecd454cbbe600afe03b4"\n  }, \n  "json": null, \n  "method": "GET", \n  "origin": "140.116.247.244", \n  "url": "https://httpbin.org/anything/get?user=andy"\n}\n',
 '_content_consumed': True,
 '_next': None,
 'status_code': 200,
 'headers': {'Date': 'Tue, 21 Nov 2023 01:53:14 GMT', 'Content-Type': 'application/json', 'Content-Length': '433', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'},
 'raw': <urllib3.response.HTTPResponse at 0x16ade263340>,
 'url': 'https://httpbin.org/anything/get?user=andy',
 'encoding': 'utf-8',
 'history': [],
 'reason': 'OK',
 'cookies': <RequestsCookieJar[]>,
 'elapsed': datetime.timedelta(seconds=2, microseconds=384520),
 'request': <PreparedRequest [GET]>,
 'connection': <requests.adapters.HTTPAdapter at 0x16ade23bc10>}
:::
![download](https://hackmd.io/_uploads/SJgMmjWHT.png)
```python=
from urllib.parse import urlparse, parse_qs

url = input()
o = urlparse(url)

# Parse the query parameters into a dictionary
query_params = parse_qs(o.query)

# Print the dictionary of query parameters
print(query_params)

```
:::success
'hl=zh-Hant'
:::
o.query是 URL 中的查詢參數部分
## 3.實作server的行為
```python=
from urllib.parse import urlparse

# 輸入一個URL
url = input()  # 假設輸入是 http://127.0.0.1/hello/?user=andy

# 使用urlparse函數解析URL
o = urlparse(url)

# 取得URL的查詢參數部分
query_string = o.query

# 輸出查詢參數部分
print(query_string)

```
:::success
http://127.0.0.1/hello/?user=andy
'user=andy'
:::
```python=
from urllib.parse import urlparse

# 輸入一個URL
url = input()

# 使用 urlparse 函數解析URL
o = urlparse(url)

# 根據 URL 的路徑部分進行條件判斷
if o.path == '/hello':
    # 如果路徑是 '/hello'，印出查詢參數部分
    print(o.query)
elif o.path == '/world':
    # 如果路徑是 '/world'，印出 'world'
    print('world')
else:
    # 如果路徑是其他，印出 'index'
    print('index')

```
:::success
http://127.0.0.1/world
world
:::

## 4.路由實作
路由介紹:在 Web 開發中，路由（Route）是一種機制，用於將特定的 HTTP 請求（通常是 GET 或 POST）映射到應用程式中的特定端點（Endpoint）或處理函數。簡單來說，路由定義了應用程式如何回應不同的 URL 請求。

在 Flask 中，路由是使用 @app.route() 裝飾器來定義的。裝飾器將 URL 路徑（或模式）綁定到相應的函數，這樣當應用程式接收到特定的 URL 請求時，就會調用相應的處理函數。
```python=
pip install flask
from flask import Flask, request

# 創建 Flask 應用程式實例
app = Flask(__name__)

# 定義 Flask 路由
@app.route("/")
def index():
    return "Hello World"

@app.route("/ncku")
def hello():
    return "Hello NCKU"

# 當使用者訪問 /user 路徑時，使用 request.args 取得查詢參數 'input'，如果沒有提供則預設為 'No input'
@app.route('/user', methods=['GET'])
def show_user_profile():
    user = request.args.get('input', 'No input')
    return f'User {user}'

# 當收到 '/calc' 路徑的 GET 請求時，執行以下函數
@app.route('/calc', methods=['GET'])
def my_calc():
    # 從查詢參數 'expr' 中取得表達式
    expr = request.args.get('expr')
    
    # 使用 eval 函數計算表達式的值
    result = eval(expr)
    
    # 返回結果，格式化字符串顯示表達式和計算結果
    return "{}={}".format(expr, result)
# 使用 request.args.get('expr') 從 GET 請求的查詢參數中獲取表達3#式，這個表達式應該是一個合法的 Python 運算式。
# 使用 eval(expr) 計算表達式的值。這裡使用 eval 函數，但需要注意，eval 函數可以執行任意的 Python 代碼，因此在實際應用中應謹慎使用，避免安全風險。
# 將表達式和計算結果格式化為字符串，然後返回結果。例如，如果查詢參數 'expr' 的值是 '2+3'，那麼結果將是 "2+3=5"。

# 啟動 Flask 應用程式
if __name__ == '__main__':
    app.run(debug=True)

    
app.run() #啟用server並對外連線
```
```python=
proc.terminate() # 中止
```

## 5.資訊安全鐵三角
### 1.機密性(Confidentiality)
要確保資訊未經授權不會被看到
### 2.完整性(Integrity)
確保資料不會被竄改
### 3.可用性(Availability)
自己要擁有授權隨時可更新資訊

在寫網頁或是執行程式碼時要遵守上述三個原則，以避免被攻擊
