12.web開發之flask-1
阿新 • • 發佈:2022-04-17
前置設定
在settings中的Manage Repositories修改python源為douban:https://pypi.douban.com/simple/ ,並下載flask包
flask基本設定
flask:python輕量級web框架,自己本身就是一箇中間件,藉助作業系統安裝的python程式執行
路由: 什麼路徑可以訪問到什麼資源,在flask中以裝飾器的方式存在
import flask from flask import # 建立flask程式 app = Flask(__name__) # 通過設定不同的路由訪問不同的頁面 @app.route('/abc') def a_page(): return "this is a page" # 裝飾器,關聯路由 @app.route('/') def index(): return "haha" if __name__ == '__main__': # 執行flask程式,預設5000埠 # 可以修改為8888埠,開啟debug模式,並用本機的IP訪問 app.run(host='0.0.0.0', port=8888, debug=True)
flask的請求和引數
新建兩個資料夾為static和templates
import flask from flask import * # 建立Flask程式 app = Flask(__name__, static_url_path='/static', # 靜態檔案路徑,當程式解析到static目錄時,不用路由的方式解析,而是讀取檔案的方式 static_folder='static', template_folder='templates' # 模板檔案,HTML程式碼就放裡面 ) # 通過/進行引數傳入,可以在引數前新增限定變數型別,傳入引數不符合標準直接404 @app.route('/abc/<user_id>/<int:user_pass>') # ()內的引數和傳入引數名字一致 def a_page(user_id, user_pass): return "this is a page %s-----%s hahahahah" % (user_id, user_pass) # PHP中傳參通過?=,而在這裡是通過/進行傳參,如這裡就是/abc/xiaoming/123 # 裝飾器,關聯路由 @app.route('/') def index(): return "haha" if __name__ == '__main__': # 執行flask程式,預設5000埠,可以修改為8888埠並可以用本機的IP訪問 app.run(port=8888, debug=True)
如果不想通過/進行傳參,可以像PHP一樣使用?
GET型
@app.route('/abc',methods=['GET'])
# ()內的引數和傳入引數名字一致
def a_page():
username = request.args.get('uname')
userpass = request.args.get('upass')
return "this is a page %s----%s hahahahah" % (username,userpass)
POST型
@app.route('/abc', methods=['POST']) # ()內的引數和傳入引數名字一致 def a_page(): username = request.form.get('uname') userpass = request.form.get('upass') return "this is a page %s----%s hahahahah" % (username, userpass)
如果將傳參方式修改為POST,依然使用GET方式提交,出錯是405”Method Not Allowed”
flask引數型別
request.method 獲取請求型別
@app.route('/abc',methods=['GET','POST'])
def a_page():
# 獲取請求的型別
return "this is a page %s hahahahah" % (request.method)
request.headers 獲取請求頭
@app.route('/abc',methods=['GET','POST'])
def a_page():
return "this is a page %s hahahahah" % (request.headers)
# 獲得header頭指定引數
return "this is a page %s hahahahah" % (request.headers.get('User-Agent'))
# 獲取請求訪問路徑(只能獲得路由)
return "this is a page %s hahahahah" % (request.path)
# /abc
request 其他引數和結果
full_path:獲得全部請求路徑(包括後面GET請求帶的引數)
# /abc?uname=haha&upass=123
base_url:只顯示請求的網站完整url
# http://127.0.0.1:8888/abc
url:顯示完整url和引數
# http://127.0.0.1:8888/abc?uname=haha&upass=123
user_agent:顯示User-Agent
# Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
user_agent.platform:顯示User-Agent的作業系統資訊
# Windows
user_agent.browser:顯示User-Agent的瀏覽器資訊
# firefox
user_agent.version:顯示瀏覽器版本號
# 52.0
json和字典
通過python給別人一個介面,介面一般返回json格式資料
{"name":"xiaoming","age":"21"}
字典轉換為json字串
@app.route('/abc',methods=['GET','POST'])
def a_page():
# 定義一個字典
json_dict = {
"name":"xiaoli",
"age":"89",
"score":"100"
}
# 字典轉換成json字串
result = json.dumps(json_dict)
return result
# {"age": "89", "name": "xiaoli", "score": "100"}
json字串轉化成字典
dict1 = json.loads('{"age": "89", "name": "xiaoli", "score": "100"}')
print(dict1["name"])
return 'x'
# 此時訪問網站,網站返回x,python控制檯返回xiaoli,證明已經轉化成字典格式
重定向
站外重定向和站內重定向
@app.route('/redirect')
def a_page():
# 站外重定向
return flask.redirect('http://www.cctv.com')
# 站內重定向,通過函式名找路由
return flask.redirect(flask.url_for('b_page'))
@app.route('/b')
def b_page():
return 'you are here!'
404重定向
# 404重定向
@app.errorhandler(404)
def page_not_found(error):
return "you are wrong! 404 not found!", 404
@app.route('/a')
def a_page():
return 'haha'
@app.route('/b')
def b_page():
return 'you are here!'
訪問a和b正常跳出頁面,一旦路由不存在自動跳轉到404重定向函式
url別名和異常處理
url別名
@app.route('/a')
def a_page():
# 直接訪問別名即可,不需要訪問函式
return flask.redirect(flask.url_for('b1'))
@app.route('/woshihenchangdeluyou', endpoint='b1')
def b_page():
return 'you are here!'
異常處理
返回具有迷惑性的狀態碼
如果在return後直接新增404,會返回404狀態碼,但不影響內容輸出
@app.route('/a')
def a_page():
return 'a',404
在掃描器中反饋的就是404
主動丟擲異常
# 404重定向
@app.errorhandler(404)
def page_not_found(error):
return "you are wrong! 404 not found!", 404
@app.route('/a')
def a_page():
flask.abort(404)
return 'a'
主動丟擲異常程式會自動尋找處理此狀態碼的函式