1. 程式人生 > 其它 >12.web開發之flask-1

12.web開發之flask-1

前置設定

在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'

主動丟擲異常程式會自動尋找處理此狀態碼的函式