flask3

2019.7.12 flask3

1 . CBV - FBV

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

2 從頭至尾複習 Flask

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來的,會一個都能用

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息