Http請求方式 8種html
class Login(views.MethodView): def get(self): pass def post(self): #增 pass def delete(self): #刪 pass def put(self): #更新 改 pass
另外四個(不是很重要)redis
def options(self): #請求跨域 , 不同的話 pass #header trace patch
route本質上 執行 app.add_url_rule()django
views.py --> view -->def as_view() : #name - 'login'json
def view(*args, **kwargs): #閉包 self = view.view_class(*class_args,**class_kwargs) view - func if cls.decorators: #沒有 #decorators = [a,b,c,d] 能夠寫到 class Login ... #執行任一個函數,都通過這個裝飾器 view.view_class = cls #Login view.__name__ = name view.__doc__ = cls.__doc__ #註釋"""woshi ..lei""" view.__module__ = clas.__module__ view.m = cls.methods view.pro_a_o = cls.p_a_o #view.__name = 'login' #view_class = Login #methods = None 發起login請求 app.add_url_rule('/login',endpoint=None,view_func=Login.as_view(name='login')) #name 填充 endpoint 有值就沒用了 先執行裏面的函數 if end is None: e = e_f_v_fu(view_func) #沒有值給他name的 name必填 options['end']=endpoint 有值 就是給了 app.py
def view(*,**)flask
self = view.view_class(*c_a,**c_k) return self.d_r(*a,**kw)
view.py --> def init跨域
super if 'method' not in d: set() for base in bases: for key in http_method_funcs: if hasattr(cls,key): methods.add(key.upper()) if methods : cls.methods = methods 類裏的方法(請求方式) 沒有在http_method_funcs def gets(): 改源碼.... 的h_m_f
dispatch_request(self,*a,**kw):cookie
meth = getattr(self,request.method_lower(),None) #get return meth(*a,**kw) #get
昨天
methods = getattr(view None) or GET #獲得GET 爲空session
Flask 優點:閉包
輕量級框架,擴展性,三方組件全app
Flask 劣勢:
過輕了,只有一個Session,組件是第三方的,穩定性相對較差(小夥伴都長大了)
連session都給了客戶端的了
pip3 install Flask
Jinja2 模塊語言 (也是一個包)
Flask 源碼
MarkupSafe 處理標籤語言 render_template
Werkzeug ~~ UWSGI(差很少) 本質都是WSGI (1更輕 2 穩定) 德語工具的意思
app.run run點進去 form - = ~.serving import run_simple try : run_simple #本質上就是執行這個
1 啓動Flask
from flask import Flask app = Flask(\__name__) app.run('0.0.0.0',9527) #機器全部的ip 127.0.0.1: 只能本級訪問本機
2 路由視圖
@app.route('/index',methods=['GET','post'])#默認是get的元祖,覆蓋 def index(): return 'hello'
methods 當前路由容許的請求方式
endpoint Mapping -> '/index' {'index':index}
% 元祖增刪改查:
改:tu = (1,2,3,4) --> 改爲列表 tu_l = list(tu) tu_l.append(5) tu = tuple(tu_l)
3 FlaskResponse
1 render_template(.html) #response本質上 2 redirect('/login') 3 '' #django 要寫Httpresponse 4 jsonify # response headers: content-type:application/json -Flask 1.1.1 新特性 能夠直接返回dict類型 - 本質上就是在jsonify({'k':1}) 5 send_file #自動打開並返回文件內容識別文件類型 contype-type:文件類型
4 FlaskRequest
from flask import request #公共變量 LoaclProxy 對象 request.POST.get() == request.form.get() -> .to_dict() #類裏面若是有兩個單詞 會駝峯寫 有的會下劃線分割 統計下 request.GET.get() == request.args.get() -> .to_dict() request.json # 請求頭中帶有content-type: application/json request.data # content-type 沒法被識別 或者是 沒有Form request.files.get() 獲取文件 request.method request.headers request.cookie request.path request.url request.host request.host_url
5 Session
form flask import Session app.secret_key = '#%#^^^$#$' def vf(): session['name'] = 1 存儲在Cookies中 序列化 -{name:1} -> secret_key + 時間 + 簽名 -> 生成一個字符串 -> SESSION_COOKIE_NAME : '生成一個字符串' 反列化 - SESSION_COOKIE_NAME : '生成一個字符串' -> -> secret_key + 時間 + 簽名 ->{name:1}
6 Flask配置
1 初始化 - app = Flask(__name__) templates_folder #模板存放 static_folder #靜態文件存放 static_url_path #靜態文件訪問 2 Config Flask 對象配置 Flask.default_config #獲取默認配置 #改了裏面的東西沒用 DEBUG 重啓 日誌級別 開發/線上 透傳 TESTING SESSION_COOKIE_NAME SECRET_KEY class DebugSetting(object): DEBUG = True SESSION_COOKIE_NAME = 'i am not session' SECRET_KEY = "#%&@*%&#" Flask.config.form_obj() ---> Flask.config['DEBUG'] = True
7 藍圖 ('bpname',__name__)
from flask import Blueprint 不能被run的Flask實例,沒有config 藍圖做用 - app隔離 , URL管理 #Alexander.DSB.Li userBP = Blueprint('userBP',__name__,url_prefix='/user') @userBP.route('/userBP') def user_bp(): return '' 思考: 如何在藍圖中使用 CBV 結構
8 特殊裝飾器
1 before_request #進入視圖函數以前 2 after_request #結束視圖函數以後,響應客戶端以前 3 errorhandler(HTTP_ERROR_CODE) #5xx 4xx 重定義錯誤信息 be + af 實現中間件: 正常週期:be1 be2 - vf - af2 - af1 異常週期:be1 - vf - af1
@app.template_global #全局裝飾器 def ab(a,b): return a+b
9 CBV
from flask import views class Login(views.MethodView): methods = [] def get(self): #知足http1.0協議 8 請求 #反射拿到各類方法,放到methods裏 pass def post(self): pass Flask.add_url_rule(rule='/login',endpoint=None,view_func=Login.as_view(name='login')))
Flask-Session
本身看的話以爲複雜?認知太少了
Session(app) app.session_interface = self._get_in(app) def _get_inter(app): #app = Flask(__name__) config = app.config.copy() #淺copy config.setdefault('SESSION_TYPE', 'null') #有則不變,無則改之 default_沒有都設置了
redis不要被暴露在外網中,防止黑客修改
session 存的id 1111 open_session #序列化 save_session : 反序列化
get session:u58430-842395304583950-3283 #get(key+sid) #鍵
先給配置
flask_session 讀取 配置 吸收配置 改配置
全部的flask第三發組件 都是須要 app.config 不但須要吸收配置項還要修改
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(host = '127.0.0.1',port=6527,db=6)
Session(app) #Flask-Session 讀取config配置 改寫app中的sessions-interface
from flask import
Flask-Session Flask-CORS Flask-WTF Flask-SQLAlchemy ORM #全部的三方應用都是基於config來的,會一個都能用