asp網(wǎng)站后臺安全退出購物網(wǎng)站
文章目錄
- Flask
- 開發(fā)環(huán)境搭建
- 保持Flask運行
- Debug調試
- 路由和視圖
- 可變路由
- 請求和響應
- 獲取請求信息
- Request屬性
- 響應狀態(tài)碼
- 常見狀態(tài)碼
- Cookie
- Session
- 表單
- GET請求
- POST請求
Flask
在用戶使用瀏覽器訪問網(wǎng)頁的過程中,瀏覽器首先會發(fā)送一個請求到服務器,服務器接收到請求之后,會將請求轉交給Flask進行處理。Flask會對用戶所訪問的URL進行解析,然后找到相應的響應內(nèi)容,將其返回到瀏覽器。
開發(fā)環(huán)境搭建
參考文檔:【SH】Ubuntu Server 24搭建Web服務器訪問Python程序研發(fā)筆記
保持Flask運行
開啟Ubuntu服務器,切換到項目目錄,激活虛擬環(huán)境,運行app.py文件。如果開啟了debug=True
參數(shù),只需要啟動一次,后續(xù)更改了app.py文件后會自動重啟,挺方便的,當然如果修改后運行失敗,重啟也會失敗的。😄
sh@sheephero:~$ cd dip_project/
sh@sheephero:~/dip_project$ source dipenv/bin/activate
(dipenv) sh@sheephero:~/dip_project$ python app.py
app.py
文件:
from flask import Flaskapp = Flask(__name__)@app.route("/")
def index():return "<h1>Hello World!</h1>" if __name__=='__main__':# 運行Flask應用,監(jiān)聽默認端口5000app.run(debug=True, host='0.0.0.0')
運行情況:
Debug調試
當Python程序運行出現(xiàn)出錯的時候,就會出現(xiàn)如下界面,非常方便開發(fā)者進行調試!
路由和視圖
仔細觀察app.py
中的代碼,hello
函數(shù)被 @app.route("/")
裝飾器裝飾,該裝飾器用于定義路由,確定URL與Python函數(shù)之間的映射。而被裝飾的hello函數(shù)便是視圖函數(shù),用于返回用戶請求URL的響應內(nèi)容。
可變路由
裝飾器這部分,可以用<>
定義一個可變參數(shù),同時在視圖函數(shù)()
中添加這個參數(shù),便可以設置動態(tài)路由,動態(tài)響應。
from flask import Flaskapp = Flask(__name__)@app.route("/")
def index():return "<h1>Hello World!</h1>"@app.route("/user/<name>")
def user(name):return "<h1>Hello, {}!</h1>".format(name)if __name__=='__main__':# 運行Flask應用,監(jiān)聽默認端口5000app.run(debug=True, host='0.0.0.0')
請求和響應
HTTP的核心就是【請求】和【響應】,其性質為無狀態(tài)協(xié)議,對事務處理沒有記憶能力。這意味著每一次交互都是完全獨立的。
獲取請求信息
路由和視圖函數(shù)部分代碼:
@app.route("/info")
def info():# 從request對象中獲取用戶請求信息info_str = f"""用戶IP:{request.remote_addr} <br/>請求方式:{request.method} <br/>請求表單:{request.form} <br/>用戶瀏覽器:{request.user_agent} <br/>用戶Cookie:{request.cookies} <br/>"""return info_str
Request屬性
屬性名稱 | 數(shù)據(jù)類型 | 說明 |
---|---|---|
method | str | 請求的提交方式 |
path | str | URL中的訪問路徑 |
full_path | str | URL中的訪問路徑,包含數(shù)據(jù) |
remote_addr | str | 瀏覽器的IP地址 |
url | str | 請求的完整URL |
base_url | str | 請求的URL,不含數(shù)據(jù) |
url_root | str | 請求的根URL,不含路徑 |
user _ agent | str | 瀏覽器及操作系統(tǒng)信息 |
args | dict | 請求中提交表單的GET參數(shù) |
form | dict | 請求中提交表單的POST參數(shù) |
files | dict | 請求提交所上傳的文件 |
cookies | dict | 瀏覽器Cookie數(shù)據(jù) |
響應狀態(tài)碼
每次的HTTP交互中,都會響應狀態(tài)碼。通過瀏覽器的F12可以查看響應狀態(tài)碼。
路由和視圖函數(shù)部分代碼:
@app.route("/user/<name>")
def user(name):if name in ['世界','羊大俠','SheepHero']:return "<h3>Hello, {}!</h3>".format(name) # 正常響應默認200else:return f'用戶 {name} 不存在!', 404
常見狀態(tài)碼
狀態(tài)碼 | 信息 | 說明 |
---|---|---|
200 | OK | 一切正常 |
301 | Moved Permanently | 重定向 |
400 | Bad Request | 客戶端請求錯誤 |
403 | Forbidden | 無權限訪問 |
404 | Not Found | 找不到頁面 |
405 | Method Not Allowed | 客戶端使用了不支持的提交方法 |
500 | Internal Server Error | 服務器端出錯 |
502 | Bad Gateway | 代理與服務器之間訪問出錯 |
Cookie
HTTP每次的交互都是獨立的,無法存儲狀態(tài)數(shù)據(jù),Cookie就是為了解決這個問題。
Cookie的存儲容量有限,一般不會超過4KB。因此,Cookie只能存儲少量數(shù)據(jù),如用戶的一些偏好設置、臨時信息等。當用戶訪問需要記錄狀態(tài)數(shù)據(jù)的網(wǎng)頁時,服務器會在HTTP響應包頭部加入設置Cookie的指令,瀏覽器接收到響應包后,將Cookie存儲到本地,當用戶再次訪問頁面時,瀏覽器會將Cookie數(shù)據(jù)加入HTTP請求包頭部,從而使服務器獲取到狀態(tài)信息。
由于Cookie是存放在本地的,可以被查看及修改,安全性較低,所以一般不用來存儲敏感數(shù)據(jù)。
from flask import Flask, request, make_response
import timeapp = Flask(__name__)@app.route('/visit')
def visit():# 從Cookie獲取最后訪問時間last_visit_time = request.cookies.get('last_visit_time', '首次訪問')resp = make_response(f'最后訪問的時間:{last_visit_time}')# 獲取服務器當前時間并設置Cookielast_visit_time = time.strftime('%Y-%m-%d %H:%M:%S')# max_age用戶設置Cookie的有效期(秒)resp.set_cookie('last_visit_time', last_visit_time, max_age=86400)return respif __name__=='__main__':# 運行Flask應用,監(jiān)聽默認端口5000app.run(debug=True, host='0.0.0.0')
同樣的,在瀏覽器里面按【F12】點擊Network,點擊Cookies就可以查看Cookies信息。
在沒有設置Cookie過期時間的情況下,當用戶關閉瀏覽器(Chrome)時,Cookie將會被自動清除。
Session
Session與Cookie的作用相似,都用于存儲狀態(tài)數(shù)據(jù)。不同的是,Session只能在服務器端進行管理,用戶在本地無法對其進行修改,因而安全性較高。Session一般用于存儲用戶登錄狀態(tài)等對安全性要求較高的信息。
為了保證數(shù)據(jù)的安全性,Session一般有以下兩種存儲方式。
(1). 使用Cookie記錄一個隨機生成的session_id,session_id用于記錄Session與用戶的映射關系,所有數(shù)據(jù)存儲于服務器端,用戶無法修改數(shù)據(jù)。
(2). 所有Session數(shù)據(jù)都在服務器端加密,然后存儲在瀏覽器的Cookie中,若用戶擁有加密算法及密鑰,則Session數(shù)據(jù)可以被用戶修改。?(Flask默認以這種方式存儲Session?)
from flask import Flask, session
import timeapp = Flask(__name__)# 在使用Session之前,需要初始化 SECRET_KEY
app.config['SECRET_KEY'] = 'SheepHero' # 自定義
@app.route('/sign_in')
def sign_in():# 設置Session持久性存儲數(shù)據(jù),關閉瀏覽器記錄還會保存在服務器中session.permanent = True# 從Session獲取最后的簽到時間及簽到次數(shù)sign_in_time = session.get('sign_in_time','首次訪問')sign_in_count = session.get('sign_in_count', 0)# 設置Session字典session['sign_in_time'] = time.strftime('%Y-%m-%d %H:%M:%S')session['sign_in_count'] = sign_in_count + 1ret_str = f'上次簽到時間:{sign_in_time} <br/> 這是第 {sign_in_count} 次簽到'return ret_strif __name__=='__main__':# 運行Flask應用,監(jiān)聽默認端口5000app.run(debug=True, host='0.0.0.0')
有了Session,便可以實現(xiàn)安全的用戶狀態(tài)數(shù)據(jù)保存,從而實現(xiàn)登錄功能。
表單
通過表單讓用戶和服務器進行數(shù)據(jù)交互。
from flask import Flask, request
import time
app = Flask(__name__)# 在使用表單前,需要初始化 SECRET_KEY
app.config['SECRET_KEY'] = 'SheepHero' # 自定義
# 可以通過GET和POST兩種方式獲取表單數(shù)據(jù)
@app.route('/form', methods=['GET', 'POST'])
def form():# args用戶獲取GET方式提交的數(shù)據(jù)msg_get = request.args.get('msg_get')# form用戶獲取POST方式提交的數(shù)據(jù)msg_post = request.form.get('msg_post')return f'GET數(shù)據(jù):{msg_get} <br/> POST數(shù)據(jù):{msg_post}'if __name__=='__main__':# 運行Flask應用,監(jiān)聽默認端口5000app.run(debug=True, host='0.0.0.0')
GET請求
測試GET請求,瀏覽器輸入http://172.16.37.37:5000/form?msg_get=你好!
即可
POST請求
測試POST請求,可以編寫一個Python腳本,模擬POST請求
# 保存為post.py文件
import requests
url = 'http://172.16.37.37:5000/form'
payload = {'name':'羊大俠','alias':'SheepHero','msg_post':'Py羊大俠'
}
response = requests.post(url, data=payload)
print(response)
print(response.text)