天天的內容python
M 模型 負責數據的操做web
V 視圖 負責數據的展現sql
C 控制器 控制你的M的操做以及視圖模板的渲染json
在python中叫作MVTflask
M 模型 負責數據的操做segmentfault
V 控制你的M的操做以及視圖模板的渲染 業務邏輯的操做瀏覽器
T templates 模板 負責數據的展現安全
BS browser-》server服務器
CS client-》servercookie
概念: flask是一個很是小的web框架 被稱爲微型框架 只提供了一個強健的核心 其它的都是經過第三方擴展庫來實現
組成:
使用:
安裝 pip install flask
from flask import Flask app = Flask(__name__) #實例化flask #路由地址 根據用戶不一樣的url進行處理 @app.route('/') def index():#處理當前請求的函數 return 'Hello Flask' if __name__ == '__main__': app.run() #運行當前的flask
#路由地址和視圖函數名稱 是否同名沒有關係 #http://127.0.0.1:5000/test/ @app.route('/test/') #路由地址末尾的/建議加上 def test(): return '我是測試使用的視圖函數'
http://127.0.0.1:5000/page/10/
@app.route('/page/<pagenum>/') #參數的語法格式 /路由名稱/<形參名>/ def page(pagenum): return '當前的頁碼爲{}'.format(pagenum)
#帶多個參數 # http://127.0.0.1:5000/arg/10/zhansgan/ @app.route('/arg/<age>/<name>/') def getarg(age,name): return '我叫{} 我見年{}歲了'.format(name,age) # http://127.0.0.1:5000/arg/zhansgan_10/ @app.route('/arg/<name>_<age>/') def getarg(age,name): return '我叫{} 我見年{}歲了'.format(name,age)
#參數類型 # @app.route('/argtype/<arg>/') # @app.route('/argtype/<int:arg>/') #限定參數類型爲int # @app.route('/argtype/<float:arg>/') #限定參數類型爲float # @app.route('/argtype/<string:arg>/') #限定參數類型爲string 默認就是字符串 @app.route('/argtype/<path:arg>/') #其實path就是string 可是path會將路由地址後面的全部的路由或者值都認爲是一個值 /不在做爲分隔符來使用 def argtype(arg): print(type(arg)) print(arg) return '獲取參數類型的視圖函數'
注意
@app.route('/response/') def res(): return '我是響應',404 #響應一個指定標準的狀態碼
from flask import make_response
@app.route('/make_response/') def makeResponse(): res = make_response('我是響應的內容') # res = make_response('我是響應的內容',404) return res
做用: 從一個地址跳向另一個地址
導入
from flask import redirect
實例
@app.route('/') def index():#處理當前請求的函數 return 'Hello Flask' #重定向 @app.route('/redirect/') def redirect_index(): return redirect('/') #參數爲路由地址 return redirect('/argtype/redirect_index/') #帶參數路由地址的重定向
導入
from flask import redirect,url_for
實例
@app.route('/redirect/') def redirect_index(): url = url_for('test') url = url_for('getarg',name='zhangsan',age=18) #帶多個參數 #@app.route('/arg/<name>_<age>/') #def getarg(age,name): return url #/test/
注意:
若是給定的視圖函數名稱不存在 則拋出異常
@app.route('/redirect/') def redirect_index(): return redirect(url_for('test')) return redirect(url_for('getarg',name='zhangsan',age=18)) #帶多個參數
概念:
在視圖函數中處理的時候 可使用abort拋出指定狀態碼的錯誤 下面代碼不在執行
須要拋出標準http的狀態碼
from flask import abort
實例
@app.route('/abort/') def my_abort(): # abort(404) # abort(500) return '拋出狀態碼' #捕獲500的錯誤 @app.errorhandler(500) def server_error(e): return '如今能看到了嗎{}'.format(e) #捕獲404的錯誤信息 @app.errorhandler(404) def server_error(e): return '您訪問的頁面被外星人劫持走了!!!'
參數 | 參數說明 | 默認值 |
---|---|---|
host | 主機名 | 127.0.0.1 |
port | 端口號 | 5000 |
debug | 調試 | False |
threaded | 多線程 | False |
實例
if __name__ == '__main__': # app.run(debug=True) #開啓調試模式 app.run(host='0.0.0.0',port=5001,debug=True,threaded=True)
說明:
request是由flask框架爲咱們提供好的對象 使用時 只要導入便可
用戶在請求的時候 框架會爲當前請求的用戶 建立一個request(請求的對象) 包含當前用戶請求的全部信息
導入
from flask import request
實例
@app.route('/request/') def get_request(): print('用戶請求的完整的url',request.url) print('去除get傳參後的url',request.base_url) print('只有主機和端口號的url',request.host_url) print('獲取請求的路由地址',request.path) print(' 請求的方法',request.method) print('獲取拼湊的get傳參',request.args) print('獲取拼湊的get傳參',request.args.get('name')) print('獲取拼湊的get傳參',request.args.get('age')) print('獲取表單傳遞過來的數據',request.form) print('獲取文件上傳過來的數據',request.files) print('獲取用戶請求過來的頭信息',request.headers) print('獲取用戶請求過來的全部cookie',request.cookies) print('獲取用戶請求過來的json數據',request.json) return 'request對象'
cookie
response.set_cookie( key, #設置鍵 value,#設置值 max_age=None, #過時時間 path = '/' #當前cookie的存儲路徑 )
@app.route('/get_cookie/') def get_cookie(): print(request.cookies) return request.cookies.get('name','default默認值')
#清除cookie @app.route('/del_cookie/') def del_cookie(): res = make_response('清除cookie') res.delete_cookie('name') return res
cookie存儲值爲明文存儲 安全性低
cookie存在客戶端(瀏覽器中)
cookie默認存活時間爲 當前瀏覽結束(關閉當前的瀏覽器)
session的使用 須要一個secret_key 來進行加密產生加密的字符串
app.config['SECRET_KEY'] = 'secretkey'
會給cookie設置一個惟一的標識符 sessionId 服務器端會經過cookie攜帶着惟一的sessionId來區分是哪個用戶的請求 若是客戶端的cookie被禁用了 那麼服務器端的session將沒法使用 session基於cookie
#設置session @app.route('/set_session/') def set_session(): 默認存活當前瀏覽器結束 session['username'] = '張三' return '設置session'
#設置session @app.route('/set_session/') def set_session(): session.permanent = True #設置session持久化存儲 #設置當前session的存活時間60秒 若是當前設置失敗 那麼存活時間爲1月 app.permanent_session_lifetime = timedelta(seconds=60) session['username'] = '張三' return '設置session'
#獲取session @app.route('/get_session/') def get_session(): return session.get('username','default默認值')
@app.route('/del_session/') def del_session(): #刪除 key爲username的session session.pop('username') #刪除全部session # session.clear() return '刪除session'
簡介:
就是一個flask終端運行的解析器 經過不一樣參數 來設置flask的啓動項
安裝
sudo pip3 install flask-script
使用
from flask_script import Manager #導入終端運行的解析器 app = Flask(__name__) manager = Manager(app) ... if __name__ == '__main__': manager.run()
-h | 主機 |
---|---|
-p | 端口號 |
-d | 調試 |
-r | 從新加載 |
-threaded | 多線程 |
python manage.py runserver -hpython manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded
python manage.py runserver -d -r
概述
當全部代碼越愛越多的時候 在manage.py中 很明顯是不合理的 咱們須要將不一樣功能的視圖函數 存放在不一樣的文件中 使用咱們的項目的目錄結構更加的清晰
使用
from flask import Blueprint user = Blueprint('user',__name__) @user.route('/login/') def login(): return '登陸'
from mysession import mysession from user import user #http://127.0.0.1:5000/login/ app.register_blueprint(user) #註冊藍本 #http://127.0.0.1:5000/user/login/ app.register_blueprint(user,url_prefix='/user') #註冊藍本並添加前綴
@app.route('/') def index(): # return '首頁' return redirect('/user/login/') return redirect(url_for('user.login')) #使用url_for反向構造出路由的時候 須要指定當前的視圖函數 是哪個藍本對象的
在manage文件中使用
鉤子函數 | 功能描述 |
---|---|
before_first_request | 第一次請求以前 |
before_request | 每次請求以前 |
after_request | 每次請求以後 沒有異常 |
teardown_request | 每次請求以後 即便有異常出現 |
實例
@app.before_first_request def before_first_request(): print('before_first_request') @app.before_request def before_request(): print('before_request') if request.method == 'GET' and request.path == '/form/': abort(500) @app.after_request def before_request(r): print('before_request',r) return r @app.teardown_request def teardown_request(r): print('teardown_request') return r
鉤子函數 | 功能描述 |
---|---|
before_app_first_request | 第一次請求以前 |
before_app_request | 每次請求以前 |
after_app_request | 每次請求以後 沒有異常 |
teardown_app_request | 每次請求以後 即便有異常出現 |
實例
@user.before_app_first_request def before_first_request(): print('before_first_request') @user.before_app_request def before_request(): print('before_request') if request.method == 'GET' and request.path == '/form/': abort(500) @user.after_app_request def after_request(r): print('after_request',r) return r @user.teardown_app_request def teardown_request(r): print('teardown_request') return r
注意:
鉤子函數寫在藍本或者啓動文件中 均可以捕獲到全部的請求和響應(同樣)一個flask中只須要寫一個鉤子函數而不須要重複寫鉤子函數